Created markdownify transform template util

This commit is contained in:
Maxim Lebedev 2023-11-10 02:14:15 +06:00
parent d479e245cc
commit 7cf9c53f8a
Signed by: toby3d
GPG Key ID: 1F14E25B7C119FC5
3 changed files with 91 additions and 0 deletions

4
go.mod
View File

@ -10,6 +10,10 @@ require (
require github.com/google/go-cmp v0.6.0
require github.com/yuin/goldmark v1.6.0
require github.com/yuin/goldmark-emoji v1.0.2
require (
github.com/BurntSushi/toml v0.3.1 // indirect
gopkg.in/yaml.v2 v2.3.0 // indirect

5
go.sum
View File

@ -17,6 +17,11 @@ github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD
github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM=
github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8=
github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68=
github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/goldmark-emoji v1.0.2 h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s=
github.com/yuin/goldmark-emoji v1.0.2/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY=
golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=

View File

@ -0,0 +1,82 @@
package transform
import (
"bytes"
"errors"
"fmt"
"html/template"
"reflect"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark-emoji"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
renderer "github.com/yuin/goldmark/renderer/html"
)
type Namespace struct {
markdown goldmark.Markdown
}
var ErrMarkdownify error = errors.New("unsupported input type for Markdownify")
func New() *Namespace {
md := goldmark.New(
// goldmark.WithParser(),
// goldmark.WithRenderer(),
goldmark.WithParserOptions(
parser.WithAutoHeadingID(),
parser.WithAttribute(),
),
goldmark.WithRendererOptions(
renderer.WithUnsafe(),
),
goldmark.WithExtensions(
extension.Table,
extension.Strikethrough,
extension.Linkify,
extension.TaskList,
extension.DefinitionList,
extension.Footnote,
extension.NewTypographer(
extension.WithTypographicSubstitutions(extension.TypographicSubstitutions{
extension.LeftDoubleQuote: []byte(``),
extension.LeftAngleQuote: []byte(`«`),
extension.RightDoubleQuote: []byte(``),
extension.RightAngleQuote: []byte(`»`),
}),
),
emoji.Emoji,
),
)
return &Namespace{
markdown: md,
}
}
func (ns *Namespace) Markdownify(v reflect.Value) (template.HTML, error) {
var err error
buf := bytes.NewBuffer(nil)
switch v.Kind() {
default:
return "", ErrMarkdownify
case reflect.Slice:
switch v.Type().Elem().Kind() {
default:
return "", ErrMarkdownify
case reflect.Uint8:
err = ns.markdown.Convert(v.Bytes(), buf)
}
case reflect.String:
err = ns.markdown.Convert(v.Bytes(), buf)
}
if err != nil {
return "", fmt.Errorf("cannot convert input into markdown: %w", err)
}
return template.HTML(buf.String()), nil
}