From 76f100ca778b9273c58a1cc750f377785cdf0441 Mon Sep 17 00:00:00 2001 From: TorchedSammy <38820196+TorchedSammy@users.noreply.github.com> Date: Sat, 26 Mar 2022 18:25:19 -0400 Subject: [PATCH] feat: expose syntax highlighting (closes #125) --- api.go | 8 ++++++++ rl.go | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/api.go b/api.go index 9cfe3c9..9ef51e3 100644 --- a/api.go +++ b/api.go @@ -28,6 +28,7 @@ var exports = map[string]lua.LGFunction { "exec": hlexec, "runnerMode": hlrunnerMode, "goro": hlgoro, + "highlighter": hlhighlighter, "hinter": hlhinter, "multiprompt": hlmlprompt, "prependPath": hlprependPath, @@ -517,3 +518,10 @@ func hlhinter(L *lua.LState) int { return 0 } + +func hlhighlighter(L *lua.LState) int { + highlighterCb := L.CheckFunction(1) + highlighter = highlighterCb + + return 0 +} diff --git a/rl.go b/rl.go index 3956f76..feb6019 100644 --- a/rl.go +++ b/rl.go @@ -14,6 +14,7 @@ type lineReader struct { } var fileHist *fileHistory var hinter lua.LValue = lua.LNil +var highlighter lua.LValue = lua.LNil // other gophers might hate this naming but this is local, shut up func newLineReader(prompt string, noHist bool) *lineReader { @@ -68,6 +69,28 @@ func newLineReader(prompt string, noHist bool) *lineReader { return []rune(hintText) } + rl.SyntaxHighlighter = func(line []rune) string { + if highlighter == lua.LNil { + return string(line) + } + err := l.CallByParam(lua.P{ + Fn: highlighter, + NRet: 1, + Protect: true, + }, lua.LString(string(line))) + if err != nil { + fmt.Println(err) + return string(line) + } + + retVal := l.Get(-1) + highlighted := "" + if luaStr, ok := retVal.(lua.LString); retVal != lua.LNil && ok { + highlighted = luaStr.String() + } + + return highlighted + } rl.TabCompleter = func(line []rune, pos int, _ readline.DelayedTabContext) (string, []*readline.CompletionGroup) { ctx := string(line) var completions []string