[{"data":1,"prerenderedAt":468},["ShallowReactive",2],{"msfe-doc:\u002Fapi\u002Frendering":3},{"id":4,"title":5,"body":6,"description":456,"extension":457,"keywords":458,"locale":459,"meta":460,"navigation":461,"order":462,"path":463,"section":464,"seo":465,"stem":466,"__hash__":467},"docs\u002Fapi\u002Frendering.zh-CN.md","渲染与宿主 API",{"type":7,"value":8,"toc":439},"minimark",[9,13,17,67,119,125,139,161,164,186,223,237,251,254,261,265,268,271,274,277,280,283,286,289,292,295,298,301,304,311,314,317,320,323,326,329,332,354,357,360,382,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430,433,436],[10,11,12],"p",{},"本页签名从公共包导出生成，中文说明与当前 JSDoc 同步校验。代码标识保持原名。",[14,15,16],"h2",{"id":16},"源码显露",[10,18,19,23,24,27,28,27,31,27,34,37,38,41,42,44,45,48,49,51,52,54,55,58,59,62,63,66],{},[20,21,22],"code",{},"readSourcePresentation(state)"," 返回 ",[20,25,26],{},"mode","、",[20,29,30],{},"selection",[20,32,33],{},"reveal",[20,35,36],{},"composing"," 与 ",[20,39,40],{},"selecting","。\n",[20,43,30],{}," 是呈现使用的稳定选区，拖选期间可能与实时 ",[20,46,47],{},"state.selection"," 不同。\n",[20,50,33],{}," 为 ",[20,53,30],{},"（普通 MSFE 默认）或 ",[20,56,57],{},"hidden","；后者让已识别的语法在编辑中保持投影。\n内置投影与组件的 ",[20,60,61],{},"ProjectionContext.active"," 已结合此策略，扩展优先使用 ",[20,64,65],{},"active"," 判断，\n不要自行读取实时光标后强制显露。纯源码模式始终显示原文。",[10,68,69,72,73,76,77,80,81,84,85,88,89,92,93,96,97,100,101,104,105,108,109,112,113,118],{},[20,70,71],{},"sourceRevealSetting"," 是公开 ",[20,74,75],{},"PresentationSetting\u003CSourceRevealPolicy>","：通过\n",[20,78,79],{},"addCodeMirrorExtensions()"," 安装 ",[20,82,83],{},"sourceRevealSetting.extension(() => 'hidden')","，再用\n",[20,86,87],{},"sourceRevealSetting.set(editor, 'selection')"," 提交呈现请求。",[20,90,91],{},"read(state)"," 返回已应用值，\n",[20,94,95],{},"requested(state)"," 返回最近请求，未安装时都返回 ",[20,98,99],{},"undefined","。setter 返回 ",[20,102,103],{},"MsfeResult","，\n未安装时为 ",[20,106,107],{},"not-installed","，无效值为 ",[20,110,111],{},"invalid-change","；销毁或未挂载时也会拒绝。\n请求不改变权限或源码，拖选与组合输入期间延迟生效。产品用户优先使用\n",[114,115,117],"a",{"href":116},"\u002Fguide\u002Fmd-editor#%E5%9B%9B%E7%A7%8D%E8%A7%86%E5%9B%BE","MD Editor 的 view","。",[10,120,121,122,124],{},"直接创建的替换范围在 ",[20,123,57],{}," 下参与原子导航，避免光标进入不可见语法。\n未知\u002F不完整内容应继续显示源码；请勿用 CSS 让无投影合同的文本消失。",[10,126,127,130,131,134,135,138],{},[20,128,129],{},"sourceRevealResolver.of(resolveOwner)"," 是宿主可安装的 CodeMirror facet。\n",[20,132,133],{},"resolveOwner(state, range)"," 返回包含原片段的规范源码范围，用来将行内标记归入段落、列表项\n或单元格；范围必须是文档内的整数坐标，否则抛出 ",[20,136,137],{},"invalid-source-reveal-owner","。\n不安装时保留节点自身的显露范围。解析函数应只查询局部语法祖先，不读取全文、修改选区或提交事务。\nMD Editor 已安装此策略，自定义节点、规范化替换和组件高度共用它。",[10,140,141,142,144,145,148,149,152,153,156,157,160],{},"内置投影继续读取 ",[20,143,61],{},"。独立 CodeMirror 插件使用\n",[20,146,147],{},"isSourceRevealed(state, { from, to })"," 查询同一策略；它同时检查模式、隐藏偏好和拖选稳定选区。\n",[20,150,151],{},"isSourceActive(selection, from, to)"," 只做范围相交判断，不应用宿主范围或模式。\n规范化替换的 ",[20,154,155],{},"revealRange"," 先表示完整片段，再由 resolver 归入宿主语义范围；\n",[20,158,159],{},"interaction: 'atomic'"," 的替换仍保留显式原子交互。",[14,162,163],{"id":163},"可选输入代理",[10,165,166,169,170,173,174,177,178,181,182,185],{},[20,167,168],{},"sourceInputProxy({ mediaQuery, modes?, revealMargin?, onSelectionTap? })"," 返回可安装的 CodeMirror extension，默认仅在\n",[20,171,172],{},"live"," 模式匹配宿主窗口媒体条件时启用。MD Editor 已为窄屏触摸设备安装，不需宿主重复安装。\n它复用 ",[20,175,176],{},"@quirekit\u002Fime","，把可编辑 textarea 放到当前 Document\u002FShadowRoot 的独立输入层；\n正文只负责展示，文档、选区、源码规则和撤销仍使用原 CM state。取消 preedit 不删除选区，\n确认只写一笔事务；权限收回、文档替换和卸载释放 native host。\n可选 ",[20,179,180],{},"onSelectionTap(view, point)"," 返回 true 时，宿主已处理已有选区的短按，代理不移动\ncaret、不重新 focus；触摸结束与兼容 click 只接受一次。MD Editor 用它切换选区操作菜单。\n代理有效期间原生 Selection 不得持有非 editable 正文范围，独立嵌入控件仍保留自己的选区。\n",[20,183,184],{},"revealMargin"," 指定 caret 揭示时额外保留的 client CSS 空间，默认 8px；MD Editor 使用\n32px，为圆点及触摸热区留出空间。它不改变源位置或文档布局。",[10,187,188,191,192,27,195,198,199,202,203,206,207,210,211,214,215,218,219,222],{},[20,189,190],{},"editor.focus()"," 会选择当前输入 owner。使用 CM escape hatch 的自定义控件应使用\n",[20,193,194],{},"focusSourceView(view)",[20,196,197],{},"sourceInputHasFocus(view)"," 和 ",[20,200,201],{},"sourceInputElement(view)","，不能假定\n",[20,204,205],{},"view.hasFocus"," 或 ",[20,208,209],{},"contentDOM"," 代表移动键盘焦点。",[20,212,213],{},"sourceInputFocusChanged(update)"," 同时报告\n原生与代理的逻辑焦点变化。几何阶段可用 ",[20,216,217],{},"sourceInputCaret(view)"," 读取当前 preedit 尾端的\nclient CSS 矩形；没有 preedit 时返回 null，继续使用 ",[20,220,221],{},"coordsAtPos","。禁止每帧 focus 或清除输入。",[10,224,225,228,229,232,233,236],{},[20,226,227],{},"sourceInputPosition(view, { x, y })"," 接受 client CSS 命中，跳过原子替换内部与零高度源行，\n将间隙吸附到最近两侧的可见边界；无法证明挂载可见时返回 null，应保留上一个端点。\n不要再直接把 ",[20,230,231],{},"posAtCoords"," 的隐藏位置提交为移动端选区。\n",[20,234,235],{},"sourceCaretRect(view, pos, side?)"," 只返回具有真实行框的 mounted caret；首选关联侧\n不可见时尝试另一侧，避免围栏\u002F标题边界丢失光标。正常只读一侧，边界最多两侧；无几何时返回 null。",[10,238,239,242,243,246,247,250],{},[20,240,241],{},"sourceViewport(view)"," 在几何阶段读取 VisualViewport、裁剪祖先和 CM scrollMargins 的\n可用区域，含 offsetTop；键盘与 dock 不重复计数。",[20,244,245],{},"sourceScrollStep(view, delta)"," 只测量\n最近可滚动祖先的一次垂直推进，耗尽后交给外层页面；",[20,248,249],{},"applySourceScrollStep(step)"," 在写阶段\n执行该测量，不改变源或选区。连续拖选由消费方保留一个活动帧并重算最新端点，必须在松手、\n取消、权限\u002F模式变化和销毁时停止。代理短按、实际输入与视口 resize 会按同一边界揭示 caret；\n普通手动滚动和仅恢复程序焦点不会建立持续导航锚点。已挂载的 nearest caret-scroll\n委托同一揭示 owner，避免竞争滚动；可见输入零滚动写入。键盘变化时若末尾空间尚未更新，\n最多八次测量等待可用布局，端点可见即结束，新的用户滚动仍立即取消。",[14,252,253],{"id":253},"投影声明",[10,255,256,257,118],{},"跨行预览使用 block；可操作示例见 ",[114,258,260],{"href":259},"\u002Fextensions\u002Fdiagrams","图表",[262,263],"msfe-api",{"name":264},"ProjectionLayer",[14,266,267],{"id":267},"规范输入",[10,269,270],{},"查询有界语义，不在构建期间提交事务。",[262,272],{"name":273},"ProjectionInput",[14,275,276],{"id":276},"视图描述",[10,278,279],{},"稳定 renderer 与不可变 props 形成可保留的组件描述。",[262,281],{"name":282},"componentView",[14,284,285],{"id":285},"挂载上下文",[10,287,288],{},"scope 是当前组件生命周期；几何变化后请求测量。",[262,290],{"name":291},"ComponentViewMount",[14,293,294],{"id":294},"保留与清理",[10,296,297],{},"更新复用原入口，销毁释放宿主创建的所有资源。",[262,299],{"name":300},"ComponentViewHandle",[14,302,303],{"id":303},"代码语言",[10,305,306,307,118],{},"完整惰性加载目录见 ",[114,308,310],{"href":309},"\u002Fextensions\u002Fcode-blocks","代码块",[262,312],{"name":313},"CodeLanguage",[14,315,316],{"id":316},"搜索面板",[10,318,319],{},"组件使用 view 属性，替换动作必须考虑权限和组合输入。",[262,321],{"name":322},"SearchPanelProps",[14,324,325],{"id":325},"预览配置",[10,327,328],{},"Math、Mermaid 与 TextDiagrams 的公开配置用于宿主操作组件。",[262,330],{"name":331},"PreviewOptions",[10,333,334,337,338,341,342,345,346,349,350,118],{},[20,335,336],{},"edit"," 可将预览的编辑操作交给共享公式面板等宿主 UI。请求已经过目标和权限校验；\n若异步保留草稿，须另行 ",[20,339,340],{},"captureAnchor(range)","，确认时检查 ",[20,343,344],{},"anchor.target()","，关闭时\n释放锚点。返回 ",[20,347,348],{},"true"," 表示接管成功；不配置时沿用源码显露。见 ",[114,351,353],{"href":352},"\u002Fguide\u002Fmd-editor","MD Editor",[262,355],{"name":356},"PreviewEditRequest",[14,358,359],{"id":359},"预览操作",[10,361,362,363,366,367,369,370,373,374,377,378,381],{},"PlantUML\u002FDOT 可由 ",[20,364,365],{},"TextDiagrams"," 安装并复用同一 ",[20,368,331],{},"、编辑回调与取消生命周期。公共中立接口 ",[20,371,372],{},"renderTextDiagram(language, source, options)"," 位于 ",[20,375,376],{},"@quirekit\u002Ftext-diagram\u002Fbrowser","，返回绑定精确语言与源码的净化 SVG 快照；",[20,379,380],{},"rasterizeTextDiagram(snapshot, ownerDocument, signal)"," 生成同一快照的 PNG。MD Editor 三语言预览、共享源码面板和 Word 图片导出使用这条路径。",[10,383,384,387],{},[20,385,386],{},"renderMermaidSvg()"," 在浏览器中从源码生成清理后的静态 SVG，与编辑器预览共用 Mermaid\n串行队列和安全配置。宿主传入取消信号与字体，可继续转成 PNG 用于文件导出；该函数不读取\n编辑器 DOM，不注册 SVG 事件，也不允许外部图片或样式资源。",[262,389],{"name":390},"renderMermaidSvg",[262,392],{"name":393},"PreviewTypography",[10,395,396],{},"处理加载、错误、重试和源码显露。",[262,398],{"name":399},"PreviewControlProps",[14,401,402],{"id":402},"图片资源",[10,404,405],{},"源码地址先经过字段校验，再交给宿主 resolver。",[262,407],{"name":408},"ImageOptions",[14,410,411],{"id":411},"块控制协议",[10,413,414],{},"核心管理原生命中、指针生命周期和版本化事务，宿主管理组件渲染。嵌套子流须显式声明。指针更新只查询局部祖先路径，松手或执行菜单动作时才运行命令。",[262,416],{"name":417},"SourceBlockScopeResolver",[262,419],{"name":420},"sourceBlockScopes",[262,422],{"name":423},"createSourceBlockControls",[262,425],{"name":426},"SourceBlockControlsOptions",[262,428],{"name":429},"SourceBlockControls",[262,431],{"name":432},"SourceInsertionControls",[262,434],{"name":435},"SourceBlockRect",[262,437],{"name":438},"SourceBlockDrop",{"title":440,"searchDepth":441,"depth":441,"links":442},"",2,[443,444,445,446,447,448,449,450,451,452,453,454,455],{"id":16,"depth":441,"text":16},{"id":163,"depth":441,"text":163},{"id":253,"depth":441,"text":253},{"id":267,"depth":441,"text":267},{"id":276,"depth":441,"text":276},{"id":285,"depth":441,"text":285},{"id":294,"depth":441,"text":294},{"id":303,"depth":441,"text":303},{"id":316,"depth":441,"text":316},{"id":325,"depth":441,"text":325},{"id":359,"depth":441,"text":359},{"id":402,"depth":441,"text":402},{"id":411,"depth":441,"text":411},"投影层、组件挂载、语言、搜索以及图表操作协议。","md",[264,273,282,291,300,313,322,331,399,408],"zh-CN",{},true,5,"\u002Fapi\u002Frendering","API 参考",{"title":5,"description":456},"api\u002Frendering.zh-CN","2QvjM9iHgqWzcNeTql7jqXBIDl0CyD-tlF4-7UFEqLo",1793046311417]