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/highlight/highlight.go | |
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/highlight/highlight.go')
-rw-r--r-- | modules/highlight/highlight.go | 39 |
1 files changed, 17 insertions, 22 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 |