MoonBit port of beautiful-mermaid: render Mermaid diagrams to SVG and ASCII/Unicode text.
///|
test "simple_td" (it : @test.Test) {
let svg = try! render_mermaid("graph TD\nA --> B")
assert_true(svg.has_prefix("<svg "))
assert_true(svg.has_suffix("</svg>"))
assert_true(svg.contains(">A</text>"))
assert_true(svg.contains(">B</text>"))
it.write(svg)
it.snapshot(filename="simple_td.svg")
}///|
test {
let ascii = try! render_mermaid_ascii("graph LR\nA --> B")
assert_true(ascii.length() > 0)
assert_true(ascii.contains("A"))
assert_true(ascii.contains("B"))
}///|
test {
let options = RenderOptions::{
bg: Some("#18181B"),
fg: Some("#FAFAFA"),
line: Some("#7aa2f7"),
accent: None,
muted: None,
surface: None,
border: None,
font: Some("Inter"),
padding: None,
node_spacing: None,
layer_spacing: None,
transparent: Some(true),
}
let svg = try! render_mermaid("graph TD\nA --> B", options~)
assert_true(svg.contains("--bg:#18181B"))
assert_true(svg.contains("--line:#7aa2f7"))
}///|
test {
let colors = match theme_by_name("tokyo-night") {
Some(found) => found
None => fail("missing theme")
}
let options = RenderOptions::{
bg: Some(colors.bg),
fg: Some(colors.fg),
line: colors.line,
accent: colors.accent,
muted: colors.muted,
surface: colors.surface,
border: colors.border,
font: None,
padding: None,
node_spacing: None,
layer_spacing: None,
transparent: None,
}
let svg = try! render_mermaid("graph TD\nA --> B", options~)
assert_true(svg.contains("--bg:#1a1b26"))
assert_true(svg.contains("--accent:#7aa2f7"))
}///|
test {
let svg = try! render_mermaid_with_theme_name(
"graph TD\nA --> B", "github-dark",
)
assert_true(svg.contains("--bg:#0d1117"))
assert_true(svg.contains("--accent:#4493f8"))
}///|
test {
let theme = match parse_theme_name("tokyo-night") {
Some(found) => found
None => fail("missing theme")
}
let svg = try! render_mermaid_with_theme("graph TD\nA --> B", theme)
assert_true(svg.contains("--bg:#1a1b26"))
}///|
test {
let shiki_theme = shiki_theme(
Some("dark"),
Some({
"editor.background": "#1a1b26",
"editor.foreground": "#a9b1d6",
"editorLineNumber.foreground": "#565f89",
"focusBorder": "#7aa2f7",
}),
Some([shiki_token_color("comment", Some("#565f89"))]),
)
let colors = from_shiki_theme(shiki_theme)
let svg = try! render_mermaid_with_colors("graph TD\nA --> B", colors)
assert_true(svg.contains("--bg:#1a1b26"))
assert_true(svg.contains("--accent:#7aa2f7"))
}test {
let colors = default_colors()
assert_eq(colors.bg, "#FFFFFF")
assert_eq(colors.fg, "#27272A")
}test {
let svg = try! render_mermaid("graph TD\nA --> B")
assert_true(svg.has_prefix("<svg "))
assert_true(svg.contains(">A</text>"))
}test {
let ascii = try! render_mermaid_ascii("graph LR\nA --> B", options={
use_ascii: true,
padding_x: 5,
padding_y: 5,
box_border_padding: 1,
})
assert_true(ascii.contains("A"))
assert_true(ascii.contains("B"))
}fn render_mermaid_with_colors(text : String, colors : DiagramColors, options? : RenderOptions) -> String raise MermaidErrorfn render_mermaid_with_theme(text : String, theme : ThemeName, options? : RenderOptions) -> String raise MermaidErrorfn render_mermaid_with_theme_name(text : String, theme_name : String, options? : RenderOptions) -> String raise MermaidErrortest {
let svg = try! render_mermaid_with_theme_name(
"graph TD\nA --> B", "TOKYO NIGHT",
)
assert_true(svg.contains("--bg:#1a1b26"))
}fn shiki_dark_theme(colors : Map[String, String]?, token_colors : Array[ShikiTokenColor]?) -> ShikiThemefn shiki_light_theme(colors : Map[String, String]?, token_colors : Array[ShikiTokenColor]?) -> ShikiThemefn shiki_theme(theme_type : String?, colors : Map[String, String]?, token_colors : Array[ShikiTokenColor]?) -> ShikiThemeMoonBit port of beautiful-mermaid: render Mermaid diagrams to SVG and ASCII/Unicode text.