{"_id":"@anyblock/any-block-core","_rev":"9-6092e560966b39dad114212c3ca1e245","name":"@anyblock/any-block-core","dist-tags":{"latest":"3.5.3"},"versions":{"3.4.6":{"name":"@anyblock/any-block-core","version":"3.4.6","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.4.6","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"9a8bca2a9e52dde04197f81f4ad0b6eb70f997e6","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.4.6.tgz","fileCount":33,"integrity":"sha512-gqT8JDJkzYYhoTIOmsufI+4r1a9cijZDryQktmPMwfOegdPBU7p5rAn19ThsceuAamhMxDEvcqJ20g5IwFfXwQ==","signatures":[{"sig":"MEQCICNZVGQvwvs9ljTI+Ow9zbB4xjtxcj4Gl2GS091HLYFgAiAYjq+spKF8KJ9CJU79Z10cts8xgmJV64TvhFgsO995Nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":385505},"main":"index.js","gitHead":"5049cdc25def2fd52ffb5be6f1481173035359c2","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.4.6_1778831384682_0.855395137878912","host":"s3://npm-registry-packages-npm-production"}},"3.4.9":{"name":"@anyblock/any-block-core","version":"3.4.9","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.4.9","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"34c6b467b6002dee4c2e84820522a2ba73462663","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.4.9.tgz","fileCount":33,"integrity":"sha512-6Kp0L42bXQDZvmwbESpXRhAQAs3GvF3gAQOF4o5K6y1xIemFAsDujLxUi5Y9zbH32gNRTh2nMbepJEZPbzmF0Q==","signatures":[{"sig":"MEYCIQCiyKx1IWXbp9V0+jffwaop1+TCCkv1+oiF62QCfviRtAIhAJmUivpve7tuAJ5yK9L6fQn1mmi2h2EASQ6FhZAUy51N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":386719},"main":"index.js","gitHead":"024daa0e6569e8aae94511ca6374ba49d1a9456b","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.4.9_1778928769040_0.5095928877518965","host":"s3://npm-registry-packages-npm-production"}},"3.4.10":{"name":"@anyblock/any-block-core","version":"3.4.10","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.4.10","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"821e451df99420840c6cf2b0a179043489c0c025","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.4.10.tgz","fileCount":33,"integrity":"sha512-5SUhOPQe8mSMl0HfIpRe4bwIYObInYD5AcLdWEdMqhMykV2bXpvaTIzFG8lDyFDy3KzPndFY5DvbRQXmh2BZHA==","signatures":[{"sig":"MEUCIQDAnIiwrcnaqxivGspvIRtAfgAhNjIjQRBb1Ujdc2o6NAIgF03FP/pFHutY/QRmYOeC5fOes0XUDJAgRXlzKnUTpBA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":387937},"main":"index.js","gitHead":"261a9487698455297b32bb7cec3546762b601a78","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.4.10_1778933169607_0.1897259641021849","host":"s3://npm-registry-packages-npm-production"}},"3.4.11":{"name":"@anyblock/any-block-core","version":"3.4.11","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.4.11","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"f1b1b97d2344cfdf5cfafaaccd134a1247d28b5f","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.4.11.tgz","fileCount":33,"integrity":"sha512-vtdt/1tttWV/ofpbIJeG9eYtHm/1kZy361Q+lsHICioOrhBQOOGqrlXuzOa7uDI2QkzdGPcrFa4xR9YRjLDG/g==","signatures":[{"sig":"MEQCIBLhApo8pZb/JWX/pVqj5cVstEZM+2E39+T4HrhnDwVbAiADrnk0Fh1+AJ0TX+t1DQIWd+x8Pk5H/WsCSUCRytkaaQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393367},"main":"index.js","gitHead":"bca4a4bf2b43e536b744e8b62317d3c57131f1cf","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.4.11_1780558306759_0.3393296913553432","host":"s3://npm-registry-packages-npm-production"}},"3.4.12":{"name":"@anyblock/any-block-core","version":"3.4.12","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.4.12","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"b518d815c3327d22da8702e3a7d2f0f21e1f9c94","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.4.12.tgz","fileCount":33,"integrity":"sha512-+3ru3x6VgBMEn1OB2GOvDyjCRyZSe+cgYY1nxdMyqyO8dPHmVGMrqXAI2fpMhCRO8tkXTYNq50qy7iFkT3SBLQ==","signatures":[{"sig":"MEUCIQDAWLcJJU3/jjiVT5PmrqV80KN3DrY80z1B8ysDLmfDSAIgJ1vcX9C6NRU2b3iLwQl0FemOq0evHC+LvR93TayXXVU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":393357},"main":"index.js","gitHead":"b46615a187c8196402d75f667ec0746effd29f89","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.4.12_1780559782008_0.31020961177677764","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"@anyblock/any-block-core","version":"3.5.0","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.5.0","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"bf9bf10e0008162e781357b83f21cb766ffe6e07","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.5.0.tgz","fileCount":33,"integrity":"sha512-VcISAi08bauCAyDMkVULPCOJJg7XShZZAf9e53e+mjkhAt9WzuvSKPwIncMvX4sGaECK6zeuwxTC/fJ8SY0oXQ==","signatures":[{"sig":"MEQCICdrQYxX8JZehk91eEpcy+3QublAqjyIfLoQQoRG+RI2AiBRZeJmZE9gdy5wxyzCXTm1NktWFe/Ok/PwOhUI/Jn33g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":397065},"main":"index.js","gitHead":"69251b73bcac2158d20726394a1c433e400eccdc","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.5.0_1780649679227_0.7807910184428164","host":"s3://npm-registry-packages-npm-production"}},"3.5.1":{"name":"@anyblock/any-block-core","version":"3.5.1","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.5.1","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"f8f8a2bf5ff30784b13b8d392d1a0c236d7d318d","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.5.1.tgz","fileCount":33,"integrity":"sha512-yk09s94gj19QbnmSoPLBZWTZpTfuGJYan7v2R85dLMgJSemDbEg3sgu+Zg5mQpsjEodEfWYztvZCLrmKahmWLw==","signatures":[{"sig":"MEQCIAvGU9dPNS9I+idj4iU0V6peA/M1h6vMvhl4KNtZxpCEAiBBj+u4eOAPf/8rEGMnqg8nWXsWrbqnFD9l5SyN20WsYQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":397065},"main":"index.js","gitHead":"14f67578bf85c965aa1bffd06a4563c62a8f8eeb","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.5.1_1783357612057_0.4643057702099551","host":"s3://npm-registry-packages-npm-production"}},"3.5.2":{"name":"@anyblock/any-block-core","version":"3.5.2","author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","_id":"@anyblock/any-block-core@3.5.2","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"dist":{"shasum":"a1890794d1a4514f1896ee002a83784c3602437b","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.5.2.tgz","fileCount":33,"integrity":"sha512-FOgWQJXLLqQ2EbOV48C61O9Zqc1iduOOS2W1zeCOEaZII1BwPtQQ1FkwSVCO7x4zxutfE6LOvmVLBCCwfwAaBA==","signatures":[{"sig":"MEQCIHyP+NmNOTfqJPE0lIBavI5wU5PLMN0yoiF3jkRqc7hjAiBMVN8fGT8dx4yDPhL2xfvz6u2Ct0sijaKVdcjuv067mQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":397065},"main":"index.js","gitHead":"8ae2c6f537f230dc8bb8a8fa81824eeafe8a8980","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"_npmVersion":"11.3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","directories":{},"_nodeVersion":"22.14.0","dependencies":{"luxon":"^3.7.2","dompurify":"^3.4.3","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tslib":"^2.8.1","@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2"},"_npmOperationalInternal":{"tmp":"tmp/any-block-core_3.5.2_1783362977304_0.6606110373478213","host":"s3://npm-registry-packages-npm-production"}},"3.5.3":{"name":"@anyblock/any-block-core","version":"3.5.3","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","dependencies":{"dompurify":"^3.4.3","luxon":"^3.7.2","markmap-lib":"^0.17.2","plantuml-encoder":"^1.4.0"},"devDependencies":{"@types/luxon":"^3.7.1","@types/plantuml-encoder":"^1.4.2","tslib":"^2.8.1"},"_id":"@anyblock/any-block-core@3.5.3","gitHead":"caffcefa71ad66dafcc02c9ac2c6c9902176fed9","_nodeVersion":"22.14.0","_npmVersion":"11.3.0","dist":{"integrity":"sha512-1PXg14gcA7zX5vm1cWWYo5jtZIK1C8brNacHxzU9sI0StY+kts5lBB59KgY1KgIwd5yVtNsv0oqr5B8raxsF+g==","shasum":"b42bc1a4086089392329e046281f38ab7298160e","tarball":"https://registry.npmjs.org/@anyblock/any-block-core/-/any-block-core-3.5.3.tgz","fileCount":33,"unpackedSize":397098,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGJ6hn9XM1bBUHcsuGToLHLGtJjk+dsgbdbx33E1edDdAiAQNMpwxqnDvz3gBx9kQ8i2QLPDLGjf43/Ju3vtg8lpcg=="}]},"_npmUser":{"name":"linczero","email":"762699299@qq.com"},"directories":{},"maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/any-block-core_3.5.3_1787901021533_0.7013405920268054"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-15T07:49:44.612Z","modified":"2026-08-28T07:10:21.877Z","3.4.6":"2026-05-15T07:49:44.825Z","3.4.9":"2026-05-16T10:52:49.175Z","3.4.10":"2026-05-16T12:06:09.778Z","3.4.11":"2026-06-04T07:31:46.896Z","3.4.12":"2026-06-04T07:56:22.204Z","3.5.0":"2026-06-05T08:54:39.380Z","3.5.1":"2026-07-06T17:06:52.207Z","3.5.2":"2026-07-06T18:36:17.482Z","3.5.3":"2026-08-28T07:10:21.694Z"},"author":{"name":"LincZero"},"license":"GNU Affero General Public License v3.0","description":"You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)","maintainers":[{"name":"linczero","email":"762699299@qq.com"}],"readme":"# Any Block Converter\r\n\r\n## 使用\r\n\r\n### 使用流程\r\n\r\n```typescript\r\n// 转换器模块\r\nimport { ABConvertManager } from \"ABConvertManager\"\r\n// 加载所有转换器 (都是可选的)\r\n// (当然，如果A转换器依赖B转换器，那么你导入A必然导入B)\r\nimport {} from \"./ABConverter/converter/abc_text\"\r\nimport {} from \"./ABConverter/converter/abc_code\"\r\nimport {} from \"./ABConverter/converter/abc_list\"\r\nimport {} from \"./ABConverter/converter/abc_table\"\r\nimport {} from \"./ABConverter/converter/abc_deco\"\r\nimport {} from \"./ABConverter/converter/abc_ex\"\r\nimport {} from \"./ABConverter/converter/abc_echarts\"\r\nimport {} from \"./ABConverter/converter/abc_mermaid\" // 可选建议：非 min 环境下 7.1MB\r\nimport {} from \"./ABConverter/converter/abc_markmap\" // 可选建议：1.3MB\r\n\r\n// 先注册默认渲染行为\r\nABConvertManager.getInstance().redefine_renderMarkdown((markdown: string, el: HTMLElement): void => {...})\r\n\r\n// 然后按下面这个原型正常使用即可\r\nABConvertManager.autoABConvert(el:HTMLDivElement, header:string, content:string): HTMLElement\r\n```\r\n\r\n### Obsidian 回调函数设置\r\n\r\n```typescript\r\nABConvertManager.getInstance().redefine_renderMarkdown((markdown: string, el: HTMLElement, ctx?: any): void => {\r\n    /**\r\n     * Renders markdown string to an HTML element.\r\n     * @deprecated - use {@link MarkdownRenderer.render}\r\n     * \r\n     * 原定义： \r\n     * @param markdown - The markdown source code\r\n     * @param el - The element to append to\r\n     * @param sourcePath - The normalized path of this markdown file, used to resolve relative internal links\r\n     *     此标记文件的规范化路径，用于解析相对内部链接\r\n     *     TODO 我可能知道为什么重渲染图片会出现bug了，原因应该在这里\r\n     * @param component - A parent component to manage the lifecycle of the rendered child components, if any\r\n     *     一个父组件，用于管理呈现的子组件(如果有的话)的生命周期\r\n     * @public\r\n     * \r\n     */\r\n    //MarkdownRenderer.renderMarkdown(markdown, el, \"\", new MarkdownRenderChild(el))\r\n\r\n    const mdrc: MarkdownRenderChild = new MarkdownRenderChild(el);\r\n    if (ctx) ctx.addChild(mdrc);\r\n    else if (ABCSetting.global_ctx) { (ABCSetting.global_ctx  as MarkdownPostProcessorContext).addChild(mdrc) }\r\n    /**\r\n     * Renders markdown string to an HTML element.\r\n     * @param app - A reference to the app object\r\n     * @param markdown - The markdown source code\r\n     * @param el - The element to append to\r\n     * @param sourcePath - The normalized path of this markdown file, used to resolve relative internal links\r\n     * @param component - A parent component to manage the lifecycle of the rendered child components.\r\n     * @public\r\n     */\r\n    // @ts-ignore 新接口，但旧接口似乎不支持\r\n    MarkdownRenderer.render(app, markdown, el, app.workspace.activeLeaf?.view?.file?.path??\"\", mdrc)\r\n})\r\n```\r\n\r\n### MarkdownIt 回调函数设置\r\n\r\n```typescript\r\nABConvertManager.getInstance().redefine_renderMarkdown((markdown: string, el: HTMLElement): void => {\r\n    const result: string = md.render(markdown)\r\n    const el_child = document.createElement(\"div\"); el.appendChild(el_child); el_child.innerHTML = result;\r\n})\r\n```\r\n\r\n## 开发/设计/架构补充\r\n\r\n（先读src下的README）\r\n\r\n### 架构\r\n\r\n也叫 Any Block Render (text->html时)\r\n\r\n因为模块化内置了很多 Converter (text->text等)，所以整体叫 Any Block Converter\r\n\r\n### 该模块设计不应依赖于Ob插件\r\n\r\n**这个模块以前是依赖Ob插件接口的**，后来才改成可复用的 AnyBlock 转化器。\r\n\r\n为了高复用 (不仅仅在Ob插件上使用，还在md-it的等其他地方使用)\r\n\r\n1. 要与选择器解耦\r\n2. 相较于V2版本，为了不依赖于Ob底层，使用一个回调函数去替代 `MarkdownRenderer` 相关函数\r\n\r\n### 程序缩写\r\n\r\n- `AnyBlock`：`AB`\r\n- `AnyBlockConvert`：`ABC`\r\n- `AnyBlockSelector`：`ABS`\r\n- `AnyBlockRender`：`ABR`\r\n\r\n### 格式转换所在位置\r\n\r\n> ##### 思考\r\n\r\n例如我有两个格式：格式1（有格式1解析渲染、将自己格式转别人格式，将别人格式转自己格式）、格式2（有格式2解析渲染、将别人的格式转自己式、将自己的格式转别人的格式）。问题在于：1转2和2转1的功能，应该怎么设置？\r\n\r\n1. 都放在两个文件中\r\n    - 优点：两模块互相独立\r\n    - 缺点：造成冗余，而非复用 —— 只写一遍，两个程序都用一份\r\n2. 只放格式2\r\n    - 思想：该方式视为先有的格式1后有的格式2扩展。或视为格式1是更通用更广泛的格式，格式2属于扩展格式，自然由格式2负责12的互转\r\n    - 采用：abc_mermaid、abc_markmap 与 list 的转换属于此类，后期增加的新格式也属于此类\r\n3. 1转2由2实现，2转1则由1实现\r\n    - 思想：该方式视为1和2是两个商业软件，他们乐意于让对方的用户转移到自己这边，但并不乐意让自己的用户转到对方那边\r\n    - 采用：list、table 的互相转换属于此类\r\n\r\n> ##### 总结\r\n\r\n按格式的通用性分为：(越往上通用级别越高)\r\n\r\n1. str\r\n2. html\r\n3. list、table\r\n4. mermaid、mindmap、……以后的扩展\r\n\r\n> ##### 策略\r\n\r\n1. 低通用级格式要实现对高通用级格式的互转\r\n2. 同通用级则实现其他同通用级格式对自己格式的转化\r\n\r\n## todo\r\n\r\n1. 别名模块，AnyBlockConverter 不应该最后强制输出html。最后补md的行为是ob的别名模块做的，不应该由abc来快\r\n2. PlantUML，感觉很多东西都好用多了\r\n\r\n## bug\r\n\r\n### mdit环境下onclick需要内嵌才生效\r\n\r\n```typescript\r\n// TODO，onClick代码在mdit环境下按钮点击失效。测试代码如下\r\nconst btn = document.createElement(\"button\"); table.appendChild(btn); btn.textContent = \"测试按钮1\";\r\nbtn.onclick = () => { console.log(\"btn.onclick\") }\r\nconst btndiv = document.createElement(\"div\"); table.appendChild(btndiv);\r\nbtndiv.innerHTML = `<button onclick=\"console.log('Button was clicked!')\">测试按钮2</button>`\r\n// 发现mdit环境下，按钮1无法正常按动，而按钮2可以\r\n// 原因应该是：因为mdit环境下的document对象是jdsom创建的，假的。这个dom对象后面会被转化为html_str，onclick的信息就丢失了\r\n```\r\n\r\n### mermaid找不到DOMPurify\r\n\r\nmermaid的一个未定义行为的报错 (不过修复了这个之后又说BBox找不到了)\r\n\r\n```typescript\r\n// 见：https://github.com/kkomelin/isomorphic-dompurify\r\n\r\n// 用\r\nimport DOMPurify from \"isomorphic-dompurify\"\r\n// 替换\r\nimport DOMPurify from \"dompurify\"\r\n```\r\n","readmeFilename":"README.md"}