forked from NYANDEV/forgejo
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>
This commit is contained in:
parent
2649e7ffbd
commit
ec0a06e52c
7 changed files with 40 additions and 43 deletions
|
@ -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)
|
||||
tokensLines := chroma.SplitTokensIntoLines(iterator.Tokens())
|
||||
htmlBuf := &bytes.Buffer{}
|
||||
|
||||
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()
|
||||
}
|
||||
|
||||
_ = htmlWriter.Flush()
|
||||
|
||||
// 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)
|
||||
}
|
||||
return m, nil
|
||||
return lines, nil
|
||||
}
|
||||
|
||||
// PlainText returns non-highlighted HTML for code
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue