- 前端
- CLI
【免费下载链接】nodeppt
This is probably the best web presentation tool so far!
本文基于仓库 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')); //  运行时页面则在 [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 带循环的消息自环  ### 5.3 甘特图  ### 5.4 流程图内嵌 FontAwesome 图标  ### 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 表格排版:
| equation | description |
|---|---|
| $\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 的写法迁移到自己的演示文稿,只需三步:
- 复制文件顶部的 YAML 配置段,按需声明
js(echarts 主题脚本)与plugins(echarts: {theme: ...}、mermaid: {theme: ...}、katex); - 用
<slide image="..." .dark>、<slide video="... poster='...' .dark">、<slide youtube="id='...' autoplay loop">编写媒体背景页; - 用
```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!
相关推荐
如何用nodeppt Mermaid插件绘制专业流程图:零基础入门指南
如何用nodeppt Mermaid插件绘制专业流程图:零基础入门指南 nodeppt是一款功能强大的Web演示工具,它提供了丰富的插件生态系统,其中Merma
前端CLIMermaid 数学公式渲染配置指南:用 KaTeX 在图表中嵌入 LaTeX/MathML 表达式
Mermaid 数学公式渲染配置指南:用 KaTeX 在图表中嵌入 LaTeX/MathML 表达式 本文围绕 Mermaid(v10.9.0+)的数学公式(M
图表库前端数据可视化3步搞定专业流程图:nodeppt Mermaid插件完全指南
3步搞定专业流程图:nodeppt Mermaid插件完全指南 还在为演示文稿中的图表制作而头疼吗?nodeppt Mermaid插件让你用纯文本就能创建精美的
前端CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考