[{"data":1,"prerenderedAt":720},["ShallowReactive",2],{"msfe-doc:\u002Fextensions\u002Fmarkdown-plugins":3},{"id":4,"title":5,"body":6,"description":708,"extension":709,"keywords":710,"locale":713,"meta":714,"navigation":205,"order":189,"path":715,"section":716,"seo":717,"stem":718,"__hash__":719},"docs\u002Fextensions\u002Fmarkdown-plugins.zh-CN.md","Markdown 插件",{"type":7,"value":8,"toc":697},"minimark",[9,13,87,102,105,109,119,357,373,386,404,426,432,435,438,445,449,453,484,505,518,522,545,623,638,642,653,657,676,693],[10,11,12],"h2",{"id":12},"先区分三类插件",[14,15,16,32],"table",{},[17,18,19],"thead",{},[20,21,22,26,29],"tr",{},[23,24,25],"th",{},"能力",[23,27,28],{},"MSFE 入口",[23,30,31],{},"是否改源码",[33,34,35,51,71],"tbody",{},[20,36,37,41,48],{},[38,39,40],"td",{},"新语法识别",[38,42,43,47],{},[44,45,46],"code",{},"addMarkdownExtensions()"," 的 Lezer Markdown 扩展",[38,49,50],{},"否",[20,52,53,56,68],{},[38,54,55],{},"已有语法的组件和视觉效果",[38,57,58,61,62,61,65],{},[44,59,60],{},"addSource()","、",[44,63,64],{},"addNodeView()",[44,66,67],{},"addProjectionLayers()",[38,69,70],{},"渲染本身不改",[20,72,73,76,84],{},[38,74,75],{},"输入和粘贴时替换文本",[38,77,78,61,81],{},[44,79,80],{},"InputRule",[44,82,83],{},"PasteRule",[38,85,86],{},"是，参与事务和历史",[88,89,90,93,94,97,98,101],"p",{},[44,91,92],{},"markdown-it"," 插件接受 token 流、规则链和 HTML renderer；MSFE 使用 Lezer 的增量语法树。这两种协议不同，不能把 ",[44,95,96],{},"md.use(plugin)"," 的插件对象直接放进 ",[44,99,100],{},"extensions","。可以在隔离的非编辑预览中使用第三方渲染库，但解析、源码范围和写回仍需自己接入。",[10,103,104],{"id":104},"一个真实的解析插件",[106,107,108],"h3",{"id":108},"可选文档属性",[88,110,111,114,115,118],{},[44,112,113],{},"Frontmatter"," 只识别源码。只有显式安装 ",[44,116,117],{},"DocumentProperties"," 才会将文首 YAML 显示成属性表；\nMD Editor 默认不安装它。Vue 宿主可以复用公共编辑面板：",[120,121,126],"pre",{"className":122,"code":123,"language":124,"meta":125,"style":125},"language-vue shiki shiki-themes github-light github-light github-dark","\u003Cscript setup lang=\"ts\">\nimport { MdEditor, MdDocumentProperties } from '@quirekit\u002Fmd-editor\u002Fvue'\nimport { DocumentProperties } from '@quirekit\u002Fmsfe-markdown-extras'\nimport { VueComponentViewRenderer } from '@quirekit\u002Fmsfe-vue'\n\nconst extensions = [DocumentProperties.configure({\n  render: VueComponentViewRenderer(MdDocumentProperties), locale: 'zh-CN',\n  defaultCollapsed: true,\n})]\nconst markdown = '---\\ntitle: 示例\\ntags: [写作, 编辑]\\n---\\n\\n正文'\n\u003C\u002Fscript>\n\u003Ctemplate>\u003CMdEditor :markdown=\"markdown\" :extensions=\"extensions\" \u002F>\u003C\u002Ftemplate>\n","vue","",[44,127,128,158,174,187,200,207,229,247,258,264,299,309],{"__ignoreMap":125},[129,130,133,137,141,145,148,151,155],"span",{"class":131,"line":132},"line",1,[129,134,136],{"class":135},"sVPnS","\u003C",[129,138,140],{"class":139},"su0ou","script",[129,142,144],{"class":143},"sgQzM"," setup",[129,146,147],{"class":143}," lang",[129,149,150],{"class":135},"=",[129,152,154],{"class":153},"s-HEn","\"ts\"",[129,156,157],{"class":135},">\n",[129,159,161,165,168,171],{"class":131,"line":160},2,[129,162,164],{"class":163},"sDD9d","import",[129,166,167],{"class":135}," { MdEditor, MdDocumentProperties } ",[129,169,170],{"class":163},"from",[129,172,173],{"class":153}," '@quirekit\u002Fmd-editor\u002Fvue'\n",[129,175,177,179,182,184],{"class":131,"line":176},3,[129,178,164],{"class":163},[129,180,181],{"class":135}," { DocumentProperties } ",[129,183,170],{"class":163},[129,185,186],{"class":153}," '@quirekit\u002Fmsfe-markdown-extras'\n",[129,188,190,192,195,197],{"class":131,"line":189},4,[129,191,164],{"class":163},[129,193,194],{"class":135}," { VueComponentViewRenderer } ",[129,196,170],{"class":163},[129,198,199],{"class":153}," '@quirekit\u002Fmsfe-vue'\n",[129,201,203],{"class":131,"line":202},5,[129,204,206],{"emptyLinePlaceholder":205},true,"\n",[129,208,210,213,217,220,223,226],{"class":131,"line":209},6,[129,211,212],{"class":163},"const",[129,214,216],{"class":215},"sUNQB"," extensions",[129,218,219],{"class":163}," =",[129,221,222],{"class":135}," [DocumentProperties.",[129,224,225],{"class":143},"configure",[129,227,228],{"class":135},"({\n",[129,230,232,235,238,241,244],{"class":131,"line":231},7,[129,233,234],{"class":135},"  render: ",[129,236,237],{"class":143},"VueComponentViewRenderer",[129,239,240],{"class":135},"(MdDocumentProperties), locale: ",[129,242,243],{"class":153},"'zh-CN'",[129,245,246],{"class":135},",\n",[129,248,250,253,256],{"class":131,"line":249},8,[129,251,252],{"class":135},"  defaultCollapsed: ",[129,254,255],{"class":215},"true",[129,257,246],{"class":135},[129,259,261],{"class":131,"line":260},9,[129,262,263],{"class":135},"})]\n",[129,265,267,269,272,274,277,280,283,285,288,290,293,296],{"class":131,"line":266},10,[129,268,212],{"class":163},[129,270,271],{"class":215}," markdown",[129,273,219],{"class":163},[129,275,276],{"class":153}," '---",[129,278,279],{"class":215},"\\n",[129,281,282],{"class":153},"title: 示例",[129,284,279],{"class":215},[129,286,287],{"class":153},"tags: [写作, 编辑]",[129,289,279],{"class":215},[129,291,292],{"class":153},"---",[129,294,295],{"class":215},"\\n\\n",[129,297,298],{"class":153},"正文'\n",[129,300,302,305,307],{"class":131,"line":301},11,[129,303,304],{"class":135},"\u003C\u002F",[129,306,140],{"class":139},[129,308,157],{"class":135},[129,310,312,314,317,320,323,326,329,331,334,336,338,340,342,344,346,348,350,353,355],{"class":131,"line":311},12,[129,313,136],{"class":135},[129,315,316],{"class":139},"template",[129,318,319],{"class":135},">\u003C",[129,321,322],{"class":139},"MdEditor",[129,324,325],{"class":135}," :",[129,327,328],{"class":143},"markdown",[129,330,150],{"class":135},[129,332,333],{"class":153},"\"",[129,335,328],{"class":135},[129,337,333],{"class":153},[129,339,325],{"class":135},[129,341,100],{"class":143},[129,343,150],{"class":135},[129,345,333],{"class":153},[129,347,100],{"class":135},[129,349,333],{"class":153},[129,351,352],{"class":135}," \u002F>\u003C\u002F",[129,354,316],{"class":139},[129,356,157],{"class":135},[88,358,359,360,362,363,365,366,368,369,372],{},"MD Editor 已包含 ",[44,361,113],{},"；直接使用 MSFE Core 时须在 ",[44,364,100],{}," 中同时加入\n",[44,367,113],{},"。不传 ",[44,370,371],{},"render"," 时提供原生属性展示和查看源码入口。",[88,374,375,378,379,381,382,385],{},[44,376,377],{},"setDocumentPropertiesEnabled(editor, false)"," 可恢复原始 Frontmatter，",[44,380,255],{}," 再次启用，\n不重建编辑器、不清空撤销、不改正文和选区。用 ",[44,383,384],{},"documentPropertiesEnabled(editor.state)","\n读取实际状态。示例页的“文档属性”开关使用这个公共接口。",[88,387,388,391,392,395,396,399,400,403],{},[44,389,390],{},"defaultCollapsed: true"," 让属性区初始只显示标题和数量，适合优先展示正文的产品；\n省略或设为 ",[44,393,394],{},"false"," 时默认展开。此配置同时适用于 Vue 面板与默认原生渲染器。\n用户手动切换后，同一文档内的编辑、模式切换、投影开关和视口重挂载都会保留选择；\n",[44,397,398],{},"replaceDocument"," 加载另一篇文档时重新使用默认值。",[44,401,402],{},"enabled: false"," 会显示原 YAML，\n与折叠属性区不同。跨会话记忆可由宿主保存，并作为下一次安装的默认值。",[88,405,406,407,410,411,414,415,417,418,421,422,425],{},"运行时可通过 ",[44,408,409],{},"documentPropertiesCollapsed(editor.state)"," 读取、\n",[44,412,413],{},"setDocumentPropertiesCollapsed(editor, true)"," 收起，",[44,416,394],{}," 展开；自定义渲染器使用\n",[44,419,420],{},"view.collapsed"," 与 ",[44,423,424],{},"view.setCollapsed()","。只读模式也能折叠，不改变编辑权限。",[88,427,428,431],{},[44,429,430],{},"MdDocumentProperties"," 默认预览六个字段，长文本与标签列表可单独展开。\n点击字段值直接编辑，确认与取消保持同行；单行 Enter 保存，Escape 取消，多行可用\n⌘\u002FCtrl + Enter 保存。收起面板保留未保存草稿，展开状态不会写入 Markdown。",[88,433,434],{},"字符串、数字、布尔和字符串列表可编辑，操作参与源码撤销。其他值展示原文；无效 YAML、\n重复键、别名、锚点、显式标签、行内或缩进根映射、显式或跨行键、TOML、未闭合或超过\n20,000 字符的头部回退源码。新增属性名始终编码为字符串键。\n写回只替换目标范围，保留其他字段、注释和空行；文档或头部已变化时拒绝过期表单。\n源码模式显示完整原文，编辑器只读时不提供修改控件。",[106,436,437],{"id":437},"自定义徽标",[88,439,440,441,444],{},"本例支持 ",[44,442,443],{},":badge[label]:","，保留可见分隔符并用主题色标记。未闭合、超长或含嵌套方括号的内容保持普通源码；代码 span 内的同样字符串不被当作徽标。",[446,447],"msfe-demo",{"name":448},"plugins\u002Feditor",[10,450,452],{"id":451},"_1-贡献语法","1. 贡献语法",[88,454,455,456,459,460,463,464,467,468,471,472,475,476,479,480,483],{},"依赖 ",[44,457,458],{},"@quirekit\u002Flezer-markdown","，使用 ",[44,461,462],{},"MarkdownExtension","。",[44,465,466],{},"plugins\u002Fsyntax.ts"," 的 ",[44,469,470],{},"defineNodes"," 注册 ",[44,473,474],{},"ExampleBadge","，",[44,477,478],{},"parseInline"," 在看到 ",[44,481,482],{},":"," 时先检查精确前缀，再在最多 82 个后续单元内寻找合法结束。",[88,485,486,489,490,493,494,463,497,500,501,504],{},[44,487,488],{},"context.elt()"," 创建与规范源码同坐标的语法元素，",[44,491,492],{},"addElement()"," 返回消费到的位置；不匹配返回 ",[44,495,496],{},"-1",[44,498,499],{},"before"," \u002F ",[44,502,503],{},"after"," 是解析规则顺序，不是视觉优先级。这个例子有意不支持嵌套；更复杂语法必须定义明确的块\u002F行内规则和回退。",[88,506,507,508,511,512,517],{},"简单的、不嵌套的单行字面分隔符可以直接使用 ",[44,509,510],{},"defineSource({ syntax })","，参考 ",[513,514,516],"a",{"href":515},"\u002Fextensions\u002Fcustom-node","状态节点","。不要为了简单 token 额外维护一个全文件解析器。",[10,519,521],{"id":520},"_2-接入语义查询","2. 接入语义查询",[88,523,524,526,527,529,530,463,533,536,537,540,541,544],{},[44,525,60],{}," 将已确认的 ",[44,528,474],{}," 解释为 ",[44,531,532],{},"{ label }",[44,534,535],{},"read()"," 只读匹配范围；需要可编辑字段时再增加 ",[44,538,539],{},"addAttributes()"," 的验证与 ",[44,542,543],{},"patch()","。语义层不需要渲染成 HTML。",[120,546,550],{"className":547,"code":548,"language":549,"meta":125,"style":125},"language-ts shiki shiki-themes github-light github-light github-dark","const query = editor.querySource('exampleBadge')\nif (query.status === 'ready') {\n  for (const match of query.matches) console.log(match.from, match.to, match.attrs)\n}\n","ts",[44,551,552,576,593,618],{"__ignoreMap":125},[129,553,554,556,559,561,564,567,570,573],{"class":131,"line":132},[129,555,212],{"class":163},[129,557,558],{"class":215}," query",[129,560,219],{"class":163},[129,562,563],{"class":135}," editor.",[129,565,566],{"class":143},"querySource",[129,568,569],{"class":135},"(",[129,571,572],{"class":153},"'exampleBadge'",[129,574,575],{"class":135},")\n",[129,577,578,581,584,587,590],{"class":131,"line":160},[129,579,580],{"class":163},"if",[129,582,583],{"class":135}," (query.status ",[129,585,586],{"class":163},"===",[129,588,589],{"class":153}," 'ready'",[129,591,592],{"class":135},") {\n",[129,594,595,598,601,603,606,609,612,615],{"class":131,"line":176},[129,596,597],{"class":163},"  for",[129,599,600],{"class":135}," (",[129,602,212],{"class":163},[129,604,605],{"class":215}," match",[129,607,608],{"class":163}," of",[129,610,611],{"class":135}," query.matches) console.",[129,613,614],{"class":143},"log",[129,616,617],{"class":135},"(match.from, match.to, match.attrs)\n",[129,619,620],{"class":131,"line":189},[129,621,622],{"class":135},"}\n",[88,624,625,626,629,630,633,634,637],{},"查询默认针对当前选区，可传显式有界范围。",[44,627,628],{},"pending"," 表示相关解析还未确认，不能误判为文档里不存在语法；",[44,631,632],{},"unsupported"," 表示该语义入口不可用。需要解析推进时使用 ",[44,635,636],{},"requestMarkdownParse(editor.state)","，再通过接受状态的通知重试，不在输入路径同步解析全文。",[10,639,641],{"id":640},"_3-选择视觉与写回","3. 选择视觉与写回",[88,643,644,645,648,649,652],{},"示例 inline 层只返回 ",[44,646,647],{},"mark","，并用 ",[44,650,651],{},"EditorView.theme()"," 设置颜色，不隐藏分隔符。需要点击控件时使用 NodeView；需要跨行结构替换时使用 block 层。只做显示的插件不要附带输入转换，避免加载插件时悄悄改文档。",[10,654,656],{"id":655},"迁移一个-markdown-it-插件","迁移一个 markdown-it 插件",[658,659,660,664,667,670,673],"ol",{},[661,662,663],"li",{},"列出它的语法、输入输出、是否有块嵌套、转义和引用规则。",[661,665,666],{},"用 Lezer 语法保证不完整输入、代码区域和嵌套上下文的行为。",[661,668,669],{},"用源码 codec 描述字段；没有可逆编码的字段先保持只读。",[661,671,672],{},"通过投影或组件提供视觉结果；HTML 输出另由导出管线实现。",[661,674,675],{},"为每项能力建立源码 fixture：原样读取、局部写回、撤销、加载\u002F错误、只读及解析未完成。",[88,677,678,679,683,684,688,689,463],{},"很多常用能力已经有内置扩展，不需要移植同名插件。先查 ",[513,680,682],{"href":681},"\u002Ffeatures\u002Fcatalog","功能与安装","，再看 ",[513,685,687],{"href":686},"\u002Fextensions\u002Finput-rules","输入规则"," 和 ",[513,690,692],{"href":691},"\u002Fextensions\u002Fprojections","投影层",[694,695,696],"style",{},"html pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .su0ou, html code.shiki .su0ou{--shiki-default:#22863A;--shiki-light:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s-HEn, html code.shiki .s-HEn{--shiki-default:#032F62;--shiki-light:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sDD9d, html code.shiki .sDD9d{--shiki-default:#D73A49;--shiki-light:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sUNQB, html code.shiki .sUNQB{--shiki-default:#005CC5;--shiki-light:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":125,"searchDepth":160,"depth":160,"links":698},[699,700,704,705,706,707],{"id":12,"depth":160,"text":12},{"id":104,"depth":160,"text":104,"children":701},[702,703],{"id":108,"depth":176,"text":108},{"id":437,"depth":176,"text":437},{"id":451,"depth":160,"text":452},{"id":520,"depth":160,"text":521},{"id":640,"depth":160,"text":641},{"id":655,"depth":160,"text":656},"把新的语法接入增量解析、语义查询和源码呈现，而不引入 HTML 往返。","md",[711,92,712,478,566],"Lezer","plugin","zh-CN",{},"\u002Fextensions\u002Fmarkdown-plugins","扩展开发",{"title":5,"description":708},"extensions\u002Fmarkdown-plugins.zh-CN","RtrMXHzPrc-XWx4vfH43NQONv2gHNthxxHiwFnifYpQ",1793046311417]