news 2026/10/14 2:02:39

nodeppt 富媒体与插件实战指南:背景视频、echarts 图表、mermaid 流程图与 KaTeX 数学公式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
nodeppt 富媒体与插件实战指南:背景视频、echarts 图表、mermaid 流程图与 KaTeX 数学公式
  • 前端
  • CLI

【免费下载链接】nodeppt

This is probably the best web presentation tool so far!

项目地址:https://gitcode.com/gh_mirrors/no/nodeppt
点击查看免费下载

本文基于仓库 site/media.md 编写,该文件是 nodeppt 官方“富媒体 & 插件演示”页面(media.html)的 Markdown 源码,完整演示了 slide 背景媒体(图片、视频、YouTube)与三大插件(echarts、mermaid、KaTeX)的编写方式。读完本文,你将掌握如何在 nodeppt 中用<slide>标签配置媒体背景、用 fence 代码块嵌入可交互图表,并理解这些语法在 nodeppt-parser 与 nodeppt-js 中的解析与运行时实现原理。

nodeppt 2.0 的 Markdown 文件由两部分组成:文件顶部的 YAML 配置(front matter)和以<slide>分隔的单页内容。本文以 site/media.md 为骨架,逐段还原其演示内容,并深入 解析器源码、运行时插件 与 HTML 模板,帮助你在自己的演示文稿中直接复用这些写法。

一、文件骨架:YAML 配置与 slide 拆分

media.md 开头是标准的 YAML 配置段:

title: nodeppt 富媒体&插件演示 speaker: 三水清 url: https://github.com/ksky521/nodeppt js: - https://www.echartsjs.com/asset/theme/infographic.js plugins: - echarts: {theme: infographic} - katex

各配置项含义(见 packages/nodeppt/README.md):

  • title:浏览器标签页标题与文档标题;
  • speaker:演讲者姓名;
  • url:演示地址;
  • js:在 body 之前注入的脚本数组,这里用于引入 echarts 的infographic主题文件;
  • plugins:声明启用的插件。当写成- echarts: {theme: infographic}这种"插件名 + 配置对象"形式时,配置会被单独提取为pluginsOptions。对应实现见 yaml-parser.js:遍历plugins数组,若元素是对象,则取其第一个键作为插件名,值存入pluginSettings[key],最终挂在settings.pluginsOptions上,并输出为模板里的window.pluginsOptions(见 index.ejs)。

内容区则按正则\n<slide\s*(.*)>拆分,每个<slide>块独立解析为一个<section class="slide">,内部 Markdown 渲染进<div class="wrap" wrap="true">(见 get-parser.js)。

二、Media:slide 的三种媒体背景

media.md 的 "Media" 章节演示了<slide>的三种媒体属性,它们都由 slide.js 在 posthtml 阶段处理。

2.1 图片背景:image 属性

<slide class="bg-black-blue aligncenter" image="https://source.unsplash.com/Zq_K89I9E-8/ .dark">

image属性的取值是"图片地址 + 空格 + 若干 class 修饰符"。解析逻辑(slide.js)会把地址拆出,把修饰符解析为 class 并生成一个<span class="background ..." style="background-image:url('...')">前置到 slide 内容之前。除dark、light、anim三个特殊修饰符外,其余会映射为background-<position>形式的类(如right-bottom、center-top),对应background-position定位。

2.2 视频背景:video 属性

<slide class="bg-black" video="https://webslides.tv/static/videos/working.mp4 poster='https://webslides.tv/static/images/working.jpg'">
  • 视频地址放在video属性的第一个空格分隔段;
  • poster='...'指定封面图;
  • 叠加层修饰符.dark(暗色蒙层)或.light(亮色蒙层)用于保证前景文字的对比度:
<slide class="bg-blue aligncenter" video="https://webslides.tv/static/videos/working.mp4 poster='https://webslides.tv/static/images/working.jpg' .dark">

底层实现(slide.js)会生成:

<video class="background-video dark" loop="" muted="" autoplay="autoplay" preload="true" poster="..."> <source src="https://webslides.tv/static/videos/working.mp4" /> </video>

值得注意的实现细节:解析器默认强制注入loop: true, muted: true与autoplay、preload属性;并且video的 src 支持逗号分隔多个视频源(src.split(',')逐个生成<source>),方便为不同格式准备多个文件。

