aboutsummaryrefslogtreecommitdiffstats
path: root/modules/highlight/highlight.go
diff options
context:
space:
mode:
authorsilverwind <me@silverwind.io>2022-09-26 07:50:03 +0200
committerGitHub <noreply@github.com>2022-09-26 13:50:03 +0800
commitec0a06e52c67dd3aef25afd940d146c4bbae2020 (patch)
tree84c13a0adfd2926183c5425949a97a87980fbcbf /modules/highlight/highlight.go
parent2649e7ffbdfb98b29297533a937a7004a44a1a61 (diff)
downloadgitea-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.go39
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