ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

d2-admin 中的 d2-markdown 组件:Markdown 渲染、代码高亮与百度网盘链接增强实战解析

d2-admin 中的 d2-markdown 组件:Markdown 渲染、代码高亮与百度网盘链接增强实战解析 前端企业应用UI组件【免费下载链接】d2-adminAn elegant dashboard项目地址https://gitcode.com/gh_mirrors/d2/d2-admin点击查看免费下载导读d2-markdown是 d2-admin 内置的 Markdown 渲染组件它基于marked与highlight.js实现既支持直接传入 Markdown 字符串source模式也支持通过 HTTP 异步加载.md文件url模式并在渲染层内置了百度网盘分享链接的卡片化增强。本文以项目演示文档 doc.md 为完整示例逐项拆解表格、多语言代码块、引用、网盘链接在 d2-admin 中的真实渲染效果与底层实现原理读完即可在自己的页面中复刻同样的 Markdown 展示能力。一、组件在项目中的定位与入口在 d2-admin 中d2-markdown作为全局扩展组件注册见 src/components/index.jsVue.component(d2-markdown, () import(./d2-markdown))它采用异步组件注册方式只有页面真正使用到该组件时才加载其代码块从而避免拖慢首屏。菜单中对应的演示入口定义在 src/menu/modules/demo-components.js{ path: /demo/components/markdown, title: markdown 解析, icon: file-text-o, children: [ { path: /demo/components/markdown/source, title: 指定资源 }, { path: /demo/components/markdown/url, title: 异步加载文件 } ] }可以看到组件在项目中提供了两个典型使用场景演示页面使用方式数据来源指定资源source:sourcedoc本地 import 的 Markdown 字符串异步加载文件urlurlmarkdown/demo.md通过 HTTP GET 远程拉取路由注册位于 src/router/modules/plugins.js两个页面均挂在demo-plugins菜单下其中source对应 source.vueurl对应 url.vue。二、组件完整参数说明d2-markdown对外暴露了 4 个可配置属性全部定义在 src/components/d2-markdown/index.vue属性类型默认值作用urlString远程 Markdown 文件地址设置后组件以异步方式加载并渲染sourceString直接传入的 Markdown 原始字符串设置后组件同步渲染highlightBooleanfalse是否启用代码高亮启用后代码块会交给 highlight.js 处理baidupanBooleantrue是否启用百度网盘分享链接的特殊卡片样式默认开启组件初始化逻辑mounted如下mounted () { if (this.url) { this.initWithUrl() } else if (this.source) { this.initWithMd() } else { console.log(not mounted init) } }即优先使用url其次使用source两者都为空时组件不会渲染任何内容。渲染完成后HTML 通过v-html写入.markdown-body容器加载期间会显示正在加载提示。三、演示文档 doc.md 全貌一份完整的 Markdown 特性清单doc.md 是source模式的演示文档它本身就是一份刻意编排的 Markdown 测试样例覆盖了组件支持的主要语法特性。其原始内容如下# 一级标题 | ID | Name | Email | | --- | --- | --- | | 0001 | FairyEver | 1711467488qq.com | js // 注释 [].forEach.call($$(*), a { a.style.outline1px solid #(~~(Math.random()*(124))).toString(16) })div pHello World/p /divbody { background-color: #333; }一般引用引用文字分享一个我很早前的一副设计作品 借此演示百度云链接的显示优化https://pan.baidu.com/s/1kW6uUwB设计源文件链接: https://pan.baidu.com/s/1ggFW21l 密码: 877yhttps://github.com/d2-projects这份文档实际上覆盖了如下渲染能力 - **标题**# 一级标题 对应 h1 渲染 - **表格**ID / Name / Email 三列表格交由 marked 的 GFM 表格扩展渲染 - **代码块**JavaScript、HTML、CSS 三种语言代码块用于验证代码高亮 - **引用块**普通 引用文字 被渲染为标准 blockquote - **百度网盘链接**两种格式的网盘分享信息纯链接、链接密码被插件识别并替换为卡片样式 - **普通链接**文档末尾的超链接按标准 Markdown 链接渲染。 ## 四、核心渲染流程marked highlight.js 的协作 组件的渲染核心在 marked 方法中[src/components/d2-markdown/index.vue](https://link.gitcode.com/i/834b3b6ce252cfcf5817159cf5bd2edc) js marked (data) { const renderer new marked.Renderer() renderer.blockquote (quote) { // 百度网盘 return (this.baidupan bandupan(quote, this.$baseUrl)) || blockquote${quote}/blockquote } return marked(data, { ...this.highlight ? { highlight: (code) highlight.highlightAuto(code).value } : {}, renderer }) }这段代码揭示了三个关键设计代码高亮采用惰性启用只有highlight为true时才会向marked传入highlight回调回调内部使用highlight.highlightAuto(code)自动识别语言并返回高亮后的 HTML。演示页面 source.vue 正是这样使用的d2-markdown :sourcedoc highlight/自定义 Renderer 拦截 blockquote通过重写renderer.blockquote让所有引用块先经过bandupan插件检测只有被识别为百度网盘链接时才返回卡片 HTML否则回退为标准blockquote输出。这是网盘链接增强不破坏普通引用语法的关键。样式基座组件引入github-markdown-css保证.markdown-body下的标题、表格、代码块、引用等元素拥有 GitHub 风格的排版与配色这也是表格能呈现为规范样式的基础。五、百度网盘链接增强插件正则与两种卡片形态网盘链接的识别逻辑封装在独立插件 src/components/d2-markdown/plugin/baidupan.js 中插件接收两个参数quote渲染后的引用 HTML 字符串与assetsPublicPath静态资源公共路径。插件首先剥离引用块内的所有 HTML 标签并去除首尾空白得到纯文本const _quote quote.replace(/[^]/g, ).trim()随后用两条正则匹配两种分享格式// 纯链接格式 const bdPanUrl /^https:\/\/pan\.baidu\.com\/s\/[a-z0-9]$/i // 链接 密码格式 const bdPanUrlPwd /^链接: https:\/\/pan\.baidu\.com\/s\/[a-z0-9] 密码: [a-z0-9]{4}$/i对应 doc.md 中的两种写法 https://pan.baidu.com/s/1kW6uUwB匹配bdPanUrl渲染为图标 完整链接的可点击卡片 链接: https://pan.baidu.com/s/1ggFW21l 密码: 877y匹配bdPanUrlPwd渲染为图标 链接 竖线分隔 密码的复合卡片其中 URL 与密码分别通过正则捕获组提取const url _quote.match(/https:\/\/pan\.baidu\.com\/s\/[a-z0-9]/i) const pwd _quote.match(/[a-z0-9]{4}$/i)卡片 HTML 中的网盘 Logo 取自assetsPublicPath image/baidu-pan-logo.png即 public/image/baidu-pan-logo.png。卡片样式定义在组件内部的baidupanSCSS 块中包括整体容器圆角 4px、1px 边框悬停时边框与分隔线变为主题色$color-primary图标区域固定 40px 宽、图片 40px链接与密码区域按float横向排布密码前以 1px 竖线分隔。需要注意两条正则对格式相当严格链接必须小写字母/数字、密码固定 4 位字符这是插件设计上的边界条件只有严格符合格式的引用才会触发增强其余引用一律走标准blockquote渲染。六、异步加载模式url 属性与请求链路url模式对应的演示文档是 public/markdown/demo.md其内容与 doc.md 结构基本一致表格、代码块、引用、网盘链接用于验证文件放在public目录下、运行时通过 HTTP 拉取的用法。异步加载的实现位于 src/components/d2-markdown/index.vueasync initWithUrl () { this.markedHTML await this.getReadme(this.url) }, async getReadme (url) { const data await FILE_GET(url) return this.marked(data) }其中FILE_GET复用了项目的统一请求封装request见 src/api/_service.jsfunction FILE_GET (url ) { return request({ baseURL: process.env.BASE_URL, url, method: get }) }与常规业务请求不同的是这里将baseURL覆盖为process.env.BASE_URL因此请求的是public目录下的静态资源而非后端接口同时响应拦截器对没有code字段的响应直接返回原始response.data文本内容从而兼容普通文件读取src/api/_service.js 中的response.data.code undefined分支。使用方式非常直接d2-markdown urlmarkdown/demo.md/组件挂载后会自动向markdown/demo.md发起 GET 请求拿到原始 Markdown 文本后走与source模式完全相同的marked()渲染管线。七、实战总结与使用建议综合 doc.md 这份演示文档与组件源码可以得出 d2-admin 中 Markdown 能力的完整使用结论静态内容优先用source将 Markdown 作为模块导入如import doc from ./md/doc.md编译期即可确定内容无网络开销适合文档量少、随包发布的场景动态/大量内容用url文件放入public目录运行时按需拉取方便在不重新构建的情况下更新文档内容需要代码高亮时打开highlight组件使用highlight.highlightAuto自动识别语言JavaScript、HTML、CSS 等常见语言的展示效果均已在演示文档中验证网盘链接增强默认开启只要引用块严格符合两条内置正则格式就会被渲染为带 Logo 的分享卡片若不需要此特性可显式传入:baidupanfalse关闭此时所有引用块回退为标准样式。通过source、url、highlight、baidupan四个属性的组合d2-markdown 已覆盖从组件内嵌文档到独立文档中心的大部分场景这份演示文档即是验证组件渲染能力最直接的清单。赞分享前端企业应用UI组件【免费下载链接】d2-adminAn elegant dashboard项目地址https://gitcode.com/gh_mirrors/d2/d2-admin点击查看免费下载相关推荐Mesop 官方组件 markdown在 Python 中快速渲染 Markdown 文档与代码高亮Mesop 官方组件 markdown在 Python 中快速渲染 Markdown 文档与代码高亮 导读 本文讲解 Mesop 框架内置的 me.markd前端后端Web框架深入解析 Jewel Markdown 代码高亮从 CodeHighlighter 接口到插件渲染管线深入解析 Jewel Markdown 代码高亮从 CodeHighlighter 接口到插件渲染管线 Jewel Markdown 是 JetBrains开发工具IDE代码编辑器DeepChat Chat 与 Markstream 渲染管线流式 Markdown 分段渲染、代码高亮与快照契约实战解析DeepChat Chat 与 Markstream 渲染管线流式 Markdown 分段渲染、代码高亮与快照契约实战解析 本篇技术指南以 DeepChatAI Agent人工智能AI 应用桌面应用MCP Clients创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表