diff options
author | Hans Hagen <pragma@wxs.nl> | 2021-06-24 19:37:45 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg@phi-gamma.net> | 2021-06-24 19:37:45 +0200 |
commit | 820657bb1e9acfb36f24dfa8801526b0d5f2b464 (patch) | |
tree | fc93fd3936e84b9b0a6402719e185d35e332eee9 /scripts/context/lua/mtx-interface.lua | |
parent | 4272a26c49cbfee8917e5272fc0f964cbcfc4b03 (diff) | |
download | context-820657bb1e9acfb36f24dfa8801526b0d5f2b464.tar.gz |
2021-06-24 18:52:00
Diffstat (limited to 'scripts/context/lua/mtx-interface.lua')
-rw-r--r-- | scripts/context/lua/mtx-interface.lua | 138 |
1 files changed, 112 insertions, 26 deletions
diff --git a/scripts/context/lua/mtx-interface.lua b/scripts/context/lua/mtx-interface.lua index a335560fa..ec2da63cc 100644 --- a/scripts/context/lua/mtx-interface.lua +++ b/scripts/context/lua/mtx-interface.lua @@ -7,9 +7,9 @@ if not modules then modules = { } end modules ['mtx-cache'] = { } local concat, sort, insert = table.concat, table.sort, table.insert -local gsub, format, gmatch, find = string.gsub, string.format, string.gmatch, string.find +local gsub, format, gmatch, find, upper = string.gsub, string.format, string.gmatch, string.find, string.upper local utfchar, utfgsub = utf.char, utf.gsub -local sortedkeys = table.sortedkeys +local sortedkeys, sortedhash, serialize = table.sortedkeys, table.sortedhash, table.serialize local helpinfo = [[ <?xml version="1.0"?> @@ -32,6 +32,7 @@ local helpinfo = [[ <flag name="bbedit"><short>generate bbedit interface files</short></flag> <flag name="jedit"><short>generate jedit interface files</short></flag> <flag name="textpad"><short>generate textpad interface files</short></flag> + <flag name="vim"><short>generate vim interface files</short></flag> <flag name="text"><short>create text files for commands and environments</short></flag> <flag name="raw"><short>report commands to the console</short></flag> <flag name="check"><short>generate check file</short></flag> @@ -71,19 +72,19 @@ local messageinterfaces = { 'en','cs','de','it','nl','ro','fr','pe','no' } local function collect(filename,class,data) if data then - local result = { } - for name, list in table.sortedhash(data) do - result[#result+1] = format("keywordclass.%s.%s=\\\n",class,name) + local result, r = { }, 0 + for name, list in sortedhash(data) do + r = r + 1 ; result[r] = format("keywordclass.%s.%s=\\\n",class,name) for i=1,#list do if i%5 == 0 then - result[#result+1] = "\\\n" + r = r + 1 ; result[r] = "\\\n" end - result[#result+1] = format("%s ",list[i]) + r = r + 1 ; result[r] = format("%s ",list[i]) end - result[#result+1] = "\n\n" + r = r + 1 ; result[r] = "\n\n" end io.savedata(file.addsuffix(filename,"properties"),concat(result)) - io.savedata(file.addsuffix(filename,"lua"), table.serialize(data,true)) + io.savedata(file.addsuffix(filename,"lua"),serialize(data,true)) else os.remove(filename) end @@ -127,18 +128,18 @@ function flushers.jedit(collected) for interface, whatever in next, collected do local commands = whatever.commands local environments = whatever.environments - local result = { } - result[#result+1] = "<?xml version='1.0'?>" - result[#result+1] = "<!DOCTYPE MODE SYSTEM 'xmode.dtd'>\n" - result[#result+1] = "<MODE>" - result[#result+1] = "\t<RULES>" - result[#result+1] = "\t\t<KEYWORDS>" + local result, r = { }, 0 + r = r + 1 ; result[r] = "<?xml version='1.0'?>" + r = r + 1 ; result[r] = "<!DOCTYPE MODE SYSTEM 'xmode.dtd'>\n" + r = r + 1 ; result[r] = "<MODE>" + r = r + 1 ; result[r] = "\t<RULES>" + r = r + 1 ; result[r] = "\t\t<KEYWORDS>" for i=1,#commands do - result[#result+1] = format("\t\t\t<KEYWORD2>%s</KEYWORD2>",commands[i]) + r = r + 1 ; result[r] = format("\t\t\t<KEYWORD2>%s</KEYWORD2>",commands[i]) end - result[#result+1] = "\t\t</KEYWORDS>" - result[#result+1] = "\t</RULES>" - result[#result+1] = "</MODE>" + r = r + 1 ; result[r] = "\t\t</KEYWORDS>" + r = r + 1 ; result[r] = "\t</RULES>" + r = r + 1 ; result[r] = "</MODE>" io.savedata(format("context-jedit-%s.xml",interface), concat(result),"\n") end end @@ -147,18 +148,100 @@ function flushers.bbedit(collected) for interface, whatever in next, collected do local commands = whatever.commands local environments = whatever.environments - local result = {} - result[#result+1] = "<?xml version='1.0'?>" - result[#result+1] = "<key>BBLMKeywordList</key>" - result[#result+1] = "<array>" + local result, r = { }, 0 + r = r + 1 ; result[r] = "<?xml version='1.0'?>" + r = r + 1 ; result[r] = "<key>BBLMKeywordList</key>" + r = r + 1 ; result[r] = "<array>" for i=1,#commands do - result[#result+1] = format("\t<string>\\%s</string>",commands[i]) + r = r + 1 ; result[r] = format("\t<string>\\%s</string>",commands[i]) end - result[#result+1] = "</array>" + r = r + 1 ; result[r] = "</array>" io.savedata(format("context-bbedit-%s.xml",interface), concat(result),"\n") end end +-- The Vim export is maintained by Nicola Vitacolonna: + +local function vimcollect(filename,class,data) + if data then + local result, r = { }, 0 + local endline = " contained\n" + if find(class,"^meta") then + endline = "\n" + end + r = r + 1 ; result[r] = "vim9script\n\n" + r = r + 1 ; result[r] = "# Vim syntax file\n" + r = r + 1 ; result[r] = "# Language: ConTeXt\n" + r = r + 1 ; result[r] = format("# Automatically generated by mtx-interface (%s)\n\n", os.date()) + local n = 5 -- number of keywords per row + for name, list in sortedhash(data) do + local i = 1 + while i <= #list do + r = r + 1 ; result[r] = format("syn keyword %s%s", class, (gsub(name,"^%l",upper))) -- upper is fragile + local j = 0 +-- while i+j <= #list and j < n do +-- if list[i+j] == "transparent" then -- this is a Vim keyword +-- r = r + 1 ; result[r] = format(" %s[]",list[i+j]) +-- else +-- r = r + 1 ; result[r] = format(" %s",list[i+j]) +-- end +-- j = j + 1 +-- end + while j < n do + local lij = list[i + j] + if not lij then + break + elseif lij == "transparent" then -- this is a Vim keyword + r = r + 1 ; result[r] = format(" %s[]",lij) + else + r = r + 1 ; result[r] = format(" %s",lij) + end + j = j + 1 + end + r = r + 1 ; result[r] = endline + i = i + n + end + end + io.savedata(file.addsuffix(filename,"vim"),concat(result)) + else + os.remove(filename) + end +end + +function flushers.vim(collected) + local data = { } + -- for interface, whatever in next, collected do + -- data[interface] = whatever.commands + -- end + local function add(target,origin,field) + if origin then + local list = origin[field] + if list then + for i=1,#list do + target[list[i]] = true + end + end + end + end + -- + for interface, whatever in next, collected do + local combined = { } + add(combined,whatever,"commands") + add(combined,whatever,"environments") + if interface == "common" then + add(combined,whatever,"textnames") + add(combined,whatever,"mathnames") + end + data[interface] = sortedkeys(combined) + end + -- + vimcollect("context-data-interfaces", "context", data) + -- vimcollect("context-data-metapost", "metapost", dofile(resolvers.findfile("mult-mps.lua"))) + vimcollect("context-data-metafun", "metafun", dofile(resolvers.findfile("mult-fun.lua"))) + vimcollect("context-data-context", "context", dofile(resolvers.findfile("mult-low.lua"))) + vimcollect("context-data-tex", "tex", dofile(resolvers.findfile("mult-prm.lua"))) +end + function flushers.raw(collected) for interface, whatever in next, collected do local commands = whatever.commands @@ -749,7 +832,7 @@ elseif ea("bidi") then scripts.interface.bidi() elseif ea("check") then scripts.interface.check() -elseif ea("scite") or ea("bbedit") or ea("jedit") or ea("textpad") or ea("text") or ea("raw") then +elseif ea("scite") or ea("bbedit") or ea("jedit") or ea("textpad") or ea("vim") or ea("text") or ea("raw") then if ea("scite") then scripts.interface.editor("scite") end @@ -762,6 +845,9 @@ elseif ea("scite") or ea("bbedit") or ea("jedit") or ea("textpad") or ea("text") if ea("textpad") then scripts.interface.editor("textpad",true, { "en" }) end + if ea("vim") then + scripts.interface.editor("vim",true, { "en" }) + end if ea("text") then scripts.interface.editor("text") end |