commit ca5326292d1c758b7b18abd0fbd3a00af2470a2d Author: mritter Date: Tue Oct 3 17:13:48 2023 +0200 init diff --git a/extend.go b/extend.go new file mode 100644 index 0000000..3cd2391 --- /dev/null +++ b/extend.go @@ -0,0 +1,47 @@ +// Package replacer is a extension for the goldmark +// (http://github.com/yuin/goldmark). +// +// This extension adds support for authomaticaly replacing text in markdowns. +package baseurl + +import ( + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/util" +) + +var extender *Extender + +type Extender struct { + BaseURL string + PublicFilePath string +} + +// New return initialized image render with source url replacing support. +func NewExtender(baseURL string, publicFilePath string) goldmark.Extender { + extender = &Extender{ + BaseURL: baseURL, + PublicFilePath: publicFilePath, + } + return extender +} + +func (e *Extender) Extend(m goldmark.Markdown) { + // m.Parser().AddOptions( + // parser.WithASTTransformers( + // util.Prioritized(NewTransformer(), 500), + // ), + // ) + m.Parser().AddOptions( + parser.WithASTTransformers( + util.Prioritized(NewTransformer(), 500), + ), + ) + /* + m.Renderer().AddOptions( + renderer.WithNodeRenderers( + util.Prioritized(NewRenderer(), 500), + ), + ) + */ +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..876b82d --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module gitea.cidb.de/mritter/goldmark-baseurl + +go 1.20 + +require github.com/yuin/goldmark v1.5.6 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..3a4e29a --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/yuin/goldmark v1.5.6 h1:COmQAWTCcGetChm3Ig7G/t8AFAN00t+o8Mt4cf7JpwA= +github.com/yuin/goldmark v1.5.6/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= diff --git a/render.go b/render.go new file mode 100644 index 0000000..9819a89 --- /dev/null +++ b/render.go @@ -0,0 +1,86 @@ +package baseurl + +import ( + "regexp" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type Transformer struct { +} + +func NewTransformer() parser.ASTTransformer { + return &Transformer{} +} + +func (c *Transformer) Transform(node *ast.Document, reader text.Reader, pc parser.Context) { + ast.Walk(node, func(n ast.Node, entering bool) (status ast.WalkStatus, err error) { + if image, ok := n.(*ast.Image); ok { + if entering { + image.SetAttributeString("class", []byte("img-content")) + src := util.BytesToReadOnlyString(image.Destination) + + re := regexp.MustCompile(`(\.\.\/)*\.data/assets/`) + src = re.ReplaceAllString(src, extender.BaseURL+extender.PublicFilePath) + + image.Destination = util.StringToReadOnlyBytes(src) + + } + } + return ast.WalkContinue, nil + }) +} + +// Renderer struct is a renderer.NodeRenderer implementation for the extension. +type Renderer struct { + html.Config +} + +// NewRenderer builds a new Renderer with given options and returns it. +func NewRenderer() renderer.NodeRenderer { + return &Renderer{ + Config: html.NewConfig(), + } +} + +// RegisterFuncs implements NodeRenderer.RegisterFuncs interface. +func (r *Renderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + //reg.Register(ast.KindText, r.renderText) + //reg.Register(ast.KindString, r.renderString) + //reg.Register(ast.KindImage, r.renderImage) +} + +func (r *Renderer) renderImage(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + n := node.(*ast.Image) + _, _ = w.WriteString("`)
+	_, _ = w.Write(n.Text(source))
+	_ = w.WriteByte('") + } else { + _, _ = w.WriteString(">") + } + return ast.WalkSkipChildren, nil + +}