commit a5b62944ff1ff6e8adea011de13512103646f384
parent 0a4326d3e09a211f3a2a1d1260f05aa9982e3641
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Wed, 18 Jan 2023 19:05:31 -0800
deduplicate blackfriday custom renderer
Diffstat:
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))