[{"data":1,"prerenderedAt":205},["ShallowReactive",2],{"markdown-doc:\u002Fguide\u002Fextensions":3},{"id":4,"title":5,"body":6,"description":193,"extension":194,"keywords":195,"locale":196,"meta":197,"navigation":198,"order":199,"path":200,"section":201,"seo":202,"stem":203,"__hash__":204},"docs\u002Fguide\u002Fextensions.zh-CN.md","自定义语法与节点",{"type":7,"value":8,"toc":185},"minimark",[9,18,23,46,50,76,84,88,115,119,163,166],[10,11,12,13,17],"p",{},"如果你希望 ",[14,15,16],"code",{},"[[done]]"," 显示成“已完成”，需要解决两件事：识别这段语法并读出状态值，再把状态显示出来。解析扩展负责前者，阅读贡献负责后者。",[19,20,22],"h2",{"id":21},"_1-复用解析扩展","1. 复用解析扩展",[10,24,25,26,29,30,33,34,37,38,41,42,45],{},"已有 MSFE ",[14,27,28],{},"Node"," \u002F ",[14,31,32],{},"Mark"," 可直接通过 ",[14,35,36],{},"options.extensions"," 安装。\n",[14,39,40],{},"withMarkdownReading(extension, { render, load?, cacheKey? })"," 给同一个 source codec 添加阅读能力：\n字段继续经过 ",[14,43,44],{},"addAttributes"," 的默认值和校验，非法值或未闭合语法保留原文。先完成\nextension 的 configure\u002Fextend，再包装阅读贡献。",[19,47,49],{"id":48},"_2-为状态值提供显示","2. 为状态值提供显示",[10,51,52,53,56,57,60,61,64,65,68,69,72,73,75],{},"示例的 ",[14,54,55],{},"status\u002Freading.ts"," 将 ",[14,58,59],{},"Status"," 交给 ",[14,62,63],{},"withMarkdownReading()","，根据 ",[14,66,67],{},"attrs.value"," 返回“待办”或“已完成”。读者看到的是标签，保存的仍是 ",[14,70,71],{},"[[todo]]"," 或 ",[14,74,16],{},"。",[10,77,78,79,29,81,83],{},"下面使用 ",[14,80,71],{},[14,82,16],{}," 语法，同时替换链接并开启 HTML。\n点击逐字追加，可以观察未闭合节点、HTML 和后置引用的更新。",[85,86],"docs-demo",{"name":87},"reading\u002Fcustom",[10,89,90,91,94,95,98,99,101,102,105,106,109,110,75],{},"完整示例按文件查阅：",[14,92,93],{},"status\u002Fstatus.ts"," 定义语法和字段；",[14,96,97],{},"status\u002Ftypes.ts"," 定义状态值类型；",[14,100,55],{}," 定义阅读外观；",[14,103,104],{},"reading\u002Fcustom.vue"," 负责将这些配置传给阅读器。链接替换由独立的 ",[14,107,108],{},"reading\u002Flink.vue"," 负责，见",[111,112,114],"a",{"href":113},"\u002Fguide\u002Fcomponents","替换渲染组件",[19,116,118],{"id":117},"_3-处理子内容与异步资源","3. 处理子内容与异步资源",[10,120,121,124,125,128,129,128,132,128,135,138,139,29,142,145,146,149,150,153,154,158,159,162],{},[14,122,123],{},"render"," 获得只读 ",[14,126,127],{},"document","、",[14,130,131],{},"node",[14,133,134],{},"attrs",[14,136,137],{},"locale","，以及有范围校验的\n",[14,140,141],{},"renderInline()",[14,143,144],{},"renderBlocks()","。自定义块可以递归呈现其已解析子节点。\n",[14,147,148],{},"load(context, signal)"," 可返回 ",[14,151,152],{},"{ value, release? }"," 或相应 Promise；更换快照、消息或卸载\n会取消旧任务，迟到结果也会释放；满足",[111,155,157],{"href":156},"\u002Fguide\u002Fperformance","缓存依赖合同","时，未改变的块保留资源。\n渲染、读取、加载失败通过 ",[14,160,161],{},"error"," 事件上报并保留该节点源码。",[19,164,165],{"id":165},"更复杂的语法",[10,167,168,169,172,173,176,177,180,181,184],{},"复杂语法可用 ",[14,170,171],{},"options.syntax"," 安装原生 Lezer ",[14,174,175],{},"MarkdownExtension","（包括块与行内 parser），\n再由 source codec 解释字段。仅做只读投影时也可用 ",[14,178,179],{},"renderNode(context, node)"," 处理命名\n语法节点，未处理时返回 ",[14,182,183],{},"undefined"," 交给内置分派。节点的 grammar 与字段归解析扩展，\n外观归阅读贡献；不对最终 HTML 字符串做正则替换。",{"title":186,"searchDepth":187,"depth":187,"links":188},"",2,[189,190,191,192],{"id":21,"depth":187,"text":22},{"id":48,"depth":187,"text":49},{"id":117,"depth":187,"text":118},{"id":165,"depth":187,"text":165},"为业务语法增加解析和阅读显示，以待办状态标记为例。","md",null,"zh-CN",{},true,5,"\u002Fguide\u002Fextensions","扩展与渲染",{"title":5,"description":193},"guide\u002Fextensions.zh-CN","EVBrAd5gwXOMUA9-senp0HhV-OldBNB1lkG0cbKfxKg",1793045321582]