2.3 YouTube 背景:youtube 属性

<slide class="fullscreen bg-blue" youtube=".dark id='_m67JbGjWnc' autoplay loop" :class="aligncenter">

youtube属性同样遵循"修饰符 + key=value"语法,其中id指定视频 ID,另有autoplay、loop等开关。解析器(slide.js)会把id转为data-youtube-id,其余参数转为data-*属性,并生成一个默认带dark叠加、class 为embed的容器 div;若未提供任何 class 修饰符,默认补dark。该容器用于承接 WebSlides 的 YouTube 嵌入播放器。

2.4 关于:class与内容区属性

media.md 中多次出现:class="aligncenter"或:class="size-60"。冒号前缀的属性会被归入 wrap 区:解析器将:xxx剥离冒号后,合并到 slide 内<div class="wrap" wrap="true">上(slide.js),因此:class控制的是内容容器而非 section 本身,size-60、aligncenter这类布局类都作用于内容区。

三、插件机制总览:fence 代码块即配置

echarts、mermaid、KaTeX 三个插件共用同一条编写路径:在 Markdown 中使用带特定语言名的 fenced code block。解析器在 get-markdown-parser.js 中注册:

mdIt.use(require('./markdown/echarts')); // ```echarts mdIt.use(require('./markdown/mermaid')); // ![mermaid](https://web-api.gitcode.com/mermaid/svg/eNrLTfEs0SstTtUoSi0szSxK1VB3yC7OrjQ1MtTPTSzKTskvz9PNLNHNTixJrVDX1LRW0NdXUNHT01NRANJghgoAAU0Tqw) 运行时页面则在 [index.ejs](https://link.gitcode.com/i/4c0580fa64b8c6f7f28599b4af7320b1#L33-L39) 中按 `plugins` 声明按需注入 CDN 脚本(echarts 4.8.0、mermaid 8.5.2),KaTeX 在头部引入 `katex.min.css`(`plugins` 含 `katex` 时,[index.ejs](https://link.gitcode.com/i/4c0580fa64b8c6f7f28599b4af7320b1#L23-L25))。 ## 四、echarts 插件:把图表当代码写 ### 4.1 基本用法 media.md 中用 ` ```echarts ` 包裹一段 JS 对象字面量(注意:不是 JSON,可带注释): ```echarts {style="height:100%;width:100%;"} { tooltip: { trigger: 'item', formatter: "{a} <br/>{b}: {c} ({d}%)" }, legend: { orient: 'vertical', x: 'left', data: ['直达', '营销广告', ...] }, series: [ /* 双层环形饼图配置 */ ] }

外层 fence 的 attributes({style="height:100%;width:100%;"})会被透传到渲染出的容器上。解析实现见 echarts.js:用eval执行代码块内容得到配置对象,输出为:

<div class="embed"> <div class="echarts" style="..."></div> </div> <div class="echarts-data" style="display:none">{...JSON...}</div>

配置对象序列化后藏入隐藏的.echarts-data,供运行时读取;若eval失败则渲染为<pre>错误信息</pre>,方便排查语法错误。

4.2 主题与运行时初始化

media.md 顶部通过js引入infographic.js主题,并在plugins中写echarts: {theme: infographic},两者配合即可让整页图表使用该主题配色。运行机制在 plugins/echarts.js:当页面进入(SlideEvents.ENABLE)且图表未初始化时,延时 800ms 读取window.pluginsOptions.echarts.theme作为echarts.init(chartNode, theme)的第二个参数,再解析.echarts-data里的配置并setOption。注意这里theme是 init 时的主题名,而主题定义文件正是由js配置注入的脚本注册到全局 echarts 上的。

4.3 演示案例:双层环形饼图

media.md 中的完整示例是一个"访问来源"双层环形图(内环单选中环、外环带 rich 富文本标签)。完整代码已在上文```echarts块中继承保留,可直接复制进自己的 md 文件使用;同样的示例也出现在 nodeppt-parser 测试用例(那里改为style="height:400px;"高度受限版本)与 site/echarts.md 中。

五、mermaid 插件:流程图、时序图与甘特图

media.md 的 "Plugins: mermaid" 章节演示了四类图形,全部使用 `mermaid sequenceDiagram Alice ->> Bob: Hello Bob, how are you? Bob-->>John: How about you John? Bob--x Alice: I am good thanks! Bob-x John: I am good thanks! Note right of John: Bob thinks a long
long time, so long
that the text does
not fit on a row.

