@ -19,10 +19,10 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/setting"
"github.com/alecthomas/chroma"
"github.com/alecthomas/chroma/v2 "
"github.com/alecthomas/chroma/formatters/html"
"github.com/alecthomas/chroma/v2/ formatters/html"
"github.com/alecthomas/chroma/lexers"
"github.com/alecthomas/chroma/v2/ lexers"
"github.com/alecthomas/chroma/styles"
"github.com/alecthomas/chroma/v2/ styles"
lru "github.com/hashicorp/golang-lru"
lru "github.com/hashicorp/golang-lru"
)
)
@ -147,9 +147,6 @@ func File(fileName, language string, code []byte) ([]string, error) {
html . PreventSurroundingPre ( true ) ,
html . PreventSurroundingPre ( true ) ,
)
)
htmlBuf := bytes . Buffer { }
htmlWriter := bufio . NewWriter ( & htmlBuf )
var lexer chroma . Lexer
var lexer chroma . Lexer
// provided language overrides everything
// 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 )
return nil , fmt . Errorf ( "can't tokenize code: %w" , err )
}
}
err = formatter . Format ( htmlWriter , styles . GitHub , iterator )
tokensLines := chroma . SplitTokensIntoLines ( iterator . Tokens ( ) )
if err != nil {
htmlBuf := & bytes . Buffer { }
return nil , fmt . Errorf ( "can't format code: %w" , err )
}
_ = htmlWriter . Flush ( )
// at the moment, Chroma generates stable output `<span class="line"><span class="cl">...\n</span></span>` for each line
lines := make ( [ ] string , 0 , len ( tokensLines ) )
htmlStr := htmlBuf . String ( )
for _ , tokens := range tokensLines {
lines := strings . Split ( htmlStr , ` <span class="line"><span class="cl"> ` )
iterator = chroma . Literator ( tokens ... )
m := make ( [ ] string , 0 , len ( lines ) )
err = formatter . Format ( htmlBuf , styles . GitHub , iterator )
for i := 1 ; i < len ( lines ) ; i ++ {
if err != nil {
line := lines [ i ]
return nil , fmt . Errorf ( "can't format code: %w" , err )
line = strings . TrimSuffix ( line , "</span></span>" )
}
m = append ( m , line )
lines = append ( lines , htmlBuf . String ( ) )
htmlBuf . Reset ( )
}
}
return m , nil
return lines , nil
}
}
// PlainText returns non-highlighted HTML for code
// PlainText returns non-highlighted HTML for code