Pamphlet 能做什么

你现在看的这个页面就是一个 .md 文件编译出来的。它是一个文件,没有任何外部请求,把它存下来发给别人,对方双击就能打开。

源文档就藏在这份 HTML 里,跑 pamphlet extract 能原样取回来。

这一页把支持的语法全部用了一遍,所以它同时是每一套内置主题的样张:同一份源文档换一套主题,看到的差别全部来自主题本身。

标题有六级

一级标题是文档标题本身,不进目录。下面这些是二到六级。

三级标题

目录默认收到三级(toc.deep: 3)。

四级标题

再往下就不进目录了,但字号、间距、颜色仍然由主题决定。

五级标题
六级标题

正文里能写的东西

段落里可以有粗体、斜体、粗斜体、删除线、行内代码、站内链接、外部链接,以及裸地址 https://lazygophers.github.io/pamphlet/。

引用块。主题不同,它可能是一条左线、一段缩进,也可能被排成一条「决策记录」。

引用块里可以继续写粗体和 代码。


上面那条是分隔线。

三种列表

无序列表:

有序列表:

  1. 第一步
  2. 第二步

    1. 子步骤
    2. 子步骤
  3. 第三步

任务列表(GFM,只读,点不动):

提示块

四种,各自一个指令名。

不写标题也行:

可以点的面板

关掉 JavaScript 再看这一段——三个面板会全部展开,标题变成普通小节标题,一个字都不会丢。

部署视图

两个可用区,每区三台。数据库主从跨区。

数据库故障切换靠 DNS,切换窗口约 30 秒。

成本视图

项月成本占比
计算¥ 8,40064%
存储¥ 1,2009%
流量¥ 3,60027%

风险视图

  • DNS 切换那 30 秒是全站不可用的
  • 跨区流量费按量计,压测时容易超

上面那张表三列分别是左对齐、右对齐、居中——GFM 的对齐语法照常生效。

可以折叠的段落

点开看细节

折叠用的是浏览器原生的 <details>,所以没有 JavaScript 时它照样能点开。

运行时只多做一件事:展开时把标题写进网址,方便你把「展开状态」直接发给别人。

这个默认是展开的

加 {open} 就是默认展开,对应原生的 <details open>。

步骤

  1. 装一次

    npm i -g @nekoleapuki/pamphlet-cli
  2. 编译

    pamphlet build 方案.md

    得到 方案.html,双击打开。

  3. 发出去

    一个文件,不用附带任何东西。

编号是浏览器算的,所以源文档里写 1. 1. 1. 也会渲染成 1、2、3。

滚动入场

这一段滚动到视野里才淡入。它只做视觉节奏,不承载任何信息——关掉 JavaScript 或者打开系统的「减少动态效果」,它就是一段普通文字。

图表是提前画好的

下面这些图在编译的时候就画成 SVG 了。打开这个页面时不会去下载任何绘图库,也不会在你的浏览器里现场计算布局。

它们的颜色跟着主题走:编译时把引擎输出的固定色值换成 CSS 变量,不是给两套图——整个过程一行 JavaScript 都没有。图可以用滚轮缩放、按住拖动,双击复位。

流程图

自有写法:先列节点、再列连线。

:::flow[编译的四步]{dir=LR}
nodes:
  src = "方案.md"
  parse = "解析"
  render = "画图"
  out = "方案.html"
edges:
  src -> parse
  parse -> render
  render -> out
:::

真的画出来是这样:

方案.md

解析

画图

方案.html

编译的四步

同一张图用 ```mermaid 围栏写也行,两套写法永久并存:

方案.md

解析

画图

组装

方案.html

时序图

浏览器编译器作者浏览器编译器作者pamphlet build 方案.md画图、子集化字体、内嵌资源方案.html双击打开零外部请求

状态图

有图表围栏

纯文字

解析

画图

组装

类图

Theme

+string name

+Record purpose

+ThemeTokens light

+ThemeTokens dark

+string css

ThemeTokens

+string bg

+string fg

+string primary

实体关系图

编译成

含有

引用

源文档

产物

图表围栏

资源

甘特图

03-0303-0503-0703-0903-1103-1303-1503-1703-1903-2103-23定方案 评审 编译器改动 主题与文档 真机核对 设计实现发布一次改版的排期

饼图

48%17%12%11%9%3%产物体积构成图表 SVG样式正文 HTML源文档运行时骨架

架构图

源文档图表引擎图表缓存产物编译阶段

系统上下文图(C4)

作者[Person]写 Markdown 的人Pamphlet[Software System]把一份 .md 编译成一个 HTML读者的浏览器[Software System]双击打开产物pamphlet build一个自包含的 HTML 文件谁在用 Pamphlet

数据流图

方案.md

AST

SVG

方案.html

作者

解析

画图

组装

图表缓存

读者

方框是外部的人,圆角是处理步骤,圆柱是存起来的东西——这是数据流图的老规矩。

思维导图

Pamphlet

语法

指令

图表围栏

主题

配色

版式

产物

自包含

git 分支图

mainthemes初始十三套主题深色缺省

块图

方案.md

方案.html

解析

画图

组装

泳道图

这一种 Mermaid 画不了,SVG 由 Pamphlet 自己算布局、自己生成。

下单流程用户订单服务支付服务提交订单锁库存扣款出单

组织架构图

技术团队技术部前端组张三李四后端组王五

数据图表

月度请求量180一月120二月180三月150

图片是内嵌的

图片在编译时编码成 base64 写进产物,所以断网、拷到 U 盘里都一样能看。

一份 Markdown 编译成一个 HTML 文件

路径相对于源文档所在目录。远程图片直接报错——否则产物就不再是自包含的了。

代码与表格

代码块按语言高亮:

export function assembleRuntime(features: Iterable<string>): string {
  const used = RUNTIME_FEATURES.filter((f) => [...features].includes(f))
  if (used.length === 0) return ''   // 一个特性都没用到就一个字节都不放
  return [KERNEL, ...used.map((f) => FRAGMENTS[f]), BOOT].join('\n')
}
pamphlet build "docs/**/*.md" --theme incident --fail-on-warn
---
title: 架构方案
theme: architecture
toc:
  enable: true
---

不标语言的代码块是纯文本:

error[DIR-204] tab 缺少指令标题
  --> 方案.md:3:1

表格:

承诺怎么验的
打开时零外部请求真 Chromium 打开产物,拦网络层数请求数
内容安全策略认哈希注入一段脚本,浏览器必须拒绝执行它
没有 JavaScript 也能读关掉 JavaScript 打开,面板内容仍然全可见
深色是缺省读 getComputedStyle,逐套主题验

这个文件有多大

编译时加 --verbose 会把体积拆开给你看:哪一项占了多少、gzip 之后是多少。不设上限,只摊开给你自己判断。