From 2e657baa195eb8a5011a0f08eeb32bd3396ea1bf Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Thu, 25 Jun 2020 12:13:32 +0200 Subject: 2020-06-25 10:58:00 --- tex/context/base/mkiv/toks-scn.lua | 211 +++++++++++++++++++++---------------- 1 file changed, 120 insertions(+), 91 deletions(-) (limited to 'tex/context/base/mkiv/toks-scn.lua') diff --git a/tex/context/base/mkiv/toks-scn.lua b/tex/context/base/mkiv/toks-scn.lua index 09c3e13b2..7ef4ce603 100644 --- a/tex/context/base/mkiv/toks-scn.lua +++ b/tex/context/base/mkiv/toks-scn.lua @@ -22,13 +22,16 @@ local tokenbits = tokens.bits local scanstring = scanners.string local scanargument = scanners.argument +local scandelimited = scanners.delimited -- lmtx local scanverbatim = scanners.verbatim local scantokenlist = scanners.tokenlist +local scantoks = scanners.toks local scaninteger = scanners.integer local scannumber = scanners.number local scankeyword = scanners.keyword local scankeywordcs = scanners.keywordcs local scanword = scanners.word +local scanletters = scanners.letters local scankey = scanners.key local scancode = scanners.code local scanboolean = scanners.boolean @@ -113,23 +116,24 @@ local function scantable(t,data) if not data then data = { } end - local wrapped = scanopen() - while true do --- local key = scanword() - local key = scanword(true) - if key then - local get = t[key] - if get then - data[key] = get() + if t then + local wrapped = scanopen() + while true do + local key = scanword(true) + if key then + local get = t[key] + if get then + data[key] = get() + else + -- catch all we can get + end else - -- catch all we can get + break end - else - break end - end - if wrapped then - scanclose() + if wrapped then + scanclose() + end end return data end @@ -166,42 +170,84 @@ function scanners.whd() end end +-- begin lmtx + +local l = utf.byte("[") +local r = utf.byte("]") + +local function scanbracketed() + local s = scandelimited(l, r) + if s then + return s + else + report_scan("missing argument in line %i of %a", status.linenumber, status.filename) + return "" + end +end + +local function scanoptional() + return scandelimited(l, r) or "" +end + +local function scanbracketedasis() + return scandelimited(l, r, false) +end + +local function scanargumentasis() + return scanargument(false) +end + +scanners.bracketed = scanbracketed +scanners.optional = scanoptional +scanners.bracketedasis = scanbracketedasis +scanners.argumentasis = scanargumentasis + +-- end lmtx + local shortcuts = { - tokens = tokens, - bits = tokenbits, - open = open, - close = close, - scanners = scanners, - scanstring = scanstring, - scanargument = scanargument, - scanverbatim = scanverbatim, - scantokenlist = scantokenlist, - scaninteger = scaninteger, - scannumber = scannumber, - scantable = scantable, - scankeyword = scankeyword, - scankeywordcs = scankeywordcs, - scanword = scanword, - -- scankey = scankey, - scancode = scancode, - scanboolean = scanboolean, - scandimen = scandimen, - scandimension = scandimen, - scanbox = scanners.box, - scanhbox = scanners.hbox, - scanvbox = scanners.vbox, - scanvtop = scanners.vtop, - scanconditional = scanconditional, - scanopen = scanopen, - scanclose = scanclose, - scanlist = scanlist, - scancsname = scancsname, - todimen = todimen, - tonumber = tonumber, - tostring = tostring, - toboolean = toboolean, - inspect = inspect, - report = report_scan, + tokens = tokens, + bits = tokenbits, + open = open, + close = close, + scanners = scanners, + scanstring = scanstring, + scanargument = scanargument, + scanverbatim = scanverbatim, + scantokenlist = scantokenlist, + scantoks = scantoks, + scaninteger = scaninteger, + scannumber = scannumber, + scantable = scantable, -- not directly useable + scankeyword = scankeyword, + scankeywordcs = scankeywordcs, + scanword = scanword, + scanletters = scanletters, + -- scankey = scankey, + scancode = scancode, + scanboolean = scanboolean, + scandimen = scandimen, + scandimension = scandimen, + scanbox = scanners.box, + scanhbox = scanners.hbox, + scanvbox = scanners.vbox, + scanvtop = scanners.vtop, + scanconditional = scanconditional, + scanopen = scanopen, + scanclose = scanclose, + scanlist = scanlist, + scancsname = scancsname, + todimen = todimen, + tonumber = tonumber, + tostring = tostring, + toboolean = toboolean, + inspect = inspect, + report = report_scan, + -- lmtx + scandelimited = scandelimited, -- not directly useable + scanbracketed = scanbracketed, + scanoptional = scanoptional, + scanbracketedasis = scanbracketedasis, + scanargumentasis = scanargumentasis, } tokens.shortcuts = shortcuts @@ -222,25 +268,28 @@ tokens.converters = { toglue = "todimen", } --- We could just pickup a keyword but then we really need to make sure --- that no number follows it when that is the assignment and adding --- an optional = defeats the gain in speed. Currently we have sources --- with no spaces (\startcontextdefinitioncode ...) so it fails there. +-- We could just pickup a keyword but then we really need to make sure that no number +-- follows it when that is the assignment and adding an optional = defeats the gain +-- in speed. Currently we have sources with no spaces (\startcontextdefinitioncode +-- ...) so it fails there. -- --- Another drawback is that we then need to use { } instead of ending --- with \relax (as we can do now) but that is no big deal. It's just --- that I then need to check the TeX end. More pain than gain and a bit --- risky too. +-- Another drawback is that we then need to use { } instead of ending with \relax (as +-- we can do now) but that is no big deal. It's just that I then need to check the TeX +-- end. More pain than gain and a bit risky too. Using scanletters works better, but +-- the gain is only some 10 percent but if we don't have keywords with numbers it might +-- make sense in the end, some day. local f_if = formatters[ " if scankeywordcs('%s') then data['%s'] = scan%s()"] local f_elseif = formatters[" elseif scankeywordcs('%s') then data['%s'] = scan%s()"] ------ f_if = formatters[" local key = scanword() if key == '' then break elseif key == '%s' then data['%s'] = scan%s()"] ------ f_elseif = formatters[" elseif key == '%s' then data['%s'] = scan%s()"] - ----- f_if_x = formatters[ " if not data['%s'] and scankeywordcs('%s') then data['%s'] = scan%s()"] ----- f_elseif_x = formatters[" elseif not data['%s'] and scankeywordcs('%s') then data['%s'] = scan%s()"] +-- if CONTEXTLMTXMODE > 0 then +-- f_if = formatters[" local key = scanletters() if key == '' then break elseif key == '%s' then data['%s'] = scan%s()"] +-- f_elseif = formatters[" elseif key == '%s' then data['%s'] = scan%s()"] +-- end + local f_local = formatters["local scan%s = scanners.%s"] local f_scan = formatters["scan%s()"] local f_shortcut = formatters["local %s = scanners.converters.%s"] @@ -250,9 +299,11 @@ local f_elseif_c = formatters[" elseif scankeywordcs('%s') then data['%s'] = %s local f_scan_c = formatters["%s(scan%s())"] -- see above --- ------ f_if_c = formatters[" local key = scanword() if key == '' then break elseif key == '%s' then data['%s'] = %s(scan%s())"] ------ f_elseif_c = formatters[" elseif k == '%s' then data['%s'] = %s(scan%s())"] + +-- if CONTEXTLMTXMODE > 0 then +-- f_if_c = formatters[" local key = scanletters() if key == '' then break elseif key == '%s' then data['%s'] = %s(scan%s())"] +-- f_elseif_c = formatters[" elseif k == '%s' then data['%s'] = %s(scan%s())"] +-- end local f_any = formatters[" else local key = scanword(true) if key then data[key] = scan%s() else break end end"] local f_any_c = formatters[" else local key = scanword(true) if key then data[key] = %s(scan%s()) else break end end"] @@ -270,33 +321,6 @@ local f_action_f = formatters["action%s(%s)"] local f_action_s = formatters["local action%s = tokens._action[%s]"] local f_nested = formatters["local function scan%s()\n local data = { }\n%s\n return data\nend\n"] --- local f_check = formatters[ [[ --- local wrapped = false --- while true do --- local c = scancode(open) --- if c == 123 then --- wrapped = true --- break --- elseif c ~= 32 then --- break --- end --- end --- while true do --- ]] .. "%\nt\n" .. [[ --- %s --- end --- if wrapped then --- while true do --- local c = scancode(close) --- if c == 125 then --- break --- elseif c ~= 32 then --- break --- end --- end --- end --- ]] ] - local f_check = formatters[ [[ local wrapped = scanopen() while true do @@ -319,6 +343,11 @@ local presets = { ["6 strings"] = { "string", "string", "string", "string", "string", "string" }, ["7 strings"] = { "string", "string", "string", "string", "string", "string", "string" }, ["8 strings"] = { "string", "string", "string", "string", "string", "string", "string", "string" }, + + ["1 argument" ] = { "argument" }, + ["2 arguments"] = { "argument", "argument" }, + ["3 arguments"] = { "argument", "argument", "argument" }, + ["4 arguments"] = { "argument", "argument", "argument", "argument" }, } tokens.presets = presets @@ -542,7 +571,7 @@ end -- { "nature", "boolean" }, -- { "escape", "string" }, -- { "escape" }, --- } +-- }, -- "boolean", -- } -- -- cgit v1.2.3