快速上手
安装 limu,布局一张图表,并渲染成 SVG。
limu 有两份实现,Rust 版 limu-rs,其 crate 名为 limu,以及 Go 版 limu。两者布局图表的方式相同,所以在两者一致的地方,这些页面都称它为 limu。limu 把 Mermaid 文本变成场景,场景记录图表每个部分是什么、在哪里。之后由后端绘制场景。本页使用 SVG 后端,它和 limu 本身一样,只需要标准库。示例有 Rust 和 Go 两种写法。用页面顶部或任意示例上方的切换选择语言,整个网站都会跟着切换。
安装
1cargo add limu1go get github.com/firede/limulimu-rs 需要 Rust 1.95 或更高版本。它还很年轻,API 会在 0.x 的版本中改动。
limu 需要 Go 1.27 或更高版本。
绘制图表
limu::layout limu.Layout 读取图表并完成布局,svg::render svg.Render 把得到的场景写成 SVG 文档。
1use limu::scene::style::{Look, Theme};2use limu::scene::svg;34fn main() -> Result<(), limu::Error> {5 let scene = limu::layout(6 "flowchart LR7 text[Mermaid text] --> layout[Layout] --> scene[Scene]",8 &Default::default(),9 )?;10 println!(11 "{}",12 svg::render(13 &scene,14 &svg::Options {15 look: Look::new(Theme::KOHU),16 font_family: Some("Arial, Helvetica, sans-serif".into()),17 ..Default::default()18 },19 )20 );21 Ok(())22}1package main23import (4 "fmt"5 "log"67 "github.com/firede/limu"8 "github.com/firede/limu/style"9 "github.com/firede/limu/svg"10)1112func main() {13 sc, err := limu.Layout(`flowchart LR14 text[Mermaid text] --> layout[Layout] --> scene[Scene]`, nil)15 if err != nil {16 log.Fatal(err)17 }18 fmt.Println(svg.Render(sc, &svg.Options{19 Look: style.Look{Theme: style.Kohu()},20 FontFamily: "Arial, Helvetica, sans-serif",21 }))22}布局默认用一张 Arial 字符宽度表测量文本,即 limu::layout::Arial text.Arial,所以 SVG 应该用 Arial 或宽度相同的字体显示文字。如果用其他字体绘制文本,就要改用这些字体来测量。参见测量文本。
主题决定图表的颜色。SVG 后端把颜色写成 CSS 变量,并以主题的颜色作为回退值,所以页面无需重新渲染图表就能改变颜色。参见主题。
错误
limu 无法读取一张图表时会返回错误,类型是 limu::Error *diagram.Error。错误码说明问题是类型不受支持、文本无法解析,还是文本超出了限制。有位置时,行号和列号会指出它。
1match limu::layout(src, &Default::default()) {2 Ok(scene) => draw(&scene),3 Err(e) => println!("{} at line {}: {}", e.code.as_str(), e.line, e.message),4}1sc, err := limu.Layout(src, nil)2var derr *diagram.Error3if errors.As(err, &derr) {4 fmt.Printf("%s at line %d: %s\n", derr.Code, derr.Line, derr.Message)5}错误信息可能引用图表的文本,所以要把它当作纯文本显示,不要当作 HTML 或 SVG 解析。
适应宽度
把布局的最大宽度 layout::Options::max_width layout.Options.MaxWidth 设为可用的宽度。能变窄的图表会变窄,所以一张宽的流程图可能从横向排列改为纵向排列。不能变窄的图表保持所需的宽度。
1let scene = limu::layout(2 src,3 &limu::layout::Options {4 max_width: 480.0,5 ..Default::default()6 },7)?;1sc, err := limu.Layout(src, &layout.Options{MaxWidth: 480})SVG 的尺寸就是场景的尺寸。要让页面把它进一步缩小,在 CSS 中给它设置 max-width: 100% 和 height: auto。
重新布局
如果同一张图表要布局不止一次,比如可用宽度变了,就用 limu::parse limu.Parse 解析一次,再按需多次布局解析结果。布局不会修改解析出的图表,所以可以在多个 goroutine 或线程中同时进行。
1use limu::layout::Options;23let d = limu::parse(src, &limu::ParseOptions::default())?;4let wide = d.layout(&Options { max_width: 640.0, ..Default::default() })?;5let narrow = d.layout(&Options { max_width: 320.0, ..Default::default() })?;1d, err := limu.Parse(src, diagram.Options{})2if err != nil {3 return err4}5wide, err := d.Layout(&layout.Options{MaxWidth: 640})6narrow, err := d.Layout(&layout.Options{MaxWidth: 320})换主题完全不需要重新布局,用新主题绘制同一个场景即可。
图表类型
Pele 能画的图表类型 limu 都支持,涵盖 Mermaid 内置的所有类型。limu::types limu.Types 列出这些类型。limu::supports limu.Supports 只检查文本声明的类型,不解析其余部分。
1if !limu::supports(src) {2 // 改为把文本当作代码显示。3}1if !limu.Supports(src) {2 // 改为把文本当作代码显示。3}limu crate 为每种图表类型提供一个 feature,默认全部开启。只读取部分类型的程序可以设置 default-features = false,再开启所需类型的 feature,比如 flowchart 和 sequence。feature 关闭的类型会被当作不受支持的图表。