|
|
@@ -1,64 +0,0 @@
|
|
|
-package highlight
|
|
|
-
|
|
|
-import (
|
|
|
- "context"
|
|
|
- "fmt"
|
|
|
- "os"
|
|
|
- "path/filepath"
|
|
|
-
|
|
|
- sitter "github.com/tree-sitter/go-tree-sitter/bindings/go"
|
|
|
-)
|
|
|
-
|
|
|
-type HighlightEngine struct {
|
|
|
- parser *sitter.Parser
|
|
|
- wasmDir string
|
|
|
- languages map[string]*sitter.Language
|
|
|
-}
|
|
|
-
|
|
|
-func NewHighlightEngine() (*HighlightEngine, error) {
|
|
|
- home, err := os.UserHomeDir()
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- wasmDir := filepath.Join(home, ".config", "moose", "tree-sitter")
|
|
|
-
|
|
|
- return &HighlightEngine{
|
|
|
- parser: sitter.NewParser(),
|
|
|
- wasmDir: wasmDir,
|
|
|
- languages: make(map[string]*sitter.Language),
|
|
|
- }, nil
|
|
|
-}
|
|
|
-
|
|
|
-func (h *HighlightEngine) LoadLanguage(ctx context.Context, langName string) (*sitter.Language, error) {
|
|
|
- if lang, exists := h.languages[langName]; exists {
|
|
|
- return lang, nil
|
|
|
- }
|
|
|
-
|
|
|
- wasmFile := fmt.Sprintf("tree-sitter-%s.wasm", langName)
|
|
|
- wasmPath := filepath.Join(h.wasmDir, wasmFile)
|
|
|
-
|
|
|
- wasmBytes, err := os.ReadFile(wasmPath)
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("failed to read grammar %s: %w", wasmPath, err)
|
|
|
- }
|
|
|
-
|
|
|
- lang, err := sitter.NewWasmLanguage(ctx, wasmBytes, fmt.Sprintf("tree_sitter_%s", langName))
|
|
|
- if err != nil {
|
|
|
- return nil, fmt.Errorf("failed to load WASM language %s: %w", langName, err)
|
|
|
- }
|
|
|
-
|
|
|
- h.languages[langName] = lang
|
|
|
- return lang, nil
|
|
|
-}
|
|
|
-
|
|
|
-func (h *HighlightEngine) ParseBuffer(ctx context.Context, langName string, content []byte) (*sitter.Tree, error) {
|
|
|
- lang, err := h.LoadLanguage(ctx, langName)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- h.parser.SetLanguage(lang)
|
|
|
- tree := h.parser.Parse(content, nil)
|
|
|
- return tree, nil
|
|
|
-}
|