Add mermaid tiptap extension

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-04-01 16:48:41 +04:00
parent 679c18c548
commit 9bbcba68c0
9 changed files with 236 additions and 20 deletions

View File

@@ -71,15 +71,23 @@ func renderNode(buf *bytes.Buffer, n Node) error {
if err != nil {
return fmt.Errorf("cannot render code block node: %w", err)
}
buf.WriteString("<pre><code")
if attrs.Language != nil {
writeAttr(buf, "class", "language-"+*attrs.Language)
if attrs.Language != nil && *attrs.Language == "mermaid" {
buf.WriteString(`<pre class="mermaid">`)
if err := renderChildren(buf, n.Content); err != nil {
return err
}
buf.WriteString("</pre>")
} else {
buf.WriteString("<pre><code")
if attrs.Language != nil {
writeAttr(buf, "class", "language-"+*attrs.Language)
}
buf.WriteByte('>')
if err := renderChildren(buf, n.Content); err != nil {
return err
}
buf.WriteString("</code></pre>")
}
buf.WriteByte('>')
if err := renderChildren(buf, n.Content); err != nil {
return err
}
buf.WriteString("</code></pre>")
case NodeHorizontalRule:
buf.WriteString("<hr>")
case NodeHardBreak:

View File

@@ -100,6 +100,18 @@ func TestRenderHTML_CodeBlockWithLanguage(t *testing.T) {
assert.Equal(t, `<pre><code class="language-go">fmt.Println()</code></pre>`, got)
}
func TestRenderHTML_CodeBlockMermaid(t *testing.T) {
t.Parallel()
raw := `{"type":"codeBlock","attrs":{"language":"mermaid"},"content":[{"type":"text","text":"graph TD\n A-->B"}]}`
var n Node
require.NoError(t, json.Unmarshal([]byte(raw), &n))
got, err := RenderHTML(n)
require.NoError(t, err)
assert.Equal(t, "<pre class=\"mermaid\">graph TD\n A--&gt;B</pre>", got)
}
func TestRenderHTML_CodeBlockWithoutLanguage(t *testing.T) {
t.Parallel()