[{"data":1,"prerenderedAt":340},["ShallowReactive",2],{"quirekit-doc:\u002Fguide\u002Fcontent":3},{"id":4,"title":5,"body":6,"description":328,"extension":329,"keywords":330,"locale":331,"meta":332,"navigation":333,"order":334,"path":335,"section":336,"seo":337,"stem":338,"__hash__":339},"docs\u002Fguide\u002Fcontent.zh-CN.md","读取、替换与校验内容",{"type":7,"value":8,"toc":322},"minimark",[9,13,17,80,98,101,157,173,239,249,252,263,275,286,289,311,318],[10,11,12],"p",{},"拿到服务端数据后，先确定它属于哪一种文档模型，再把内容交给 Editor。HTML、JSON 和 Markdown 是内容表示方式；它们不会替你安装对应的节点、格式或转换规则。",[14,15,16],"h2",{"id":16},"选择内容表示",[18,19,20,36],"table",{},[21,22,23],"thead",{},[24,25,26,30,33],"tr",{},[27,28,29],"th",{},"内容",[27,31,32],{},"如何使用",[27,34,35],{},"需要注意",[37,38,39,54,67],"tbody",{},[24,40,41,45,51],{},[42,43,44],"td",{},"JSON",[42,46,47],{},[48,49,50],"code",{},"content: { type: 'doc', content: [...] }",[42,52,53],{},"适合保存产品自己的结构，恢复时使用相容的 Schema",[24,55,56,59,64],{},[42,57,58],{},"HTML",[42,60,61],{},[48,62,63],{},"content: '\u003Cp>Hello\u003C\u002Fp>'",[42,65,66],{},"字符串默认按 HTML 解析；需要 DOM 环境，解析规则由扩展提供",[24,68,69,72,77],{},[42,70,71],{},"Markdown",[42,73,74],{},[48,75,76],{},"content: '# Hello', contentType: 'markdown'",[42,78,79],{},"显式指定类型；只有已安装扩展提供的 Markdown 规则能参与转换",[10,81,82,85,86,89,90,93,94,97],{},[48,83,84],{},"getJSON()"," 读取规范结构，",[48,87,88],{},"getText()"," 读取纯文本，",[48,91,92],{},"getHTML()"," 使用当前 Schema 的 HTML 序列化器，",[48,95,96],{},"getMarkdown()"," 使用 Markdown 转换器。HTML 输出需要浏览器 DOM；它不导出分页画布、产品工具栏或页面截图。自定义节点应提供所需格式的转换规则，不能只检查文字看起来相同。",[14,99,100],{"id":100},"先分清要做哪一种修改",[18,102,103,116],{},[21,104,105],{},[24,106,107,110,113],{},[27,108,109],{},"任务",[27,111,112],{},"调用",[27,114,115],{},"结果",[37,117,118,131,144],{},[24,119,120,123,128],{},[42,121,122],{},"在当前选区加入内容",[42,124,125],{},[48,126,127],{},"commands.insertContent(content)",[42,129,130],{},"插入或替换选区，进入普通编辑历史",[24,132,133,136,141],{},[42,134,135],{},"替换当前文档的正文",[42,137,138],{},[48,139,140],{},"commands.setContent(content, options)",[42,142,143],{},"替换子内容，保留当前文档顶层属性",[24,145,146,149,154],{},[42,147,148],{},"打开完整文档",[42,150,151],{},[48,152,153],{},"commands.replaceDocument(content, options)",[42,155,156],{},"同时恢复顶层属性，选区回到开头，本次替换不加入历史",[10,158,159,160,163,164,167,168,163],{},"Word 的文档设置、样式注册表等信息保存在根节点属性中，分节则由正文中的 section 节点表达，因此文件恢复不能只调用 ",[48,161,162],{},"setContent()","。",[48,165,166],{},"replaceDocument()"," 的“不加入历史”也不等于建立全新的编辑会话；切换业务文档时，应用仍需隔离旧任务、订阅和历史策略。需要明确的新会话边界时，创建新的 Editor；Classic 可使用",[169,170,172],"a",{"href":171},"\u002Fclassic\u002Ffiles","替换文档配置",[174,175,181],"pre",{"className":176,"code":177,"filename":178,"language":179,"meta":180,"style":180},"language-ts shiki shiki-themes github-light github-light github-dark","const accepted = editor.commands.replaceDocument(content, {\n  errorOnInvalidContent: true,\n  emitUpdate: false,\n})\n","替换经过校验的完整文档","ts","",[48,182,183,210,222,233],{"__ignoreMap":180},[184,185,188,192,196,199,203,207],"span",{"class":186,"line":187},"line",1,[184,189,191],{"class":190},"sDD9d","const",[184,193,195],{"class":194},"sUNQB"," accepted",[184,197,198],{"class":190}," =",[184,200,202],{"class":201},"sVPnS"," editor.commands.",[184,204,206],{"class":205},"sgQzM","replaceDocument",[184,208,209],{"class":201},"(content, {\n",[184,211,213,216,219],{"class":186,"line":212},2,[184,214,215],{"class":201},"  errorOnInvalidContent: ",[184,217,218],{"class":194},"true",[184,220,221],{"class":201},",\n",[184,223,225,228,231],{"class":186,"line":224},3,[184,226,227],{"class":201},"  emitUpdate: ",[184,229,230],{"class":194},"false",[184,232,221],{"class":201},[184,234,236],{"class":186,"line":235},4,[184,237,238],{"class":201},"})\n",[10,240,241,244,245,248],{},[48,242,243],{},"errorOnInvalidContent: true"," 使解析失败抛出错误，调用方需要捕获。",[48,246,247],{},"emitUpdate: false"," 只抑制内容更新通知；文档仍被替换，事务仍会发生。这适合应用自己建立已保存基线的恢复流程，不是静默执行所有副作用的开关。",[14,250,251],{"id":251},"校验发生在替换之前",[10,253,254,255,258,259,262],{},"完整备份至少检查三件事：应用的模型与版本、节点\u002F标记\u002F属性名称、Schema 允许的内容结构。解析后的节点可以调用 ",[48,256,257],{},"check()"," 检查结构，但解析器可能已经忽略未知属性，因此只做 ",[48,260,261],{},"schema.nodeFromJSON(value).check()"," 不能证明原文件没有丢字段。",[10,264,265,266,269,270,274],{},"保留原始输入，在转换前拒绝未知字段或执行明确的迁移。完整示例的 ",[48,267,268],{},"files\u002Fbackup.ts"," 先检查名称，再解析、检查根节点与子内容；实现见",[169,271,273],{"href":272},"\u002Fbuild\u002Ffiles","文件操作","。失败时保留当前草稿，不要把回退得到的空白文档重新保存到原位置。",[10,276,277,278,281,282,285],{},"创建选项 ",[48,279,280],{},"enableContentCheck"," \u002F ",[48,283,284],{},"emitContentError"," 可以报告初始内容错误；当前构造流程仍可能建立回退内容，不能把“构造没有抛错”当作导入成功。严格恢复应先验证，再提交。",[14,287,288],{"id":288},"内容更新与保存状态",[10,290,291,294,295,298,299,301,302,306,307,163],{},[48,292,293],{},"setEditable()"," 默认也会发出 ",[48,296,297],{},"update","，即使正文没有变化。记录未保存修改时比较前后文档，而不是把每个 ",[48,300,297],{}," 都当成一次正文编辑；示例见",[169,303,305],{"href":304},"\u002Fconcepts\u002Flifecycle","生命周期与事件","。保存请求完成后也要确认当前文档仍是提交的那一版，见",[169,308,310],{"href":309},"\u002Fguide\u002Fpersistence","保存与恢复",[10,312,313,314,163],{},"参数的完整定义见 ",[169,315,317],{"href":316},"\u002Fapi\u002Foptions","Editor 配置与事件参考",[319,320,321],"style",{},"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 pre.shiki code .sVPnS, html code.shiki .sVPnS{--shiki-default:#24292E;--shiki-light:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sgQzM, html code.shiki .sgQzM{--shiki-default:#6F42C1;--shiki-light:#6F42C1;--shiki-dark:#B392F0}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":180,"searchDepth":212,"depth":212,"links":323},[324,325,326,327],{"id":16,"depth":212,"text":16},{"id":100,"depth":212,"text":100},{"id":251,"depth":212,"text":251},{"id":288,"depth":212,"text":288},"分清插入文字、替换正文和打开另一份文档，并在解析前保留原始数据。","md",null,"zh-CN",{},true,5,"\u002Fguide\u002Fcontent","开始使用",{"title":5,"description":328},"guide\u002Fcontent.zh-CN","_wj5GYWI_sFgX-m7klF6iTrnN3nEGnz20CtkiYA2MZk",1793045209085]