diff options
author | silverwind <me@silverwind.io> | 2022-09-26 07:50:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-26 13:50:03 +0800 |
commit | ec0a06e52c67dd3aef25afd940d146c4bbae2020 (patch) | |
tree | 84c13a0adfd2926183c5425949a97a87980fbcbf /modules | |
parent | 2649e7ffbdfb98b29297533a937a7004a44a1a61 (diff) | |
download | gitea-ec0a06e52c67dd3aef25afd940d146c4bbae2020.tar.gz gitea-ec0a06e52c67dd3aef25afd940d146c4bbae2020.zip |
Upgrade chroma to v2.3.0 (#21259)
The behaviour of `PreventSurroundingPre` has changed in
https://github.com/alecthomas/chroma/pull/618 so that apparently it now
causes line wrapper tags to be no longer emitted, but we need some form
of indication to split the HTML into lines, so I did what
https://github.com/yuin/goldmark-highlighting/pull/33 did and added the
`nopWrapper`.
Maybe there are more elegant solutions but for some reason, just
splitting the HTML string on `\n` did not work.
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
Diffstat (limited to 'modules')
-rw-r--r-- | modules/highlight/highlight.go | 39 | ||||
-rw-r--r-- | modules/markup/markdown/markdown.go | 4 | ||||
-rw-r--r-- | modules/markup/orgmode/orgmode.go | 4 | ||||
-rw-r--r-- | modules/markup/orgmode/orgmode_test.go | 8 |
4 files changed, 25 insertions, 30 deletions
diff --git a/modules/highlight/highlight.go b/modules/highlight/highlight.go index af3376e8d7..65ed74b019 100644 --- a/modules/highlight/highlight.go +++ b/modules/highlight/highlight.go @@ -19,10 +19,10 @@ import ( "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" - "github.com/alecthomas/chroma" - "github.com/alecthomas/chroma/formatters/html" - "github.com/alecthomas/chroma/lexers" - "github.com/alecthomas/chroma/styles" + "github.com/alecthomas/chroma/v2" + "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/alecthomas/chroma/v2/lexers" + "github.com/alecthomas/chroma/v2/styles" lru "github.com/hashicorp/golang-lru" ) @@ -147,9 +147,6 @@ func File(fileName, language string, code []byte) ([]string, error) { html.PreventSurroundingPre(true), ) - htmlBuf := bytes.Buffer{} - htmlWriter := bufio.NewWriter(&htmlBuf) - var lexer chroma.Lexer // provided language overrides everything @@ -180,23 +177,21 @@ func File(fileName, language string, code []byte) ([]string, error) { return nil, fmt.Errorf("can't tokenize code: %w", err) } - err = formatter.Format(htmlWriter, styles.GitHub, iterator) - if err != nil { - return nil, fmt.Errorf("can't format code: %w", err) - } - - _ = htmlWriter.Flush() + tokensLines := chroma.SplitTokensIntoLines(iterator.Tokens()) + htmlBuf := &bytes.Buffer{} - // at the moment, Chroma generates stable output `<span class="line"><span class="cl">...\n</span></span>` for each line - htmlStr := htmlBuf.String() - lines := strings.Split(htmlStr, `<span class="line"><span class="cl">`) - m := make([]string, 0, len(lines)) - for i := 1; i < len(lines); i++ { - line := lines[i] - line = strings.TrimSuffix(line, "</span></span>") - m = append(m, line) + lines := make([]string, 0, len(tokensLines)) + for _, tokens := range tokensLines { + iterator = chroma.Literator(tokens...) + err = formatter.Format(htmlBuf, styles.GitHub, iterator) + if err != nil { + return nil, fmt.Errorf("can't format code: %w", err) + } + lines = append(lines, htmlBuf.String()) + htmlBuf.Reset() } - return m, nil + + return lines, nil } // PlainText returns non-highlighted HTML for code diff --git a/modules/markup/markdown/markdown.go b/modules/markup/markdown/markdown.go index c0e72fd6ce..fa289986cc 100644 --- a/modules/markup/markdown/markdown.go +++ b/modules/markup/markdown/markdown.go @@ -18,9 +18,9 @@ import ( "code.gitea.io/gitea/modules/setting" giteautil "code.gitea.io/gitea/modules/util" - chromahtml "github.com/alecthomas/chroma/formatters/html" + chromahtml "github.com/alecthomas/chroma/v2/formatters/html" "github.com/yuin/goldmark" - highlighting "github.com/yuin/goldmark-highlighting" + highlighting "github.com/yuin/goldmark-highlighting/v2" meta "github.com/yuin/goldmark-meta" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/parser" diff --git a/modules/markup/orgmode/orgmode.go b/modules/markup/orgmode/orgmode.go index a78531720d..1c02f274ba 100644 --- a/modules/markup/orgmode/orgmode.go +++ b/modules/markup/orgmode/orgmode.go @@ -17,8 +17,8 @@ import ( "code.gitea.io/gitea/modules/setting" "code.gitea.io/gitea/modules/util" - "github.com/alecthomas/chroma" - "github.com/alecthomas/chroma/lexers" + "github.com/alecthomas/chroma/v2" + "github.com/alecthomas/chroma/v2/lexers" "github.com/niklasfasching/go-org/org" ) diff --git a/modules/markup/orgmode/orgmode_test.go b/modules/markup/orgmode/orgmode_test.go index 4fc0a20db2..cd12cd8c17 100644 --- a/modules/markup/orgmode/orgmode_test.go +++ b/modules/markup/orgmode/orgmode_test.go @@ -79,9 +79,9 @@ func HelloWorld() { } #+end_src `, `<div class="src src-go"> -<pre><code class="chroma language-go"><span class="line"><span class="cl"><span class="c1">// HelloWorld prints "Hello World" -</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kd">func</span> <span class="nf">HelloWorld</span><span class="p">()</span> <span class="p">{</span> -</span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"Hello World"</span><span class="p">)</span> -</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre> +<pre><code class="chroma language-go"><span class="c1">// HelloWorld prints "Hello World" +</span><span class="c1"></span><span class="kd">func</span> <span class="nf">HelloWorld</span><span class="p">()</span> <span class="p">{</span> + <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"Hello World"</span><span class="p">)</span> +<span class="p">}</span></code></pre> </div>`) } |