From d3fc2d1739188cbe00981e924de240212032f821 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Fri, 20 Nov 2020 12:51:59 -0500 Subject: [PATCH] Implement rainbow parens --- support/lite/plugins/rainbowparen.lua | 58 +++++++++++++++++++++++ vendor/lite/data/plugins/rainbowparen.lua | 1 + 2 files changed, 59 insertions(+) create mode 100644 support/lite/plugins/rainbowparen.lua create mode 120000 vendor/lite/data/plugins/rainbowparen.lua diff --git a/support/lite/plugins/rainbowparen.lua b/support/lite/plugins/rainbowparen.lua new file mode 100644 index 0000000..b2689f0 --- /dev/null +++ b/support/lite/plugins/rainbowparen.lua @@ -0,0 +1,58 @@ +local tokenizer = require "core.tokenizer" +local style = require "core.style" +local common = require "core.common" + +local tokenize = tokenizer.tokenize +local closers = { + ["("] = ")", + ["["] = "]", + ["{"] = "}" +} +local function parenstyle(parenstack) + return "paren" .. ((#parenstack % 5) + 1) +end +function tokenizer.tokenize(syntax, text, state) + state = state or {} + local res, istate = tokenize(syntax, text, state.istate) + local parenstack = state.parenstack or "" + local newres = {} + -- split parens out + -- the stock tokenizer can't do this because it merges identical adjacent tokens + for i, type, text in tokenizer.each_token(res) do + if type == "normal" or type == "symbol" then + for normtext1, paren, normtext2 in text:gmatch("([^%(%[{}%]%)]*)([%(%[{}%]%)]?)([^%(%[{}%]%)]*)") do + if #normtext1 > 0 then + table.insert(newres, type) + table.insert(newres, normtext1) + end + if #paren > 0 then + if paren == parenstack:sub(-1) then -- expected closer + parenstack = parenstack:sub(1, -2) + table.insert(newres, parenstyle(parenstack)) + elseif closers[paren] then -- opener + table.insert(newres, parenstyle(parenstack)) + parenstack = parenstack .. closers[paren] + else -- unexpected closer + table.insert(newres, "paren_unbalanced") + end + table.insert(newres, paren) + end + if #normtext2 > 0 then + table.insert(newres, type) + table.insert(newres, normtext2) + end + end + else + table.insert(newres, type) + table.insert(newres, text) + end + end + return newres, { parenstack = parenstack, istate = istate } +end + +style.syntax.paren_unbalanced = style.syntax.paren_unbalanced or { common.color "#DC0408" } +style.syntax.paren1 = style.syntax.paren1 or { common.color "#FC6F71"} +style.syntax.paren2 = style.syntax.paren2 or { common.color "#fcb053"} +style.syntax.paren3 = style.syntax.paren3 or { common.color "#fcd476"} +style.syntax.paren4 = style.syntax.paren4 or { common.color "#52dab2"} +style.syntax.paren5 = style.syntax.paren5 or { common.color "#5a98cf"} diff --git a/vendor/lite/data/plugins/rainbowparen.lua b/vendor/lite/data/plugins/rainbowparen.lua new file mode 120000 index 0000000..a198667 --- /dev/null +++ b/vendor/lite/data/plugins/rainbowparen.lua @@ -0,0 +1 @@ +../../../../support/lite/plugins/rainbowparen.lua \ No newline at end of file