feat: render Markdown, mathematics and Mermaid diagrams server-side

This commit is contained in:
2026-09-27 19:15:50 +02:00
commit 35bc42623b
72 changed files with 8914 additions and 0 deletions
+88
View File
@@ -0,0 +1,88 @@
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
// SPDX-License-Identifier: MIT
package scriptorium
import (
"bytes"
"testing"
)
func TestSupportedDiagram(t *testing.T) {
supported := []string{"flowchart", "graph", "sequenceDiagram"}
for _, kind := range supported {
if !SupportedDiagram(kind) {
t.Errorf("SupportedDiagram(%q) = false, want true", kind)
}
}
refused := []string{"", "stateDiagram-v2", "pie", "gantt", "classDiagram", "Flowchart"}
for _, kind := range refused {
if SupportedDiagram(kind) {
t.Errorf("SupportedDiagram(%q) = true, want false", kind)
}
}
}
func TestRender(t *testing.T) {
got := string(Render([]byte("# Title\n\nHello *world*.\n")))
want := "<h1>Title</h1>\n<p>Hello <em>world</em>.</p>\n"
if got != want {
t.Errorf("Render = %q, want %q", got, want)
}
}
func TestRenderDeterministic(t *testing.T) {
source := []byte("- one\n- two\n\n```go\nfmt.Println(1)\n```\n")
first := Render(source)
for range 5 {
if next := Render(source); !bytes.Equal(first, next) {
t.Fatal("Render of the same source differs between calls")
}
}
}
func TestRenderMath(t *testing.T) {
got := string(RenderMath([]byte(`\frac{1}{2}`)))
want := `<math xmlns="http://www.w3.org/1998/Math/MathML"><mfrac><mn>1</mn><mn>2</mn></mfrac></math>`
if got != want {
t.Errorf("RenderMath = %s, want %s", got, want)
}
}
func TestRenderMathDisplay(t *testing.T) {
got := string(RenderMathDisplay([]byte("x")))
want := `<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><mi>x</mi></math>`
if got != want {
t.Errorf("RenderMathDisplay = %s, want %s", got, want)
}
}
func TestRenderDiagram(t *testing.T) {
out, err := RenderDiagram([]byte("flowchart TD\n A[Start] --> B[End]\n"))
if err != nil {
t.Fatalf("render: %v", err)
}
if !bytes.HasPrefix(out, []byte(`<svg xmlns="http://www.w3.org/2000/svg"`)) {
t.Errorf("RenderDiagram = %s", out)
}
}
func TestRenderDiagramRefuses(t *testing.T) {
if _, err := RenderDiagram([]byte("pie\n \"a\": 1\n")); err == nil {
t.Error("expected a refusal for an unsupported diagram type")
}
}
func TestRenderDiagramDeterministic(t *testing.T) {
source := []byte("sequenceDiagram\n A->>B: hello\n B-->>A: bye\n")
first, err := RenderDiagram(source)
if err != nil {
t.Fatalf("render: %v", err)
}
for range 5 {
next, err := RenderDiagram(source)
if err != nil || !bytes.Equal(first, next) {
t.Fatal("RenderDiagram of the same source differs between calls")
}
}
}