mirror of
https://github.com/usestrix/strix.git
synced 2026-08-20 10:33:34 +02:00
feat(tui): replace Textual with a Go/Bubble Tea interface (#941)
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/alecthomas/chroma/v2"
|
||||
"github.com/alecthomas/chroma/v2/formatters"
|
||||
"github.com/alecthomas/chroma/v2/lexers"
|
||||
"github.com/alecthomas/chroma/v2/styles"
|
||||
)
|
||||
|
||||
// HighlightCode ports the Python renderers' pygments highlighting: colorize
|
||||
// code for the terminal using the "native" style, falling back to the plain
|
||||
// text when the language is unknown or the highlighter fails.
|
||||
func HighlightCode(code, language string) string {
|
||||
if strings.TrimSpace(code) == "" {
|
||||
return code
|
||||
}
|
||||
var lexer chroma.Lexer
|
||||
if language != "" {
|
||||
lexer = lexers.Get(language)
|
||||
}
|
||||
if lexer == nil {
|
||||
lexer = lexers.Analyse(code)
|
||||
}
|
||||
if lexer == nil {
|
||||
return Col(Text).Render(code)
|
||||
}
|
||||
lexer = chroma.Coalesce(lexer)
|
||||
style := styles.Get("native")
|
||||
formatter := formatters.Get("terminal256")
|
||||
iterator, err := lexer.Tokenise(nil, code)
|
||||
if err != nil {
|
||||
return Col(Text).Render(code)
|
||||
}
|
||||
var out strings.Builder
|
||||
if err := formatter.Format(&out, style, iterator); err != nil {
|
||||
return Col(Text).Render(code)
|
||||
}
|
||||
return strings.TrimSuffix(out.String(), "\n")
|
||||
}
|
||||
|
||||
// languageForPath resolves a chroma language name from a file path, returning
|
||||
// "" when the extension is unknown.
|
||||
func languageForPath(path string) string {
|
||||
if path == "" {
|
||||
return ""
|
||||
}
|
||||
lexer := lexers.Match(filepath.Base(path))
|
||||
if lexer == nil {
|
||||
return ""
|
||||
}
|
||||
return lexer.Config().Name
|
||||
}
|
||||
|
||||
// ParseFencedCode ports parse_fenced_code: strip a surrounding ``` fence and
|
||||
// return the declared language (if any) and the inner code.
|
||||
func ParseFencedCode(raw string) (language, code string) {
|
||||
trimmed := strings.TrimSpace(raw)
|
||||
if !strings.HasPrefix(trimmed, "```") {
|
||||
return "", raw
|
||||
}
|
||||
lines := strings.Split(trimmed, "\n")
|
||||
if len(lines) < 2 || strings.TrimSpace(lines[len(lines)-1]) != "```" {
|
||||
return "", raw
|
||||
}
|
||||
language = strings.TrimSpace(strings.TrimPrefix(lines[0], "```"))
|
||||
return language, strings.Join(lines[1:len(lines)-1], "\n")
|
||||
}
|
||||
Reference in New Issue
Block a user