gitea/modules/codeimage/image/image.go

74 lines
1.6 KiB
Go

package image
import (
"bytes"
"embed"
"image/color"
"strings"
"github.com/jbuchbinder/gg"
"github.com/jiro4989/textimg/v3/token"
)
//go:embed fonts
var fonts embed.FS
func Draw(tokens token.Tokens) ([]byte, error) {
foreground := color.RGBA{205, 214, 244, 255}
background := color.RGBA{30, 30, 46, 255}
dc := gg.NewContext(1200, 630)
fgCol := foreground
bgCol := background
dc.SetColor(bgCol)
if err := dc.LoadFontFaceFS(fonts, "fonts/JetBrainsMono-Regular.ttf", 20); err != nil {
return nil, err
}
dc.Clear()
curX, curY := 50.0, 50.0
for _, t := range tokens {
switch t.Kind {
case token.KindColor:
switch t.ColorType {
case token.ColorTypeReset:
fgCol = foreground
bgCol = background
case token.ColorTypeResetForeground:
fgCol = foreground
case token.ColorTypeResetBackground:
bgCol = background
case token.ColorTypeReverse:
fgCol, bgCol = bgCol, fgCol
case token.ColorTypeForeground:
fgCol = color.RGBA(t.Color)
case token.ColorTypeBackground:
bgCol = color.RGBA(t.Color)
}
case token.KindText:
w, h := dc.MeasureMultilineString(t.Text, 1.0)
dc.Push()
dc.SetColor(bgCol)
dc.DrawRectangle(curX, curY, w, h)
dc.Fill()
dc.Pop()
dc.SetColor(fgCol)
dc.DrawStringAnchored(strings.ReplaceAll(strings.ReplaceAll(t.Text, "\t", " "), "\n", ""), curX, curY, 0.0, 1.0)
curX += w
if strings.Contains(t.Text, "\n") {
curY += h
curX = 50
}
}
}
dc.Push()
dc.SetColor(background)
dc.DrawRectangle(1150, 0, 50, 630)
dc.DrawRectangle(0, 580, 1200, 50)
dc.Fill()
dc.Pop()
buffer := new(bytes.Buffer)
dc.EncodePNG(buffer)
return buffer.Bytes(), nil
}