更新记录

1.0.0(2025-03-16) 下载此版本

首次发布


平台兼容性

Vue2 Vue3
App 快应用 微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序
HBuilderX 4.56 × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序 鸿蒙元服务
× × × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

VerResponse 组件文档

VerResponse 是一个基于 mp-html 的组件封装,支持 LaTeX 公式渲染,并兼容代码和公式同时存在。

修改说明

为了实现 LaTeX 公式的兼容,并对代码和公式进行解析,以下文件被修改:

  1. latex
    • 增加了if判断,让其位于<code>标签内时不要动。
  2. markdown
    • 修改了 markdown 解析器,确保代码块和公式在同一文档中能够正确渲染做了一些处理,可能会造成一定的效率损失。
    • 添加了缓存
  3. parser.js
    • 添加了 isCode 为katex提供解析标志。
    • 在遇到<code>开头和结尾时更改isCode

属性

属性名 类型 默认值 描述
theme String 'vs' 主题样式,可选值:vsheavyAnimenone
content String '' 用于渲染的 markdown 字符串,支持 LaTeX 公式。
themeColor String '#409EFF' 自定义主题颜色,将覆盖主题颜色。

主题样式

VerResponse 提供了三种主题样式:

  1. vs 轻二次元风格的主题样式,为适合大多数场景做了很大程度的妥协,风格简洁。

  2. heavyAnime 强二次元风格的主题,适合特定的展示场景。

  3. none 非二次元风格主题,只做了简单的封装。

使用示例

1. 默认主题 (vs)

<VerResponse  theme="vs" :content="content" />

2. 二次元主题 (heavyAnime)

<VerResponse theme="heavyAnime" :content="content" />

3. 自定义颜色 (none)

<VerResponse theme="none" :content="content" themeColor="#FF69B4" />

注意事项

  1. 确保传入的 content 是一个有效的 HTML 字符串。
  2. 如果需要渲染复杂的 LaTeX 公式,请确保 katex 配置正确。
  3. 如果主题样式不满足需求,可以通过 themeColor 自定义主题颜色。
  4. 在缓存情况下公式可能会无法准确识别,如果你的格式出现了错误,可以把下方代码粘贴到ver-response\components\mp-html\markdown\index.js文件中覆盖掉全部内容:
    
    /**
    * @fileoverview markdown 插件
    * Include marked (https://github.com/markedjs/marked)
    * Include github-markdown-css (https://github.com/sindresorhus/github-markdown-css)
    */
    import marked from './marked.min'
    let index = 0
    function Markdown (vm) {
    this.vm = vm
    vm._ids = {}
    }
    let latexBlocks = [];
    let codeBlocks = [];
    /**
    * 提取 $$ 包围的内容并替换为占位符
    * @param {string} content 原始内容
    * @returns {string} 替换后的内容
    */
    function protectLatex(content) {
    return content.replace(/(?<![`$>\-])\${1,2}(?![`$])((?:\\.|[^\\$])+?)(?<![`$])\${1,2}(?![`$<\d])/g
    , (_, latex) => {
    if(latex.includes("`")||latex.includes("$")){//加入markdown
    latexBlocks.push(_);
    return;}
    latexBlocks.push(_); // 存储内容
    return `@@LATEX${latexBlocks.length - 1}@@`; // 返回占位符
    });
    }
    /**
    * 将占位符替换回原始内容
    * @param {string} content 替换后的内容
    * @returns {string} 恢复后的内容
    */
    function restoreLatex(content) {
    return content.replace(/@@LATEX(\d+)@@/g, (_, idx) => {
    return `${latexBlocks[parseInt(idx, 10)]}`; 
    });
    }
    Markdown.prototype.onUpdate = function (content) {
    if (this.vm.markdown) {
    let oopr=[]
    let part = content.split("```");
    for (var index = 0; index < part.length; index++) {
        var element = part[index];
        if(index%2 !== 1){element = protectLatex(element);oopr.push(element)}
        else oopr.push("\`\`\`"+element+"\`\`\`");
    }
    content = oopr.join('');
    let html = marked(content);
    html = restoreLatex(html);
    latexBlocks = [];
    codeBlocks = [];
    return html;
    }
    }
    Markdown.prototype.onParse = function (node, vm) {
    if (vm.options.markdown) {
    // 中文 id 需要转换,否则无法跳转
    if (vm.options.useAnchor && node.attrs && /[\u4e00-\u9fa5]/.test(node.attrs.id)) {
      const id = 't' + index++
      this.vm._ids[node.attrs.id] = id
      node.attrs.id = id
    }
    if (node.name === 'p' || node.name === 'table' || node.name === 'tr' || node.name === 'th' || node.name === 'td' || node.name === 'blockquote' || node.name === 'pre' || node.name === 'code') {
      node.attrs.class = `md-${node.name} ${node.attrs.class || ''}`
    }
    }
    }
    export default Markdown


## 感谢插件
感谢以下优秀的开源插件和库:
- **[zero-markdown-view](https://ext.dcloud.net.cn/plugin?id=9437)**:提供样式和 Markdown 解析更改。
- **[mp-html](https://ext.dcloud.net.cn/plugin?id=805)**:支持 HTML 和富文本渲染,功能全面且性能出色。
这些插件为我的开发和文档撰写提供了极大的帮助,特此致谢!

如有问题或建议,请联系开发者。
ps:第一次写组件,如果该组件有给你带来帮助,可以给我一个小星星吗?拜托了。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问