dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit a5b62944ff1ff6e8adea011de13512103646f384
parent 0a4326d3e09a211f3a2a1d1260f05aa9982e3641
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Wed, 18 Jan 2023 19:05:31 -0800

deduplicate blackfriday custom renderer

Diffstat:
Mpkg/database/table_forum_threads.go | 54++----------------------------------------------------
Mpkg/utils/utils.go | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkg/web/handlers/api/v1/topBarHandler.go | 52+---------------------------------------------------
3 files changed, 54 insertions(+), 103 deletions(-)

diff --git a/pkg/database/table_forum_threads.go b/pkg/database/table_forum_threads.go @@ -1,17 +1,14 @@ package database import ( + "dkforest/pkg/utils" html2 "html" - "io" "regexp" "strings" "time" "github.com/sirupsen/logrus" - "github.com/Depado/bfchroma" - "github.com/alecthomas/chroma/formatters/html" - bf "github.com/russross/blackfriday/v2" ) @@ -96,57 +93,10 @@ func (u *ForumMessage) DoSave() { } } -func MyRenderer() *Renderer { - // Defines the HTML rendering flags that are used - var flags = bf.UseXHTML - - r := &Renderer{ - Base: bfchroma.NewRenderer( - bfchroma.WithoutAutodetect(), - bfchroma.ChromaOptions( - html.WithLineNumbers(true), - html.LineNumbersInTable(true), - ), - bfchroma.Extend( - bf.NewHTMLRenderer(bf.HTMLRendererParameters{ - Flags: flags, - }), - ), - ), - } - return r -} - -type Renderer struct { - Base *bfchroma.Renderer -} - -func (r Renderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { - switch node.Type { - case bf.Text: - if node.Parent.Type != bf.Link { - node.Literal = []byte(html2.UnescapeString(string(node.Literal))) - } - case bf.Code: - node.Literal = []byte(html2.UnescapeString(string(node.Literal))) - case bf.CodeBlock: - node.Literal = []byte(html2.UnescapeString(string(node.Literal))) - } - return r.Base.RenderNode(w, node, entering) -} - -func (r Renderer) RenderHeader(w io.Writer, ast *bf.Node) { - r.Base.RenderHeader(w, ast) -} - -func (r Renderer) RenderFooter(w io.Writer, ast *bf.Node) { - r.Base.RenderFooter(w, ast) -} - func (m *ForumMessage) Escape() string { res := strings.Replace(m.Message, "\r", "", -1) res = html2.EscapeString(res) - resBytes := bf.Run([]byte(res), bf.WithRenderer(MyRenderer()), bf.WithExtensions(bf.CommonExtensions|bf.HardLineBreak)) + resBytes := bf.Run([]byte(res), bf.WithRenderer(utils.MyRenderer(true, true)), bf.WithExtensions(bf.CommonExtensions|bf.HardLineBreak)) res = string(resBytes) // Tags diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go @@ -17,10 +17,14 @@ import ( "encoding/pem" "errors" "fmt" + "github.com/Depado/bfchroma" "github.com/ProtonMail/go-crypto/openpgp" "github.com/ProtonMail/go-crypto/openpgp/armor" "github.com/ProtonMail/go-crypto/openpgp/packet" + "github.com/alecthomas/chroma/formatters/html" "github.com/asaskevich/govalidator" + bf "github.com/russross/blackfriday/v2" + html2 "html" "image" "image/jpeg" "image/png" @@ -979,3 +983,50 @@ func CountUppercase(s string) (count, total int64) { } return } + +func MyRenderer(withLineNumbers, lineNumbersInTable bool) *Renderer { + // Defines the HTML rendering flags that are used + var flags = bf.UseXHTML + + r := &Renderer{ + Base: bfchroma.NewRenderer( + bfchroma.WithoutAutodetect(), + bfchroma.ChromaOptions( + html.WithLineNumbers(withLineNumbers), + html.LineNumbersInTable(lineNumbersInTable), + ), + bfchroma.Extend( + bf.NewHTMLRenderer(bf.HTMLRendererParameters{ + Flags: flags, + }), + ), + ), + } + return r +} + +type Renderer struct { + Base *bfchroma.Renderer +} + +func (r Renderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { + switch node.Type { + case bf.Text: + if node.Parent.Type != bf.Link { + node.Literal = []byte(html2.UnescapeString(string(node.Literal))) + } + case bf.Code: + node.Literal = []byte(html2.UnescapeString(string(node.Literal))) + case bf.CodeBlock: + node.Literal = []byte(html2.UnescapeString(string(node.Literal))) + } + return r.Base.RenderNode(w, node, entering) +} + +func (r Renderer) RenderHeader(w io.Writer, ast *bf.Node) { + r.Base.RenderHeader(w, ast) +} + +func (r Renderer) RenderFooter(w io.Writer, ast *bf.Node) { + r.Base.RenderFooter(w, ast) +} diff --git a/pkg/web/handlers/api/v1/topBarHandler.go b/pkg/web/handlers/api/v1/topBarHandler.go @@ -9,14 +9,11 @@ import ( "dkforest/pkg/utils" "errors" "fmt" - "github.com/Depado/bfchroma" - chtml "github.com/alecthomas/chroma/formatters/html" "github.com/dustin/go-humanize" "github.com/labstack/echo" "github.com/microcosm-cc/bluemonday" bf "github.com/russross/blackfriday/v2" html2 "html" - "io" "net/http" "net/url" "regexp" @@ -323,56 +320,9 @@ func handleCmdError(err error, ctx echo.Context, data chatTopBarData, redirectUR return ctx.Render(http.StatusOK, "chat-top-bar", data) } -func MyRenderer() *Renderer { - // Defines the HTML rendering flags that are used - var flags = bf.UseXHTML - - r := &Renderer{ - Base: bfchroma.NewRenderer( - bfchroma.WithoutAutodetect(), - bfchroma.ChromaOptions( - chtml.WithLineNumbers(false), - chtml.LineNumbersInTable(false), - ), - bfchroma.Extend( - bf.NewHTMLRenderer(bf.HTMLRendererParameters{ - Flags: flags, - }), - ), - ), - } - return r -} - -type Renderer struct { - Base *bfchroma.Renderer -} - -func (r Renderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { - switch node.Type { - case bf.Text: - if node.Parent.Type != bf.Link { - node.Literal = []byte(html2.UnescapeString(string(node.Literal))) - } - case bf.Code: - node.Literal = []byte(html2.UnescapeString(string(node.Literal))) - case bf.CodeBlock: - node.Literal = []byte(html2.UnescapeString(string(node.Literal))) - } - return r.Base.RenderNode(w, node, entering) -} - -func (r Renderer) RenderHeader(w io.Writer, ast *bf.Node) { - r.Base.RenderHeader(w, ast) -} - -func (r Renderer) RenderFooter(w io.Writer, ast *bf.Node) { - r.Base.RenderFooter(w, ast) -} - func convertMarkdown(in string) string { out := strings.Replace(in, "\r", "", -1) - resBytes := bf.Run([]byte(out), bf.WithRenderer(MyRenderer()), bf.WithExtensions( + resBytes := bf.Run([]byte(out), bf.WithRenderer(utils.MyRenderer(false, false)), bf.WithExtensions( bf.NoIntraEmphasis|bf.Tables|bf.FencedCode| bf.Strikethrough|bf.SpaceHeadings| bf.DefinitionLists|bf.HardLineBreak|bf.NoLink))