跳转到主要内容

MarkdownLib 前置插件

MarkdownLib 是一个把 Markdown 解析能力封装成前置插件的库,任何插件都可以通过 callPlugin 调用它,把 Markdown 文本渲染成 HTML。
  • 插件 ID:top.qomicex.markdown
  • 版本:1.2.1
  • 依赖:无
  • 引入:内嵌 marked v15.0.12,无外部 CDN 依赖(不受 Tauri CSP 限制)

为什么需要它

QML 插件运行在 Tauri WebView 中,打包后 CSP 会拦截所有外部请求与外部 <script src> 加载。插件如果直接在 HTML 里引用 CDN 的 marked:
在打包环境下会被 CSP 拦截,marked 未定义,Markdown 无法渲染。 把 marked 抽成独立前置插件后:
  • marked 代码内嵌在 MarkdownLib 插件包内,无需外部 CDN,天然绕过 CSP;
  • 多个插件可以共享同一份渲染能力,避免各自内嵌重复代码;
  • 通过插件依赖机制管理,版本清晰、可升级。

安装

安装 MarkdownLib 前置插件后,其它插件在 manifest.json 声明依赖:
依赖字段说明: 版本支持语法:>=1.2.0、<=1.2.0、>1.0、<2.0、=1.0.1、精确 1.2.0、多条件空格分隔 ">=1.0 <2.0"。

接口

MarkdownLib 通过 registerMethod 暴露以下方法:

renderMarkdown(md)

将完整的 Markdown 文本渲染为 HTML 字符串。

renderMarkdownInline(md)

将行内 Markdown 渲染为 HTML(不包含块级元素)。

stripHtml(html)

去除 HTML 标签,返回纯文本。

调用方法

通过 __PLUGIN_API__.callPlugin 调用:

例子

基础渲染

行内渲染 + 去标签

在悬浮窗(overlay)中使用

Overlay 的 __PLUGIN_API__ 同样暴露 callPlugin,用法一致。

处理依赖缺失

实现思路

提供方:注册方法

MarkdownLib 的 dist/index.html 在插件激活后,通过 registerMethod 把 marked 的能力暴露给插件系统:
要点:
  • registerMethod(methodName, fn) — fn 的返回值可以是普通值或 Promise(异步方法同样支持);
  • 一个插件可注册多个方法;
  • 插件停用时所有方法自动注销;
  • 方法名建议语义化,避免与其他插件冲突。

调用方:调用方法

依赖方插件通过 callPlugin 调用:
调用流程:

为什么内嵌而非 CDN

MarkdownLib 把 marked.min.js 内嵌在插件包内,而非通过 <script src="CDN"> 引用:
  • 打包后 CSP 安全:外部脚本被拦截,内嵌脚本不受影响;
  • 离线可用:不依赖网络;
  • 版本锁定:打包进插件,版本确定可复现。

定义原理

插件依赖机制

依赖通过 manifest.json 的 dependencies 数组声明,由后端在安装/启动时校验:
依赖方插件在 __PLUGIN_API__ 上调用 registerMethod 注册方法,方法存于主窗口的 __pluginRegistry。停用插件时对应方法自动移除。

方法注册与调用原理

错误处理

callPlugin 失败会 reject,建议调用方始终 try/catch:

修订记录