A lightweight MoonBit implementation of a supported Typst-style markup subset with parser, layout engine, and SVG/PDF/HTML renderers.
flowchart LR
A["Typst 源码 (.typ)"] --> B["词法分析器 (parser/lexer)"]
B --> C["Token 流 + 源码位置 Span"]
C --> D["递归下降解析器 (parser/parser)"]
D --> E["文档 AST (core.Doc)"]
E --> F["脚本求值与级联样式 (eval)"]
F --> G["流式几何盒模型引擎 (layout)"]
G --> H["几何盒模型树 (LayoutBox)"]
H --> I["PDF 1.4 二进制生成器 (render/pdf)"]
H --> J["SVG 矢量渲染器 (render/svg)"]
E --> K["HTML5 语义渲染器 (render/html)"]
I --> L["标准 PDF 文件 (.pdf)"]
J --> M["自包含矢量图 (.svg)"]
K --> N["响应式网页 (.html)"]| 语法特性 | Typst 标记写法 | 支持状态 | 渲染输出表现 |
|---|---|---|---|
| 多级标题 | = 一级标题, == 二级标题, === 三级标题 | 已实现 | 层级字体缩放、下划线隔断、自动排版间距 |
| 行内样式 | *粗体*, _斜体_, `行内代码` | 已实现 | 字体加粗/倾斜、等宽字符盒、HTML 语义化映射 |
| 超链接 | [文字](https://...) | 已实现 | 可点击链接、高亮样式与悬停下划线 |
| 代码块 | ```moonbit ... ``` | 已实现 | 等宽字体盒、代码底色块、保留缩进与换行 |
| 列表排版 | - 无序项, + 有序项 | 已实现 | 自动排布项目圆点、自动编号递增(1., 2., ...) |
| 高等数学 | $ frac(a, b) $, $ sqrt(x) $, $ x^2_i $ | 已实现 | 居中公式块、公式斜体、分数线对齐、根号上横线 |
| 矩阵与向量 | $ mat(1, 2; 3, 4) $, $ vec(x, y, z) $ | 已实现 | 动态行列间距计算、数学括号包络与网格排列 |
| 算子与重音 | $ sum $, $ int $, $ hat(x) $, $ tilde(y) $ | 已实现 | 大型上下标基准线定位、字母顶置符号修饰 |
| 几何图形 | #rect(...), #circle(...) | 已实现 | 自定义填充色、边框宽度、圆角半径矢量绘制 |
| 网格布局 | #grid(columns: (1fr, 1fr), ...) | 已实现 | 弹性比例与固定尺寸分栏排版 |
| 级联样式 | #set text(size: 12pt), #set page(...) | 已实现 | 动态修改上下文默认字号、颜色、多栏列数 |
| 多目标输出 | PDF 1.4, SVG 1.1, HTML5 | 已实现 | 对应格式的文档输出 |
| Target | Status | Notes |
| :--- | :---: | ---: |
| native | supported | SVG/PDF/HTML |
| js | supported | HTML |moon add Lxxbv/moon_typst{
"import": [
"Lxxbv/moon_typst/core",
"Lxxbv/moon_typst/diag",
"Lxxbv/moon_typst/eval",
"Lxxbv/moon_typst/parser",
"Lxxbv/moon_typst/layout",
"Lxxbv/moon_typst/render"
]
}import "Lxxbv/moon_typst/parser" as @parser
import "Lxxbv/moon_typst/layout" as @layout
import "Lxxbv/moon_typst/render" as @render
import "Lxxbv/moon_typst/core" as @core
pub fn compile_typst(source : String) -> Unit {
// 1. 解析源码为 AST
let doc = @parser.parse_typst(source)
// 2. 配置样式上下文并计算流式盒模型
let style = @core.StyleContext::default()
let engine = @layout.LayoutEngine::new(style)
let page = engine.layout_doc(doc)
// 3. 生成 Adobe PDF 1.4 二进制数据
let pdf_data = @render.render_pdf(page)
// 4. 生成矢量 SVG 图形
let svg_data = @render.render_svg(page)
// 5. 生成语义化 HTML5 页面
let html_data = @render.render_html(doc)
}moon build# 1. 编译为标准 PDF 1.4 二进制文件
moon run cmd/main -- examples/paper.typ -p -o examples/paper.pdf
# 生成包含中文文本的 PDF 示例
moon run cmd/main -- examples/chinese.typ -p -o examples/chinese.pdf
# 2. 编译为矢量 SVG 图形
moon run cmd/main -- examples/paper.typ --svg -o examples/paper.svg
# 3. 编译为响应式 HTML5 网页
moon run cmd/main -- examples/paper.typ --html -o examples/paper.html
# 4. 查看所有选项与帮助信息
moon run cmd/main -- --helpmoon version --all
moon bench benchmarks --target native --release --deny-warn
moon bench benchmarks --target wasm-gc --release --deny-warn
moon bench benchmarks --target js --release --deny-warn| 目标 | HTML | SVG | |
|---|---|---|---|
| native | 46.22 ± 0.53 µs (45.52–46.99 µs) | 130.85 ± 2.85 µs (127.21–134.71 µs) | 1.03 ± 0.29 ms (0.57–1.58 ms) |
| wasm-gc | 14.09 ± 0.32 µs (13.75–14.79 µs) | 46.58 ± 0.56 µs (45.86–47.42 µs) | 544.24 ± 98.58 µs (318.18–661.11 µs) |
| js | 15.92 ± 0.59 µs (15.06–17.09 µs) | 47.25 ± 1.28 µs (46.00–49.70 µs) | 1.06 ± 0.39 ms (0.38–1.73 ms) |
Install
Download zipA lightweight MoonBit implementation of a supported Typst-style markup subset with parser, layout engine, and SVG/PDF/HTML renderers.