summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua')
-rw-r--r--Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua57
1 files changed, 38 insertions, 19 deletions
diff --git a/Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua b/Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua
index 72e4d6ad1a4..93234e5d596 100644
--- a/Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua
+++ b/Master/texmf-dist/tex/lualatex/yamlvars/YAMLvars.lua
@@ -1,6 +1,6 @@
--% Kale Ewasiuk (kalekje@gmail.com)
---% 2021-12-15
---% Copyright (C) 2021 Kale Ewasiuk
+--% 2022-01-18
+--% Copyright (C) 2021-2022 Kale Ewasiuk
--%
--% Permission is hereby granted, free of charge, to any person obtaining a copy
--% of this software and associated documentation files (the "Software"), to deal
@@ -61,6 +61,7 @@ YAMLvars.dftDefault = nil
YAMLvars.xfmDefault = {}
YAMLvars.allowUndeclared = false
+YAMLvars.overwritedefs = false
YAMLvars.valTemp = ''
YAMLvars.varTemp = ''
@@ -69,7 +70,9 @@ YAMLvars.tabmidrule = 'hline'
YAMLvars.debug = false
-YAMLvars.yaml = require('tinyyaml')
+YAMLvars.yaml = require'markdown-tinyyaml' -- note: YAMLvars.sty will have checked existence of this already
+local pl = _G['penlight'] or _G['pl'] -- penlight for this namespace is pl
+
function YAMLvars.debugtalk(s, ss)
if YAMLvars.debug then
@@ -77,9 +80,10 @@ function YAMLvars.debugtalk(s, ss)
end
end
+
-- xfm functions (transforms) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
function YAMLvars.xfm.addxspace(var, val)
- return val .. '\\xspace'
+ return val .. '\\xspace{}'
end
function YAMLvars.xfm.tab2arr(var, val)
@@ -99,10 +103,10 @@ function YAMLvars.xfm.arr2tabular(var, val)
end
-function YAMLvars.xfm.arr2itemize(var, val)
+function YAMLvars.xfm.list2items(var, val) -- todo should be list2item
return pl.List(val):map('\\item '.._1):join(' ')
end
-
+YAMLvars.xfm.arr2itemize = YAMLvars.xfm.list2items
function YAMLvars.xfm.arrsortAZ(var, val)
return pl.List(val):sort(pl.operator.strlt)
@@ -126,12 +130,15 @@ function YAMLvars.xfm.arrsortlastnameAZ(var, val)
end
-- todo need distinction beyyween table and penlight list ???
function YAMLvars.xfm.list2nl(var, val)
- val = pl.array2d.map_slice1(_1..'\\\\', val, 1,-2)
- return val:join('')
- --return pl.tablex.reduce(_1.._2, val, '')
+ return pl.tablex.join(val,'\\\\ ')
end
-function YAMLvars.xfm.lb2nl(var, val)
+ --val = pl.array2d.map_slice1(_1..'\\\\', val, 1,-2)
+ --return val:join('')
+ --return pl.tablex.reduce(_1.._2, val, '')
+
+
+function YAMLvars.xfm.lb2nl(var, val) --linebreak in text 2 new line
val, _ = val:gsub('\n','\\\\ ')
return val
end
@@ -265,7 +272,7 @@ end
function YAMLvars.prvcmd(cs, val) -- provide command via lua
- if token.is_defined(cs) then
+ if token.is_defined(cs) and (not YAMLvars.overwritedefs) then
tex.print('\\PackageError{YAMLvars}{Variable '..cs..' already defined, could not declare}{}')
else
token.set_macro(cs, val, 'global')
@@ -339,21 +346,29 @@ local function sub_lua_var(s, v1, v2)
return s:gsub('([%A?%-?])('..v1..')([%W?%-?])', '%1'..v2..'%3') -- replace x variables
end
+local _YV_invalid_expression = '\1 invalid expression'
+local _YV_no_return = '\2 no return val'
local function eval_expr(func, var, val)
- local s, c = func:gsub('^[=/]', {['/'] = '', ['='] = 'YAMLvars.valTemp = '}, 1) -- / is run code, = sets val = code
+ local s, c = func:gsub('^[=/]', {['/'] = '\2', ['='] = 'YAMLvars.valTemp = '}, 1) -- / is run code, = sets val = code
if c == 0 then
- return nil
+ return _YV_invalid_expression
else
--help_wrt(s, var)
--help_wrt(val, var)
YAMLvars.valTemp = val
YAMLvars.varTemp = var
--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')
--help_wrt(s, var)
- loadstring(s)()
- --help_wrt(val, var)
+ local f, err = pcall(loadstring(s))
+ if not f then
+ tex.print('\\PackageError{YAMLvars}{xfm with "= or /" error on var "'..var..'"}{}') --
+ end
+ if c > 0 then
+ return _YV_no_return
+ end
return YAMLvars.valTemp
end
end
@@ -363,8 +378,9 @@ local function transform_and_prc(var, val)
local f = YAMLvars.xfm[func]
if f == nil then
local val2 = eval_expr(func, var, val)
- if val2 == nil then
- tex.print('\\PackageWarning{YAMLvars}{xfm function "'..func..'" not defined, skipping}{}')
+ if val2 == _YV_invalid_expression then
+ tex.print('\\PackageError{YAMLvars}{xfm function "'..func..'" not defined or invalid expression passed on var "'..var..'"}{}')
+ elseif val == _YV_no_return then
else
val = val2
end
@@ -374,7 +390,7 @@ 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']..'" not defined}{}')
+ tex.print('\\PackageError{YAMLvars}{prc function "'..YAMLvars.varspecs[var]['prc']..'" on var "'..var..'" not defined}{}')
end
f(var, val) -- prc the value of the variable
end
@@ -383,7 +399,10 @@ function YAMLvars.parseYAMLvarsStr(y)
YAMLvars.varsvals = YAMLvars.yaml.parse(y)
for var, val in pairs(YAMLvars.varsvals) do
if YAMLvars.varspecs[var] == nil then
- check_def(var, val)
+ check_def(var, val) -- if not declared
+ -- todo consider free form parse declaring
+ -- variable name: {xfm:, dec:, prc:, val: }
+ -- definitely doable here
else
transform_and_prc(var, val)
end