diff --git a/go.mod b/go.mod index a0b8439..3c2925d 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/gorilla/sessions v1.2.1 github.com/gorilla/websocket v1.5.0 github.com/hacdias/indieauth v1.7.1 - github.com/jlaffaye/ftp v0.0.0-20220301181425-a81b090061fa + github.com/jlaffaye/ftp v0.0.0-20220309012535-813c8a838452 // master github.com/jlelse/feeds v1.2.1-0.20210704161900-189f94254ad4 github.com/justinas/alice v1.2.0 @@ -48,21 +48,20 @@ require ( github.com/spf13/viper v1.10.1 github.com/stretchr/testify v1.7.0 github.com/tdewolff/minify/v2 v2.10.0 - github.com/thoas/go-funk v0.9.1 + github.com/thoas/go-funk v0.9.2 github.com/tkrajina/gpxgo v1.2.1 github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 github.com/vcraescu/go-paginator v1.0.1-0.20201114172518-2cfc59fe05c2 - github.com/yuin/goldmark v1.4.7 + github.com/yuin/goldmark v1.4.8 // master github.com/yuin/goldmark-emoji v1.0.2-0.20210607094911-0487583eca38 - github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 - golang.org/x/crypto v0.0.0-20220214200702-86341886e292 + golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 golang.org/x/net v0.0.0-20220225172249-27dd8689420f golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/text v0.3.7 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b nhooyr.io/websocket v1.8.7 - tailscale.com v1.22.0 + tailscale.com v1.22.1 // main willnorris.com/go/microformats v1.1.2-0.20210827044458-ff2a6ae41971 ) diff --git a/go.sum b/go.sum index a1e1635..204aadb 100644 --- a/go.sum +++ b/go.sum @@ -253,8 +253,8 @@ github.com/insomniacslk/dhcp v0.0.0-20211026125128-ad197bcd36fd h1:jupbuQFZtwOBg github.com/insomniacslk/dhcp v0.0.0-20211026125128-ad197bcd36fd/go.mod h1:h+MxyHxRg9NH3terB1nfRIUaQEcI0XOVkdR9LNBlp8E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jlaffaye/ftp v0.0.0-20220301181425-a81b090061fa h1:Cv45cONl1gg0QBv5rvDBrZycQtJtEJlEloN4IIeVhxg= -github.com/jlaffaye/ftp v0.0.0-20220301181425-a81b090061fa/go.mod h1:oZaomI+9/et52UBjvNU9LCIqmgt816+7ljXCx0EIPzo= +github.com/jlaffaye/ftp v0.0.0-20220309012535-813c8a838452 h1:kqK7woZfi4Y1sIrKu2QxKWa7uDwi1pMeRAzLWG5bWag= +github.com/jlaffaye/ftp v0.0.0-20220309012535-813c8a838452/go.mod h1:oZaomI+9/et52UBjvNU9LCIqmgt816+7ljXCx0EIPzo= github.com/jlelse/feeds v1.2.1-0.20210704161900-189f94254ad4 h1:d2oKwfgLl3ef0PyYDkzjsVyYlBZzNpOpXitDraOnVXc= github.com/jlelse/feeds v1.2.1-0.20210704161900-189f94254ad4/go.mod h1:vt0iOV52/wq97Ql/jp7mUkqyrlEiGQuhHic4bVoHy0c= github.com/joeshaw/gengen v0.0.0-20190604015154-c77d87825f5a/go.mod h1:v2qvRL8Xwk4OlARK6gPlf2JreZXzv0dYp/8+kUJ0y7Q= @@ -431,8 +431,8 @@ github.com/tdewolff/parse/v2 v2.5.27 h1:PL3LzzXaOpmdrknnOlIeO2muIBHAwiKp6TxN1RbU github.com/tdewolff/parse/v2 v2.5.27/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho= github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4= github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= -github.com/thoas/go-funk v0.9.1 h1:O549iLZqPpTUQ10ykd26sZhzD+rmR5pWhuElrhbC20M= -github.com/thoas/go-funk v0.9.1/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= +github.com/thoas/go-funk v0.9.2 h1:oKlNYv0AY5nyf9g+/GhMgS/UO2ces0QRdPKwkhY3VCk= +github.com/thoas/go-funk v0.9.2/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tkrajina/gpxgo v1.2.1 h1:MJJtT4Re5btDGg89brFDrUP3EWz+cBmyo8pQwV0ZOak= github.com/tkrajina/gpxgo v1.2.1/go.mod h1:795sjVRFo5wWyN6oOZp0RYienGGBJjpAlgOz2nCngA0= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= @@ -458,13 +458,10 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.7/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.5/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= -github.com/yuin/goldmark v1.4.7 h1:KHHlQL4EKBZ43vpA1KBEQHfodk4JeIgeb0xJLg7rvDI= -github.com/yuin/goldmark v1.4.7/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= +github.com/yuin/goldmark v1.4.8 h1:zHPiabbIRssZOI0MAzJDHsyvG4MXCGqVaMOwR+HeoQQ= +github.com/yuin/goldmark v1.4.8/go.mod h1:rmuwmfZ0+bvzB24eSC//bk1R1Zp3hM0OXYv/G2LIilg= github.com/yuin/goldmark-emoji v1.0.2-0.20210607094911-0487583eca38 h1:XZjLcLoTPNZuxppY3gwhRqo/T2XF6JMGFFdkAjX3w1w= github.com/yuin/goldmark-emoji v1.0.2-0.20210607094911-0487583eca38/go.mod h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY= -github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 h1:yHfZyN55+5dp1wG7wDKv8HQ044moxkyGq12KFFMFDxg= -github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594/go.mod h1:U9ihbh+1ZN7fR5Se3daSPoz1CGF9IYtSvWwVQtnzGHU= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -486,8 +483,8 @@ golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWP golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= -golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70 h1:syTAU9FwmvzEoIYMqcPHOcVm4H3U5u90WsvuYgwpETU= +golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -840,8 +837,8 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= software.sslmate.com/src/go-pkcs12 v0.0.0-20210415151418-c5206de65a78 h1:SqYE5+A2qvRhErbsXFfUEUmpWEKxxRSMgGLkvRAFOV4= -tailscale.com v1.22.0 h1:/a1f6eKEl9vL/wGFP8mkhe7O1zDRGtWa9Ft2rGp5N80= -tailscale.com v1.22.0/go.mod h1:D2zuDnjHT7v4aCt71c4+ytQUUAGpnypW+DoubYLaHjg= +tailscale.com v1.22.1 h1:ttEGAst31AwzcG/G+rfr+0oKIYVD314DKB3Lig4HsbM= +tailscale.com v1.22.1/go.mod h1:D2zuDnjHT7v4aCt71c4+ytQUUAGpnypW+DoubYLaHjg= willnorris.com/go/microformats v1.1.2-0.20210827044458-ff2a6ae41971 h1:b4juh5znIpBA1KnzHMP0UB4Cs+3/0b0XfchkWE81FXw= willnorris.com/go/microformats v1.1.2-0.20210827044458-ff2a6ae41971/go.mod h1:kvVnWrkkEscVAIITCEoiTX66Hcyg59C7q0E49mb9TJ0= willnorris.com/go/webmention v0.0.0-20211028201829-b0044f1a24d0 h1:3/ozQ2qGZat82ON3AYMTot3gCg/vU7tgn/LYSJbkVPM= diff --git a/highlighting.go b/highlighting.go deleted file mode 100644 index ee590c4..0000000 --- a/highlighting.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import ( - "github.com/alecthomas/chroma/styles" -) - -var chromaGoBlogStyle = styles.Monokai diff --git a/markdown.go b/markdown.go index da4aca4..0bbb973 100644 --- a/markdown.go +++ b/markdown.go @@ -5,10 +5,8 @@ import ( "io" marktag "git.jlel.se/jlelse/goldmark-mark" - chromahtml "github.com/alecthomas/chroma/formatters/html" "github.com/yuin/goldmark" emoji "github.com/yuin/goldmark-emoji" - highlighting "github.com/yuin/goldmark-highlighting" "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/parser" @@ -16,6 +14,7 @@ import ( "github.com/yuin/goldmark/renderer/html" "github.com/yuin/goldmark/util" "go.goblog.app/app/pkgs/bufferpool" + "go.goblog.app/app/pkgs/highlighting" ) func (a *goBlog) initMarkdown() { @@ -38,13 +37,7 @@ func (a *goBlog) initMarkdown() { extension.Linkify, marktag.Mark, emoji.Emoji, - highlighting.NewHighlighting( - highlighting.WithCustomStyle(chromaGoBlogStyle), - highlighting.WithFormatOptions( - chromahtml.ClassPrefix("c-"), - chromahtml.WithClasses(true), - ), - ), + highlighting.Highlighting, ), } publicAddress := "" diff --git a/original-assets/styles/styles.scss b/original-assets/styles/styles.scss index 6faf317..cdb3e86 100644 --- a/original-assets/styles/styles.scss +++ b/original-assets/styles/styles.scss @@ -147,6 +147,12 @@ mark, :not(pre) > code { @extend .invert; } +/* Initial values for Chroma */ +.c-chroma { + background: #fff; + color: #000; +} + code { font-family: monospace; } diff --git a/pkgs/highlighting/highlighting.go b/pkgs/highlighting/highlighting.go new file mode 100644 index 0000000..027864b --- /dev/null +++ b/pkgs/highlighting/highlighting.go @@ -0,0 +1,105 @@ +package highlighting + +import ( + "io" + + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/util" + "go.goblog.app/app/pkgs/bufferpool" + + "github.com/alecthomas/chroma" + chromahtml "github.com/alecthomas/chroma/formatters/html" + "github.com/alecthomas/chroma/lexers" + "github.com/alecthomas/chroma/styles" +) + +type config struct { + html.Config + formatter *chromahtml.Formatter +} + +func newConfig() *config { + return &config{ + Config: html.NewConfig(), + formatter: chromahtml.New( + chromahtml.ClassPrefix("c-"), + chromahtml.WithClasses(true), + ), + } +} + +// SetOption implements renderer.SetOptioner. +func (c *config) SetOption(name renderer.OptionName, value interface{}) { + c.Config.SetOption(name, value) +} + +// htmlRenderer struct is a renderer.NodeRenderer implementation for the extension. +type htmlRenderer struct { + *config +} + +func newHTMLRenderer() renderer.NodeRenderer { + return &htmlRenderer{ + config: newConfig(), + } +} + +// RegisterFuncs implements NodeRenderer.RegisterFuncs. +func (r *htmlRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindFencedCodeBlock, r.renderFencedCodeBlock) +} + +func (r *htmlRenderer) renderFencedCodeBlock(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + + n := node.(*ast.FencedCodeBlock) + + // Read code block content. + buf := bufferpool.Get() + defer bufferpool.Put(buf) + for _, line := range n.Lines().Sliced(0, n.Lines().Len()) { + buf.Write(line.Value(source)) + } + + // Try to highlight. + if highlight(w, buf.String(), string(n.Language(source)), r.formatter) != nil { + // Highlight failed, fallback to plain text. + _, _ = w.WriteString("
")
+		r.Writer.RawWrite(w, buf.Bytes())
+		_, _ = w.WriteString("
\n") + } + + return ast.WalkContinue, nil +} + +func highlight(w io.Writer, source, language string, f *chromahtml.Formatter) error { + l := lexers.Get(language) + if l == nil { + l = lexers.Fallback + } + l = chroma.Coalesce(l) + it, err := l.Tokenise(nil, source) + if err != nil { + return err + } + return f.Format(w, Style, it) +} + +type highlighting struct{} + +// Highlighting is a goldmark.Extender implementation. +var Highlighting = &highlighting{} + +var Style = styles.Monokai + +// Extend implements goldmark.Extender. +func (*highlighting) Extend(m goldmark.Markdown) { + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(newHTMLRenderer(), 200), + )) +} diff --git a/templateAssets.go b/templateAssets.go index e9b6b4f..de4ddaa 100644 --- a/templateAssets.go +++ b/templateAssets.go @@ -14,6 +14,7 @@ import ( chromahtml "github.com/alecthomas/chroma/formatters/html" "go.goblog.app/app/pkgs/bufferpool" "go.goblog.app/app/pkgs/contenttype" + "go.goblog.app/app/pkgs/highlighting" ) const assetsFolder = "templates/assets" @@ -111,7 +112,7 @@ func (a *goBlog) initChromaCSS() error { return nil } // Initialize the style - chromaStyle, err := chromaGoBlogStyle.Builder().Build() + chromaStyle, err := highlighting.Style.Builder().Build() if err != nil { return err } diff --git a/templates/assets/css/styles.css b/templates/assets/css/styles.css index b014cf3..9503564 100644 --- a/templates/assets/css/styles.css +++ b/templates/assets/css/styles.css @@ -105,6 +105,12 @@ mark, :not(pre) > code { font-size: 1rem; } +/* Initial values for Chroma */ +.c-chroma { + background: #fff; + color: #000; +} + code { font-family: monospace; }