forked from forgejo/forgejo
Add .gitattribute assisted language detection to blame, diff and render (#17590)
Use check attribute code to check the assigned language of a file and send that in to chroma as a hint for the language of the file. Signed-off-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
parent
81a4fc7528
commit
3c4724d70e
13 changed files with 223 additions and 97 deletions
|
@ -55,7 +55,7 @@ func NewContext() {
|
|||
}
|
||||
|
||||
// Code returns a HTML version of code string with chroma syntax highlighting classes
|
||||
func Code(fileName, code string) string {
|
||||
func Code(fileName, language, code string) string {
|
||||
NewContext()
|
||||
|
||||
// diff view newline will be passed as empty, change to literal \n so it can be copied
|
||||
|
@ -69,9 +69,23 @@ func Code(fileName, code string) string {
|
|||
}
|
||||
|
||||
var lexer chroma.Lexer
|
||||
if val, ok := highlightMapping[filepath.Ext(fileName)]; ok {
|
||||
//use mapped value to find lexer
|
||||
lexer = lexers.Get(val)
|
||||
|
||||
if len(language) > 0 {
|
||||
lexer = lexers.Get(language)
|
||||
|
||||
if lexer == nil {
|
||||
// Attempt stripping off the '?'
|
||||
if idx := strings.IndexByte(language, '?'); idx > 0 {
|
||||
lexer = lexers.Get(language[:idx])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if lexer == nil {
|
||||
if val, ok := highlightMapping[filepath.Ext(fileName)]; ok {
|
||||
//use mapped value to find lexer
|
||||
lexer = lexers.Get(val)
|
||||
}
|
||||
}
|
||||
|
||||
if lexer == nil {
|
||||
|
@ -119,7 +133,7 @@ func CodeFromLexer(lexer chroma.Lexer, code string) string {
|
|||
}
|
||||
|
||||
// File returns a slice of chroma syntax highlighted lines of code
|
||||
func File(numLines int, fileName string, code []byte) []string {
|
||||
func File(numLines int, fileName, language string, code []byte) []string {
|
||||
NewContext()
|
||||
|
||||
if len(code) > sizeLimit {
|
||||
|
@ -139,8 +153,16 @@ func File(numLines int, fileName string, code []byte) []string {
|
|||
htmlw := bufio.NewWriter(&htmlbuf)
|
||||
|
||||
var lexer chroma.Lexer
|
||||
if val, ok := highlightMapping[filepath.Ext(fileName)]; ok {
|
||||
lexer = lexers.Get(val)
|
||||
|
||||
// provided language overrides everything
|
||||
if len(language) > 0 {
|
||||
lexer = lexers.Get(language)
|
||||
}
|
||||
|
||||
if lexer == nil {
|
||||
if val, ok := highlightMapping[filepath.Ext(fileName)]; ok {
|
||||
lexer = lexers.Get(val)
|
||||
}
|
||||
}
|
||||
|
||||
if lexer == nil {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue