From 4857e138055f6bf0bf18d8eed0ede123f6ee19f6 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 19 Jul 2023 20:48:55 +0000 Subject: yamlvars (19jul23) git-svn-id: svn://tug.org/texlive/trunk@67674 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/lualatex/yamlvars/yamlvars.lua | 193 ++++++--------------- 1 file changed, 50 insertions(+), 143 deletions(-) (limited to 'Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua') diff --git a/Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua b/Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua index 01b326c4b4a..1d0da9a3126 100644 --- a/Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua +++ b/Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua @@ -1,5 +1,5 @@ --% Kale Ewasiuk (kalekje@gmail.com) ---% 2022-11-06 +--% 2023-07-18 --% Copyright (C) 2021-2022 Kale Ewasiuk --% --% Permission is hereby granted, free of charge, to any person obtaining a copy @@ -23,63 +23,65 @@ --% OR OTHER DEALINGS IN THE SOFTWARE. --- tinyyaml license ---MIT License --- ---Copyright (c) 2017 peposso --- ---Permission is hereby granted, free of charge, to any person obtaining a copy ---of this software and associated documentation files (the "Software"), to deal ---in the Software without restriction, including without limitation the rights ---to use, copy, modify, merge, publish, distribute, sublicense, and/or sell ---copies of the Software, and to permit persons to whom the Software is ---furnished to do so, subject to the following conditions: --- ---The above copyright notice and this permission notice shall be included in all ---copies or substantial portions of the Software. --- ---THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ---IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ---FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ---AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ---LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, ---OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE ---SOFTWARE. YAMLvars = {} -- self table -YAMLvars.yaml = require'markdown-tinyyaml' -- note: YAMLvars.sty will have checked existence of this already +YAMLvars.yaml = require'tinyyaml' -- note: YAMLvars.sty will have checked existence of this already + +local luakeys = require'luakeys'() -- note: YAMLvars.sty will have checked existence of this already local pl = _G['penlight'] or _G['pl'] -- penlight for this namespace is pl if (__PL_EXTRAS__ == nil) or (__PENLIGHT__ == nil) then tex.sprint('\\PackageError{yamlvars}{penlight package with extras (or extrasnoglobals) option must be loaded before this package}{}') end +-- UI tables to extend functionality YAMLvars.xfm = {} YAMLvars.prc = {} YAMLvars.dec = {} -- table of declare function +-- internal variables YAMLvars.varsvals = {} YAMLvars.varspecs = {} YAMLvars.varslowcase = pl.List() -YAMLvars.xfmDefault = {} -YAMLvars.prcDefault = 'gdef' -YAMLvars.dftDefault = nil - -YAMLvars.allowUndeclared = false -YAMLvars.overwritedefs = false -YAMLvars.lowvasevarall = false - YAMLvars.valTemp = '' YAMLvars.varTemp = '' -YAMLvars.tabmidrule = 'hline' YAMLvars.debug = false +YAMLvars.setts = {} +YAMLvars.setts.undeclared = false +YAMLvars.setts.overwrite = false +YAMLvars.setts.lowercase = false +YAMLvars.setts.tabmidrule = 'midrule' +YAMLvars.setts.xfm = {} +YAMLvars.setts.prc = 'gdef' +YAMLvars.setts.dft = '' + +YAMLvars.settsdefault = pl.tablex.deepcopy(YAMLvars.setts) + +function YAMLvars.setts2default() + YAMLvars.setts = pl.tablex.deepcopy(YAMLvars.settsdefault) +end + +function YAMLvars.updatesettskv(kv, res, def) + def = def or false + ss = 'setts' -- setts or settsdefault + if def then ss = 'settsdefault' end + if res == pl.tex._xTrue then + YAMLvars.setts2default() + end + + local kv = luakeys.parse(kv) + if type(kv.xfm) == 'string' then + kv.xfm = pl.stringx.split(kv.xfm) + end + pl.tablex.update(YAMLvars[ss], kv) +end function YAMLvars.debugtalk(s, ss) if YAMLvars.debug then @@ -93,12 +95,6 @@ end - --- todo need distinction beyyween table and penlight list ??? - --val = pl.array2d.map_slice1(_1..'\\\\', val, 1,-2) - --return val:join('') - --return pl.tablex.reduce(_1.._2, val, '') - function YAMLvars.xfm.markdown(var, val) --return '\\begin{markdown} '..val..'\n \\end{markdown}' pl.tex.help_wrt(val, md) @@ -109,7 +105,6 @@ end - -- xfm functions (transforms) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- function YAMLvars.xfm.addxspace(var, val) return val .. '\\xspace' @@ -124,7 +119,7 @@ function YAMLvars.xfm.arrsort2ZA(var, val) end function YAMLvars.xfm.addrule2arr(var, val) - return pl.array2d.map_slice2(_1..'\\\\\\'.. YAMLvars.tabmidrule..' ', val, 1,-1,-2,-1) + return pl.array2d.map_slice2(_1..'\\\\\\'.. YAMLvars.setts.tabmidrule..' ', val, 1,-1,-2,-1) end function YAMLvars.xfm.arr2tabular(var, val) @@ -296,19 +291,13 @@ end -- -- --- ?? ---token.set_macro('yv--'..var, val, 'global') -- todo fix with csname hack? - - - -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- function YAMLvars.makecmd(cs, val) -- provide command via lua - if token.is_defined(cs) and (not YAMLvars.overwritedefs) then + if token.is_defined(cs) and (not YAMLvars.setts.overwrite) then YAMLvars.pkgerr('Variable '..cs..' already defined, could not declare') else pl.tex.defcmd(cs, val) - --token.set_macro(cs, val, 'global') -- issues if val contains undefined macro end end @@ -334,15 +323,18 @@ local function getYAMLfile(y) end end +local function default_stuff() + return {xfm=YAMLvars.setts.xfm,prc=YAMLvars.setts.prc,dft=YAMLvars.setts.dft} +end function YAMLvars.declareYAMLvarsStr(y) local t = YAMLvars.yaml.parse(y) for var, specs in pairs(t) do - if pl.hasval(specs['lowcasevar']) or YAMLvars.lowvasevarall then + if pl.hasval(specs['lowcasevar']) or YAMLvars.setts.lowercase then var = var:lower() YAMLvars.varslowcase:append(var) end - YAMLvars.varspecs[var] = {xfm=YAMLvars.xfmDefault,prc=YAMLvars.prcDefault,dft=YAMLvars.dftDefault} + YAMLvars.varspecs[var] = default_stuff() if type(specs) == 'string' then specs = {xfm={specs}} end @@ -353,8 +345,6 @@ function YAMLvars.declareYAMLvarsStr(y) end if YAMLvars.dec[YAMLvars.varspecs[var].prc] ~= nil then YAMLvars.dec[YAMLvars.varspecs[var].prc](var, YAMLvars.varspecs[var].dft) - --else -- actually don't a dec function for all - -- -- -- -- tex.print('\\PackageError{YAMLvars}{Declaration function for '..YAMLvarspecs[var].prc..'not found}{}') end end YAMLvars.debugtalk(YAMLvars.varspecs, 'declared YAML vars, varspecs') @@ -367,21 +357,6 @@ function YAMLvars.declareYAMLvarsFile(y) end -local function check_def(var, val) - if YAMLvars.allowUndeclared then - if YAMLvars.prcDefault == 'yvdef' then - YAMLvars.prc.yvdef(var, val) - YAMLvars.debugtalk(var..' = '..val,'yvdef made (undeclared)') - else - YAMLvars.makecmd(var, val) - YAMLvars.debugtalk(var..' = '..val,'gdef made (undeclared)') - end - else - --tex.print('\\PackageError{YAMLvars}{Variable "'..var..'" set but not declared}{}') - YAMLvars.pkgerr('Variable "'..var..'" set but not declared') - end -end - local function sub_lua_var(s, v1, v2) return s:gsub('([%A?%-?])('..v1..')([%W?%-?])', '%1'..v2..'%3') -- replace x variables end @@ -399,15 +374,11 @@ local function eval_expr(func, var, val) if c == 0 then return _YV_invalid_expression else - --pl.tex.help_wrt(s, var) - --pl.tex.help_wrt(val, var) YAMLvars.valTemp = val YAMLvars.varTemp = var - --pl.tex.help_wrt(s, var) s, c = s:gsub('\2', '') -- strip \2 that might have appeared if / was applied s = sub_lua_var(' '..s, 'x', 'YAMLvars.valTemp') s = sub_lua_var(s, 'v', 'YAMLvars.varTemp') - --pl.tex.help_wrt(s, var) local f, err = pcall(loadstring(s)) if not f then --tex.print('\\PackageError{YAMLvars}{xfm with "= or /" error on var "'..var..'"}{}') -- @@ -439,24 +410,24 @@ local function transform_and_prc(var, val) end f = YAMLvars.prc[YAMLvars.varspecs[var]['prc']] if f == nil then - --tex.print('\\PackageError{YAMLvars}{prc function "'..YAMLvars.varspecs[var]['prc']..'" on var "'..var..'" not defined}{}') YAMLvars.pkgerr('prc function "'..YAMLvars.varspecs[var]['prc']..'" on var "'..var..'" not defined') end f(var, val) -- prc the value of the variable end + + function YAMLvars.parseYAMLvarsStr(y) YAMLvars.varsvals = YAMLvars.yaml.parse(y) for var, val in pairs(YAMLvars.varsvals) do if YAMLvars.varslowcase:contains(var:lower()) then var = var:lower() end - if YAMLvars.varspecs[var] == nil then - check_def(var, val) -- if not declared - -- todo consider free form parse declaring - -- variable name: {xfm:, dec:, prc:, val: } - -- definitely doable here - else + if YAMLvars.varspecs[var] == nil and YAMLvars.setts.undeclared then + YAMLvars.debugtalk(YAMLvars.setts, 'XYZ') + YAMLvars.varspecs[var] = default_stuff() -- if undeclared and allowing, add to varspec set to default xfm, prc, dft + end + if YAMLvars.varspecs[var] ~= nil then -- if specified, process transform_and_prc(var, val) end end @@ -501,7 +472,6 @@ function YAMLvars.getYAMLcli() end end end - --pl.tex.help_wrt(t) return t end @@ -572,71 +542,8 @@ function YAMLvars.prc.memoFr(var, val) end end --- produce \Var[val[2]\\val[3].....\val[n]]{val[1]} ---function YAMLvars.prc.setdocvarOpt(var, val) --- if type(val) ~= 'table' then --- val = {val} --- end --- local s = '\\'..var..'{'..tostring(val[1])..'}' --- s = s..'['..pl.List(v):map_slice1():join()..']' -- what does this do? --- tex.print(s) ---end --- --- ---function YAMLvars.prc.setdocvarOpts(var, val) --- if type(val) ~= 'table' then --- val = {val} --- end --- local s = '\\'..var..'{'..tostring(val[1])..'}' --- for k, v in pairs(val) do --- if k > 1 then --- s = s..'['..tostring(v)..']' --- end --- end --- tex.print(s) ---end - -return YAMLvars - - - - - - - --token.set_macro('@memoFr', k, 'global') - --token.set_macro('@memoFrAddr', v, 'global') - --token.set_macro('@memoTo', k, 'global') - --token.set_macro('@memoToAddr', v, 'global') - --help_wrt(var,val) - -- token.set_macro('@'..var, val, 'global') - ---function YAMLvars.prc.title(var, val) --- YAMLvars.prc.setdocvar('title', val) ---end --- --- ---function YAMLvars.prc.author(var, val) --- YAMLvars.prc.setdocvar('author', val) ---end --- ---function YAMLvars.prc.date(var, val) --- YAMLvars.prc.setdocvar('date', val) ---end - - - --clean = clean or true - --if clean then -- clean first part of yaml string - -- y = clean_tex_spaces(y) - --end ---local function clean_tex_spaces(s) --- pl.tex.help_wrt(s) --- if s:sub(1,2) == '%s' then --- s, _ = s:gsub('%s+','',1) --- end --- s, _ = s:gsub('\\par ','\n\n') --- return s ---end +return YAMLvars -- cgit v1.2.3