summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2023-07-19 20:48:55 +0000
committerKarl Berry <karl@freefriends.org>2023-07-19 20:48:55 +0000
commit4857e138055f6bf0bf18d8eed0ede123f6ee19f6 (patch)
treedcac3628234b7dd6d9eb76936a969cc6f5f8a112 /Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua
parent7a50a82a6c74db25c3c266ac25bd9e3e881cf84b (diff)
yamlvars (19jul23)
git-svn-id: svn://tug.org/texlive/trunk@67674 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua')
-rw-r--r--Master/texmf-dist/tex/lualatex/yamlvars/yamlvars.lua193
1 files changed, 50 insertions, 143 deletions
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