Bob-->Alice: Checking with John... Alice->John: Yes... John, how are you?
### 5.2 带循环的消息自环 ![mermaid](https://web-api.gitcode.com/mermaid/svg/eNplj8FuwjAMhu99CnMf5V5NnZgQIA477A3c1GssTJyl7lDfnjSTOqT5kuj3l_jzSN8TBUcHxiHhrYJcEZOx44jBYC_s6F_6rl3JSnfbthf1oYEziSgs9xfwegdMBLNObwUV1ZgJFPPOk7uWcKmFX7848uANcEAOo4GfozqvoU-MhafQl_NDjSAVVr_g9-knGmtAAfM65c742qVdGxP9IEtd19U6LE8r4g2cEqFtqieNvFleZJHvdLI__ZxvV8uLiswwqPabBxIVZKc) ### 5.3 甘特图 ![mermaid](https://web-api.gitcode.com/mermaid/svg/eNqVU8FugkAQvfsV8wGYiGJjvRGJTZPak5cep-yI28Ku2R2a-vddoIug0NQ5LRnem_fezmaomCfQlECmrTYFMsCbq-luN00S32XJOUEshFQZPMWv-z0IiZnBAg6lSllqhbnkM7CGghyLFBOPtVT3IfYn39jo4pQTkwBG-wmdWgutKKhlkQ0DmM_CaDoLp7OHoD2uPE3sSL_ohqOiwboV1DTzDs1jAAvh8duSSzOMb08OvwgAD0zml2s5hJ__gY86-EWNvw5oYyTLFPOayo6kJBXwkSD1_-ZSEayrzwCa1LphRUdP81yxFKQYTmisk4FKwIe0bu5Fb5emFVvl35rdGHKLAkyWLRy08Ww92w2ND384aeej76EPXo5PNKQEmd7M9UWg29HOEsJgrcPb8BOdllU82N3QhKyT806QVU8F7Nn1v8eWDMN-aIuepobBPxqnUFChXXoZeZoaiiFAdYXHLhaVdnduRtHuuaTt8IYhWh1vLL6g5es3-D-Hjat6yJ2u7nXidP8Acq8_XQ) ### 5.4 流程图内嵌 FontAwesome 图标 ![mermaid](https://web-api.gitcode.com/mermaid/svg/eNpFzDsKgDAQRdHeVQyptMgGFBR_O7ATi1EnJoVJGANu30hAX3su72D0GqYhg7huFgpLhTLcJgRiUI7BE24klhRIWfdzala0r69m38n-POSJL2-sJS6qT8a8hWQbnsQomQK7-M8a_dUU1QN31io5) ### 5.5 解析与运行时 解析阶段([markdown/mermaid.js](https://link.gitcode.com/i/cb77d573c5b93f70a38cd434abdc77a4))把 fence 内容包进 `<div class="embed"><pre class="lang-mermaid no-style">...</pre></div>`,fence 上的 attributes 透传给 `<pre>`。运行时([plugins/mermaid.js](https://link.gitcode.com/i/6fff23f84720cbb7a62c690843fe94f5))在 slide 进入时读取 `window.pluginsOptions.mermaid.theme`(默认 `default`)执行 `mermaid.initialize({theme})`,随后 `mermaid.init` 渲染该节点,并用 `slide.mermaidInit` 标志保证只渲染一次、且渲染前先恢复节点可见(`visibility: 'visible'`)。 媒体演示中未显式声明 mermaid 主题,若想换主题,参考 [site/mermaid.md](https://link.gitcode.com/i/0112915fb45592198d1f11a2bffe4155) 顶部写法: ```yaml plugins: - mermaid: {theme: forest}

六、KaTeX 插件:Markdown 表格里的数学公式

media.md 的 "Plugins: KaTex" 章节演示了用 KaTeX 渲染麦克斯韦方程组。启用方式仅需在 YAML 中声明- katex。正文中的行内公式使用$...$语法(由@ksky521/markdown-it-katex支持,见 get-markdown-parser.js),配合 Markdown 表格排版:

