mark/mermaid/mermaid.go

56 lines
1.3 KiB
Go
Raw Normal View History

2023-09-01 22:59:04 +02:00
package mermaid
import (
"bytes"
"context"
"strconv"
"time"
mermaid "github.com/dreampuf/mermaid.go"
2024-09-26 15:24:39 +02:00
"github.com/kovetskiy/mark/attachment"
2023-09-06 16:19:09 -07:00
"github.com/reconquest/pkg/log"
)
2023-10-23 21:09:49 +02:00
var renderTimeout = 90 * time.Second
2023-09-06 16:19:09 -07:00
func ProcessMermaidLocally(title string, mermaidDiagram []byte, scale float64) (attachment.Attachment, error) {
ctx, cancel := context.WithTimeout(context.TODO(), renderTimeout)
defer cancel()
2023-09-06 16:19:09 -07:00
log.Debugf(nil, "Setting up Mermaid renderer: %q", title)
renderer, err := mermaid.NewRenderEngine(ctx)
if err != nil {
2023-09-01 22:59:04 +02:00
return attachment.Attachment{}, err
}
2023-09-06 16:19:09 -07:00
log.Debugf(nil, "Rendering: %q", title)
pngBytes, boxModel, err := renderer.RenderAsScaledPng(string(mermaidDiagram), scale)
if err != nil {
2023-09-01 22:59:04 +02:00
return attachment.Attachment{}, err
}
2023-09-01 22:59:04 +02:00
checkSum, err := attachment.GetChecksum(bytes.NewReader(mermaidDiagram))
2023-09-06 16:19:09 -07:00
log.Debugf(nil, "Checksum: %q -> %s", title, checkSum)
if err != nil {
2023-09-01 22:59:04 +02:00
return attachment.Attachment{}, err
}
if title == "" {
title = checkSum
}
fileName := title + ".png"
2023-09-01 22:59:04 +02:00
return attachment.Attachment{
ID: "",
Name: title,
Filename: fileName,
FileBytes: pngBytes,
Checksum: checkSum,
Replace: title,
Width: strconv.FormatInt(boxModel.Width, 10),
Height: strconv.FormatInt(boxModel.Height, 10),
}, nil
}