equationdescription
$\nabla \cdot \vec{\mathbf{B}} = 0$divergence of $\vec{\mathbf{B}}$ is zero
$\nabla \times \vec{\mathbf{E}}, +, \frac1c, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$curl of $\vec{\mathbf{E}}$ is proportional to the rate of change of $\vec{\mathbf{B}}$
$\nabla \times \vec{\mathbf{B}} -, \frac1c, \frac{\partial\vec{\mathbf{E}}}{\partial t} = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} = 4 \pi \rho$wha?

同一示例同样出现在 nodeppt-parser 测试用例 中,可作为回归验证样例。

七、页面导航与串联演示

media.md 结尾用<nav>组件将富媒体页与其余官方演示串联起来:

<nav class="aligncenter"> * :fa-th-large: Layout * :fa-tv: Background * :fa-magic: Animation * :fa-cube: Component * :fa-css3: Classes </nav>

其中:fa-th-large:等是 nodeppt 的 FontAwesome 图标语法(:fa-xxx:→<i class="fa fa-xxx"></i>,实现见 markdown/fa.js),.button、.button.ghost等按钮样式与text-landing、text-subtitle、text-intro、text-shadow等排版类在整个演示中反复出现,属于 WebSlides 体系内置样式。这些导航指向的演示在仓库中分别有对应 Markdown 源码可查阅:

  • site/layout.md(布局)
  • site/background.md(背景)
  • site/animation.md(动效)
  • site/component.md(组件)
  • site/index.md(样式类)

八、从演示到实践

将 media.md 的写法迁移到自己的演示文稿,只需三步:

  1. 复制文件顶部的 YAML 配置段,按需声明js(echarts 主题脚本)与plugins(echarts: {theme: ...}、mermaid: {theme: ...}、katex);
  2. 用<slide image="..." .dark>、<slide video="... poster='...' .dark">、<slide youtube="id='...' autoplay loop">编写媒体背景页;
  3. 用```echarts、```mermaid、$...$编写图表、流程图与公式,然后通过nodeppt serve slide.md本地预览、nodeppt build slide.md产出静态站点(命令说明见 packages/nodeppt/README.md)。

配合:class="size-60"、aligncenter等容器类与text-landing、text-intro排版类,即可快速拼出 media.html 同级别的"富媒体 + 数据可视化 + 数学公式"综合演示页。

  • 前端
  • CLI

【免费下载链接】nodeppt

This is probably the best web presentation tool so far!

项目地址:https://gitcode.com/gh_mirrors/no/nodeppt
点击查看免费下载
上一篇:10分钟上手flatpickr:Angular日期选择器的优雅实现方案
下一篇:突破路径规划瓶颈:多传感器融合在gh_mirrors/pa/PathPlanning中的实践指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 2:02:37

Harvester 集群 Provider 检测库 kubernetes-provider-detector 原理与实践

云原生虚拟化存储后端高可用 【免费下载链接】harvester Open source hyperconverged infrastructure (HCI) software 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ha/harvester 点击查看 免费下载 导读 本文围绕 Harvester 仓库 vendor 目录中引入的 Rancher 开源…

作者头像 李华
网站建设 2026/10/14 2:01:44

机器学习概述PPT怎么做?从概念到项目流程拆解

简介&#xff1a;这份资源是《机器学习》课程第一章的配套PPT课件&#xff0c;面向刚接触机器学习的学生或自学者&#xff0c;帮助快速建立该学科的整体认知框架。全包共1个文件&#xff0c;格式为pptx演示文稿&#xff0c;压缩后大小约10.28MB&#xff0c;内容可直接编辑放映&…

作者头像 李华
网站建设 2026/10/14 2:01:35

多地域高可用架构总收口:一张总架构图 + 一套运维 Runbook 完整梳理

本文是我自己整理多地域架构的收尾笔记&#xff0c;纯粹是个人学习与运维实践记录&#xff0c;不涉及任何商业推广&#xff0c;文中不会出现任何购买链接或联系方式。所有配置和命令&#xff0c;请先在你自己的测试环境里验证过再上生产。写在前面 前前后后折腾了挺长时间&…

作者头像 李华
网站建设 2026/10/14 1:58:41

Django购物商城系统实战:MTV架构、订单支付与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华