Bug fixed and more refactoring
This commit is contained in:
parent
80892f0f28
commit
8bdc6035a8
|
@ -6461,7 +6461,7 @@ local nat = {}
|
||||||
function nat.get(str)
|
function nat.get(str)
|
||||||
return str
|
return str
|
||||||
end
|
end
|
||||||
----------------------------------- LITERATE ----------------------------------
|
---------------------------------- LITERATE ----------------------------------
|
||||||
|
|
||||||
-- Variable for all literate stuff
|
-- Variable for all literate stuff
|
||||||
local lit = {}
|
local lit = {}
|
||||||
|
@ -6491,193 +6491,6 @@ lit.metastruct = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
function lit.stringify(content)
|
|
||||||
if pandoc.utils.type(content) == "Inlines" then
|
|
||||||
return pandoc.utils.stringify(content:walk {
|
|
||||||
Quoted = function(quoted)
|
|
||||||
local quote = (quoted.quotetype == SingleQuoted and '"' or "'")
|
|
||||||
quoted = pandoc.utils.stringify(quoted.content)
|
|
||||||
return pandoc.Str(quote .. quoted .. quote)
|
|
||||||
end,
|
|
||||||
RawInline = function(rawinline)
|
|
||||||
return pandoc.Str(rawinline.text:gsub("\\n", "\n"):gsub("\\t", "\t"))
|
|
||||||
end,
|
|
||||||
Inline = function(inline)
|
|
||||||
return pandoc.utils.stringify(inline)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
else
|
|
||||||
return pandoc.utils.stringify(content)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.meta2table(meta)
|
|
||||||
for k, v in pairs(meta) do
|
|
||||||
if pandoc.utils.type(v) == "table" then
|
|
||||||
meta[k] = lit.meta2table(v)
|
|
||||||
else
|
|
||||||
v = lit.stringify(v)
|
|
||||||
print(v)
|
|
||||||
if v == "true" or v == "false" then
|
|
||||||
v = v == "true"
|
|
||||||
-- WARN!!
|
|
||||||
elseif tonumber(v) then
|
|
||||||
v = tonumber(v)
|
|
||||||
end
|
|
||||||
meta[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return meta
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Messages for the user
|
|
||||||
lit.msg = lit.meta2table(pandoc.read([[---
|
|
||||||
INFO:
|
|
||||||
parsing:
|
|
||||||
en: Parsing:\n#1
|
|
||||||
es: Realizando análisis sintáctico:\n#1
|
|
||||||
WARNING:
|
|
||||||
foo:
|
|
||||||
en: bar
|
|
||||||
es: baz
|
|
||||||
ERROR:
|
|
||||||
invalid_key:
|
|
||||||
en: Invalid key '#1' with value '#2'
|
|
||||||
es: Clave '#1' inválida con valor '#2'
|
|
||||||
invalid_path:
|
|
||||||
en: Invalid path '#1' in key '#2'
|
|
||||||
es: Ruta '#1' inválida en clave '#2'
|
|
||||||
invalid_type:
|
|
||||||
en: Invalid type '#1' in key '#2'
|
|
||||||
es: Tipo '#1' inválido en clave '#2'
|
|
||||||
invalid_value:
|
|
||||||
en: Invalid value '#1' in key '#2'
|
|
||||||
es: Valor '#1' inválido en clave '#2'
|
|
||||||
no_key:
|
|
||||||
en: Key '#1' not found
|
|
||||||
es: Clave '#1' no encontrada
|
|
||||||
aborted:
|
|
||||||
en: Aborted due previous errors
|
|
||||||
es: Abortado debido a previos errores
|
|
||||||
yaml_empty:
|
|
||||||
en: Empty YAML
|
|
||||||
es: YAML vacío
|
|
||||||
yaml_invalid:
|
|
||||||
en: Invalid YAML
|
|
||||||
es: YAML inválido
|
|
||||||
...
|
|
||||||
]]).meta)
|
|
||||||
|
|
||||||
function lit.debuglevel(str)
|
|
||||||
if str == "ERROR" then
|
|
||||||
lit.status = false
|
|
||||||
return 2
|
|
||||||
elseif str == "WARNING" then
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.setmsg(msg, ...)
|
|
||||||
local lang = os.lang()
|
|
||||||
msg = (msg[lang] ~= nil and msg[lang] or msg)
|
|
||||||
for i, str in ipairs({...}) do
|
|
||||||
msg = msg:gsub("#" .. i, str)
|
|
||||||
end
|
|
||||||
return msg
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.getmsg(key, ...)
|
|
||||||
local levelname = "INFO"
|
|
||||||
local level = 0
|
|
||||||
for mtype, msgs in pairs(lit.msg) do
|
|
||||||
if msgs[key] ~= nil then
|
|
||||||
key = lit.setmsg(msgs[key], ...)
|
|
||||||
levelname, level = mtype, lit.debuglevel(mtype)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return key, levelname, level
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.puts(key, ...)
|
|
||||||
local verbosity = lit.debuglevel(PANDOC_STATE.verbosity)
|
|
||||||
local msg, levelname, level = lit.getmsg(key, ...)
|
|
||||||
if level >= verbosity then
|
|
||||||
print("[" .. levelname .. "] [LIT] " .. msg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.getmetaval(meta, key)
|
|
||||||
local mtype = pandoc.utils.type(meta[key])
|
|
||||||
local mval = meta[key]
|
|
||||||
if mtype == "Inlines" then
|
|
||||||
mval = pandoc.utils.stringify(mval)
|
|
||||||
mtype = pandoc.utils.type(mval)
|
|
||||||
end
|
|
||||||
return mval, mtype
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.checkmetaextra(meta)
|
|
||||||
for key, val in pairs(meta) do
|
|
||||||
local missing1 = lit.metastruct["mandatory"][key] == nil
|
|
||||||
local missing2 = lit.metastruct["optional"][key] == nil
|
|
||||||
local mval = lit.getmetaval(meta, key)
|
|
||||||
if missing1 and missing2 then
|
|
||||||
lit.puts("invalid_key", key, mval)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.checkmetatype(type, meta, key)
|
|
||||||
local mval, mtype = lit.getmetaval(meta, key)
|
|
||||||
if type ~= mtype then
|
|
||||||
if type == "path" then
|
|
||||||
if not(pandoc.path.directory(mval):isdir()) then
|
|
||||||
lit.puts("invalid_path", mval, key)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
lit.puts("invalid_type", mtype, key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- TODO: has bug
|
|
||||||
function lit.checkmetatable(table, meta, key)
|
|
||||||
local mval = lit.getmetaval(meta, key)
|
|
||||||
for _, pattern in pairs(table) do
|
|
||||||
if mval:match("^" .. pattern .. "$") == nil then
|
|
||||||
lit.puts("invalid_value", mval, key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.checkmeta(meta, kind)
|
|
||||||
for key, val in pairs(lit.metastruct[kind]) do
|
|
||||||
if meta[key] == nil then
|
|
||||||
if kind == "mandatory" then
|
|
||||||
lit.puts("no_key", key)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if type(val) == "table" then
|
|
||||||
lit.checkmetatable(val, meta, key)
|
|
||||||
else
|
|
||||||
lit.checkmetatype(val, meta, key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.setmeta(meta)
|
|
||||||
lit.checkmeta(meta, "mandatory")
|
|
||||||
lit.checkmeta(meta, "optional")
|
|
||||||
lit.checkmetaextra(meta)
|
|
||||||
-- TODO checks for 2) duplicates
|
|
||||||
-- Set defaults if lit.status = true
|
|
||||||
return meta
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Grammars
|
-- Grammars
|
||||||
lit.g = {}
|
lit.g = {}
|
||||||
|
|
||||||
|
@ -6718,6 +6531,200 @@ function lit.eval(code)
|
||||||
end
|
end
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
|
function lit.stringify_quoted(quoted)
|
||||||
|
local quote = (quoted.quotetype == SingleQuoted and '"' or "'")
|
||||||
|
quoted = pandoc.utils.stringify(quoted.content)
|
||||||
|
return pandoc.Str(quote .. quoted .. quote)
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.stringify_rawinline(rawinline)
|
||||||
|
local str = rawinline.text
|
||||||
|
str = str:gsub("\\n", "\n"):gsub("\\t", "\t")
|
||||||
|
return pandoc.Str(str)
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.stringify(content)
|
||||||
|
if pandoc.utils.type(content) == "Inlines" then
|
||||||
|
return pandoc.utils.stringify(content:walk {
|
||||||
|
Quoted = function(e) return lit.stringify_quoted(e) end,
|
||||||
|
RawInline = function(e) return lit.stringify_rawinline(e) end,
|
||||||
|
Inline = function(inline) return pandoc.utils.stringify(inline) end,
|
||||||
|
})
|
||||||
|
else
|
||||||
|
return pandoc.utils.stringify(content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.string2other(str)
|
||||||
|
if str == "true" or str == "false" then
|
||||||
|
return str == "true"
|
||||||
|
-- WARN "1" always num; cfr. https://pandoc.org/lua-filters.html#type-metavalue
|
||||||
|
elseif tonumber(str) then
|
||||||
|
return tonumber(str)
|
||||||
|
else
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.meta2table(meta)
|
||||||
|
for k, v in pairs(meta) do
|
||||||
|
if pandoc.utils.type(v) == "table" then
|
||||||
|
meta[k] = lit.meta2table(v)
|
||||||
|
else
|
||||||
|
meta[k] = lit.string2other(lit.stringify(v))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return meta
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.debuglevel(str)
|
||||||
|
if str == "ERROR" then
|
||||||
|
lit.status = false
|
||||||
|
return 2
|
||||||
|
elseif str == "WARNING" then
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.setmsg(msg, ...)
|
||||||
|
local lang = os.lang()
|
||||||
|
msg = (msg[lang] ~= nil and msg[lang] or msg)
|
||||||
|
for i, str in ipairs({...}) do
|
||||||
|
msg = msg:gsub("#" .. i, str)
|
||||||
|
end
|
||||||
|
return msg
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.getmsg(key, ...)
|
||||||
|
local msg = lit.meta2table(pandoc.read([[---
|
||||||
|
INFO:
|
||||||
|
parsing:
|
||||||
|
en: Parsing:\n#1
|
||||||
|
es: Realizando análisis sintáctico:\n#1
|
||||||
|
WARNING:
|
||||||
|
foo:
|
||||||
|
en: bar
|
||||||
|
es: baz
|
||||||
|
ERROR:
|
||||||
|
invalid_key:
|
||||||
|
en: Invalid key '#1'
|
||||||
|
es: Clave '#1' inválida
|
||||||
|
invalid_path:
|
||||||
|
en: Invalid path '#1' in key '#2'
|
||||||
|
es: Ruta '#1' inválida en clave '#2'
|
||||||
|
invalid_type:
|
||||||
|
en: Invalid type '#1' in key '#2'
|
||||||
|
es: Tipo '#1' inválido en clave '#2'
|
||||||
|
invalid_value:
|
||||||
|
en: Invalid value '#1' in key '#2'
|
||||||
|
es: Valor '#1' inválido en clave '#2'
|
||||||
|
no_key:
|
||||||
|
en: Key '#1' not found
|
||||||
|
es: Clave '#1' no encontrada
|
||||||
|
aborted:
|
||||||
|
en: Aborted due previous errors
|
||||||
|
es: Abortado debido a previos errores
|
||||||
|
yaml_empty:
|
||||||
|
en: Empty YAML
|
||||||
|
es: YAML vacío
|
||||||
|
yaml_invalid:
|
||||||
|
en: Invalid YAML
|
||||||
|
es: YAML inválido
|
||||||
|
...
|
||||||
|
]]).meta)
|
||||||
|
local levelname, level = "INFO", 0
|
||||||
|
for mtype, msgs in pairs(msg) do
|
||||||
|
if msgs[key] ~= nil then
|
||||||
|
key = lit.setmsg(msgs[key], ...)
|
||||||
|
levelname, level = mtype, lit.debuglevel(mtype)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return key, levelname, level
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.puts(key, ...)
|
||||||
|
local verbosity = lit.debuglevel(PANDOC_STATE.verbosity)
|
||||||
|
local msg, levelname, level = lit.getmsg(key, ...)
|
||||||
|
if level >= verbosity then
|
||||||
|
print("[" .. levelname .. "] [LIT] " .. msg)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.getmetaval(meta, key)
|
||||||
|
local mtype = pandoc.utils.type(meta[key])
|
||||||
|
local mval = meta[key]
|
||||||
|
if mtype == "Inlines" then
|
||||||
|
mval = pandoc.utils.stringify(mval)
|
||||||
|
mtype = pandoc.utils.type(mval)
|
||||||
|
end
|
||||||
|
return mval, mtype
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkextra(meta)
|
||||||
|
for key, val in pairs(meta) do
|
||||||
|
local missing1 = lit.metastruct["mandatory"][key] == nil
|
||||||
|
local missing2 = lit.metastruct["optional"][key] == nil
|
||||||
|
local mval = lit.getmetaval(meta, key)
|
||||||
|
if missing1 and missing2 then
|
||||||
|
lit.puts("invalid_key", key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta_type(type, meta, key)
|
||||||
|
local mval, mtype = lit.getmetaval(meta, key)
|
||||||
|
if type ~= mtype then
|
||||||
|
if type == "path" then
|
||||||
|
if not(pandoc.path.directory(mval):isdir()) then
|
||||||
|
lit.puts("invalid_path", mval, key)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
lit.puts("invalid_type", mtype, key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta_match(table, mval, key)
|
||||||
|
for _, pattern in pairs(table) do
|
||||||
|
if mval:match("^" .. pattern .. "$") then
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return key
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta_table(table, meta, key)
|
||||||
|
local mval = lit.getmetaval(meta, key)
|
||||||
|
local err = lit.checkmeta_match(table, mval, key)
|
||||||
|
if not(err:isempty()) then
|
||||||
|
lit.puts("invalid_value", mval, err)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta(meta, kind)
|
||||||
|
for key, val in pairs(lit.metastruct[kind]) do
|
||||||
|
if meta[key] == nil and kind == "mandatory" then
|
||||||
|
lit.puts("no_key", key)
|
||||||
|
elseif meta[key] and type(val) == "table" then
|
||||||
|
lit.checkmeta_table(val, meta, key)
|
||||||
|
elseif meta[key] then
|
||||||
|
lit.checkmeta_type(val, meta, key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.setmeta(meta)
|
||||||
|
lit.checkmeta(meta, "mandatory")
|
||||||
|
lit.checkmeta(meta, "optional")
|
||||||
|
lit.checkextra(meta)
|
||||||
|
-- TODO checks for 2) duplicates
|
||||||
|
-- Set defaults if lit.status = true
|
||||||
|
return meta
|
||||||
|
end
|
||||||
|
|
||||||
-- TODO
|
-- TODO
|
||||||
function lit.assert(e, status)
|
function lit.assert(e, status)
|
||||||
if status == false then
|
if status == false then
|
||||||
|
@ -6728,6 +6735,7 @@ function lit.assert(e, status)
|
||||||
end
|
end
|
||||||
|
|
||||||
function lit.parseyaml(rawyaml)
|
function lit.parseyaml(rawyaml)
|
||||||
|
-- TODO io.try
|
||||||
local yaml = io.popen("pandoc -t json <<<\"" .. rawyaml .. "\" 2>&1")
|
local yaml = io.popen("pandoc -t json <<<\"" .. rawyaml .. "\" 2>&1")
|
||||||
if yaml:read("*l"):sub(1, 1) == "{" then
|
if yaml:read("*l"):sub(1, 1) == "{" then
|
||||||
yaml = pandoc.read(rawyaml).meta
|
yaml = pandoc.read(rawyaml).meta
|
||||||
|
|
314
src/literate.lua
314
src/literate.lua
|
@ -1,4 +1,4 @@
|
||||||
----------------------------------- LITERATE ----------------------------------
|
---------------------------------- LITERATE ----------------------------------
|
||||||
|
|
||||||
-- Variable for all literate stuff
|
-- Variable for all literate stuff
|
||||||
local lit = {}
|
local lit = {}
|
||||||
|
@ -28,158 +28,6 @@ lit.metastruct = {
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
function lit.stringify(content)
|
|
||||||
if pandoc.utils.type(content) == "Inlines" then
|
|
||||||
return pandoc.utils.stringify(content:walk {
|
|
||||||
Quoted = function(quoted)
|
|
||||||
local quote = (quoted.quotetype == SingleQuoted and '"' or "'")
|
|
||||||
quoted = pandoc.utils.stringify(quoted.content)
|
|
||||||
return pandoc.Str(quote .. quoted .. quote)
|
|
||||||
end,
|
|
||||||
RawInline = function(rawinline)
|
|
||||||
return pandoc.Str(rawinline.text:gsub("\\n", "\n"):gsub("\\t", "\t"))
|
|
||||||
end,
|
|
||||||
Inline = function(inline)
|
|
||||||
return pandoc.utils.stringify(inline)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
else
|
|
||||||
return pandoc.utils.stringify(content)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.meta2table(meta)
|
|
||||||
for k, v in pairs(meta) do
|
|
||||||
if pandoc.utils.type(v) == "table" then
|
|
||||||
meta[k] = lit.meta2table(v)
|
|
||||||
else
|
|
||||||
v = lit.stringify(v)
|
|
||||||
print(v)
|
|
||||||
if v == "true" or v == "false" then
|
|
||||||
v = v == "true"
|
|
||||||
-- WARN!!
|
|
||||||
elseif tonumber(v) then
|
|
||||||
v = tonumber(v)
|
|
||||||
end
|
|
||||||
meta[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return meta
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Messages for the user
|
|
||||||
lit.msg = lit.meta2table(pandoc.read([[#locale()]]).meta)
|
|
||||||
|
|
||||||
function lit.debuglevel(str)
|
|
||||||
if str == "ERROR" then
|
|
||||||
lit.status = false
|
|
||||||
return 2
|
|
||||||
elseif str == "WARNING" then
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
return 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.setmsg(msg, ...)
|
|
||||||
local lang = os.lang()
|
|
||||||
msg = (msg[lang] ~= nil and msg[lang] or msg)
|
|
||||||
for i, str in ipairs({...}) do
|
|
||||||
msg = msg:gsub("#" .. i, str)
|
|
||||||
end
|
|
||||||
return msg
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.getmsg(key, ...)
|
|
||||||
local levelname = "INFO"
|
|
||||||
local level = 0
|
|
||||||
for mtype, msgs in pairs(lit.msg) do
|
|
||||||
if msgs[key] ~= nil then
|
|
||||||
key = lit.setmsg(msgs[key], ...)
|
|
||||||
levelname, level = mtype, lit.debuglevel(mtype)
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return key, levelname, level
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.puts(key, ...)
|
|
||||||
local verbosity = lit.debuglevel(PANDOC_STATE.verbosity)
|
|
||||||
local msg, levelname, level = lit.getmsg(key, ...)
|
|
||||||
if level >= verbosity then
|
|
||||||
print("[" .. levelname .. "] [LIT] " .. msg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.getmetaval(meta, key)
|
|
||||||
local mtype = pandoc.utils.type(meta[key])
|
|
||||||
local mval = meta[key]
|
|
||||||
if mtype == "Inlines" then
|
|
||||||
mval = pandoc.utils.stringify(mval)
|
|
||||||
mtype = pandoc.utils.type(mval)
|
|
||||||
end
|
|
||||||
return mval, mtype
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.checkmetaextra(meta)
|
|
||||||
for key, val in pairs(meta) do
|
|
||||||
local missing1 = lit.metastruct["mandatory"][key] == nil
|
|
||||||
local missing2 = lit.metastruct["optional"][key] == nil
|
|
||||||
local mval = lit.getmetaval(meta, key)
|
|
||||||
if missing1 and missing2 then
|
|
||||||
lit.puts("invalid_key", key, mval)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.checkmetatype(type, meta, key)
|
|
||||||
local mval, mtype = lit.getmetaval(meta, key)
|
|
||||||
if type ~= mtype then
|
|
||||||
if type == "path" then
|
|
||||||
if not(pandoc.path.directory(mval):isdir()) then
|
|
||||||
lit.puts("invalid_path", mval, key)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
lit.puts("invalid_type", mtype, key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- TODO: has bug
|
|
||||||
function lit.checkmetatable(table, meta, key)
|
|
||||||
local mval = lit.getmetaval(meta, key)
|
|
||||||
for _, pattern in pairs(table) do
|
|
||||||
if mval:match("^" .. pattern .. "$") == nil then
|
|
||||||
lit.puts("invalid_value", mval, key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.checkmeta(meta, kind)
|
|
||||||
for key, val in pairs(lit.metastruct[kind]) do
|
|
||||||
if meta[key] == nil then
|
|
||||||
if kind == "mandatory" then
|
|
||||||
lit.puts("no_key", key)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if type(val) == "table" then
|
|
||||||
lit.checkmetatable(val, meta, key)
|
|
||||||
else
|
|
||||||
lit.checkmetatype(val, meta, key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function lit.setmeta(meta)
|
|
||||||
lit.checkmeta(meta, "mandatory")
|
|
||||||
lit.checkmeta(meta, "optional")
|
|
||||||
lit.checkmetaextra(meta)
|
|
||||||
-- TODO checks for 2) duplicates
|
|
||||||
-- Set defaults if lit.status = true
|
|
||||||
return meta
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Grammars
|
-- Grammars
|
||||||
lit.g = {}
|
lit.g = {}
|
||||||
|
|
||||||
|
@ -220,6 +68,165 @@ function lit.eval(code)
|
||||||
end
|
end
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
|
function lit.stringify_quoted(quoted)
|
||||||
|
local quote = (quoted.quotetype == SingleQuoted and '"' or "'")
|
||||||
|
quoted = pandoc.utils.stringify(quoted.content)
|
||||||
|
return pandoc.Str(quote .. quoted .. quote)
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.stringify_rawinline(rawinline)
|
||||||
|
local str = rawinline.text
|
||||||
|
str = str:gsub("\\n", "\n"):gsub("\\t", "\t")
|
||||||
|
return pandoc.Str(str)
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.stringify(content)
|
||||||
|
if pandoc.utils.type(content) == "Inlines" then
|
||||||
|
return pandoc.utils.stringify(content:walk {
|
||||||
|
Quoted = function(e) return lit.stringify_quoted(e) end,
|
||||||
|
RawInline = function(e) return lit.stringify_rawinline(e) end,
|
||||||
|
Inline = function(inline) return pandoc.utils.stringify(inline) end,
|
||||||
|
})
|
||||||
|
else
|
||||||
|
return pandoc.utils.stringify(content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.string2other(str)
|
||||||
|
if str == "true" or str == "false" then
|
||||||
|
return str == "true"
|
||||||
|
-- WARN "1" always num; cfr. https://pandoc.org/lua-filters.html#type-metavalue
|
||||||
|
elseif tonumber(str) then
|
||||||
|
return tonumber(str)
|
||||||
|
else
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.meta2table(meta)
|
||||||
|
for k, v in pairs(meta) do
|
||||||
|
if pandoc.utils.type(v) == "table" then
|
||||||
|
meta[k] = lit.meta2table(v)
|
||||||
|
else
|
||||||
|
meta[k] = lit.string2other(lit.stringify(v))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return meta
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.debuglevel(str)
|
||||||
|
if str == "ERROR" then
|
||||||
|
lit.status = false
|
||||||
|
return 2
|
||||||
|
elseif str == "WARNING" then
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
return 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.setmsg(msg, ...)
|
||||||
|
local lang = os.lang()
|
||||||
|
msg = (msg[lang] ~= nil and msg[lang] or msg)
|
||||||
|
for i, str in ipairs({...}) do
|
||||||
|
msg = msg:gsub("#" .. i, str)
|
||||||
|
end
|
||||||
|
return msg
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.getmsg(key, ...)
|
||||||
|
local msg = lit.meta2table(pandoc.read([[#locale()]]).meta)
|
||||||
|
local levelname, level = "INFO", 0
|
||||||
|
for mtype, msgs in pairs(msg) do
|
||||||
|
if msgs[key] ~= nil then
|
||||||
|
key = lit.setmsg(msgs[key], ...)
|
||||||
|
levelname, level = mtype, lit.debuglevel(mtype)
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return key, levelname, level
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.puts(key, ...)
|
||||||
|
local verbosity = lit.debuglevel(PANDOC_STATE.verbosity)
|
||||||
|
local msg, levelname, level = lit.getmsg(key, ...)
|
||||||
|
if level >= verbosity then
|
||||||
|
print("[" .. levelname .. "] [LIT] " .. msg)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.getmetaval(meta, key)
|
||||||
|
local mtype = pandoc.utils.type(meta[key])
|
||||||
|
local mval = meta[key]
|
||||||
|
if mtype == "Inlines" then
|
||||||
|
mval = pandoc.utils.stringify(mval)
|
||||||
|
mtype = pandoc.utils.type(mval)
|
||||||
|
end
|
||||||
|
return mval, mtype
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkextra(meta)
|
||||||
|
for key, val in pairs(meta) do
|
||||||
|
local missing1 = lit.metastruct["mandatory"][key] == nil
|
||||||
|
local missing2 = lit.metastruct["optional"][key] == nil
|
||||||
|
local mval = lit.getmetaval(meta, key)
|
||||||
|
if missing1 and missing2 then
|
||||||
|
lit.puts("invalid_key", key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta_type(type, meta, key)
|
||||||
|
local mval, mtype = lit.getmetaval(meta, key)
|
||||||
|
if type ~= mtype then
|
||||||
|
if type == "path" then
|
||||||
|
if not(pandoc.path.directory(mval):isdir()) then
|
||||||
|
lit.puts("invalid_path", mval, key)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
lit.puts("invalid_type", mtype, key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta_match(table, mval, key)
|
||||||
|
for _, pattern in pairs(table) do
|
||||||
|
if mval:match("^" .. pattern .. "$") then
|
||||||
|
return ""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return key
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta_table(table, meta, key)
|
||||||
|
local mval = lit.getmetaval(meta, key)
|
||||||
|
local err = lit.checkmeta_match(table, mval, key)
|
||||||
|
if not(err:isempty()) then
|
||||||
|
lit.puts("invalid_value", mval, err)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.checkmeta(meta, kind)
|
||||||
|
for key, val in pairs(lit.metastruct[kind]) do
|
||||||
|
if meta[key] == nil and kind == "mandatory" then
|
||||||
|
lit.puts("no_key", key)
|
||||||
|
elseif meta[key] and type(val) == "table" then
|
||||||
|
lit.checkmeta_table(val, meta, key)
|
||||||
|
elseif meta[key] then
|
||||||
|
lit.checkmeta_type(val, meta, key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function lit.setmeta(meta)
|
||||||
|
lit.checkmeta(meta, "mandatory")
|
||||||
|
lit.checkmeta(meta, "optional")
|
||||||
|
lit.checkextra(meta)
|
||||||
|
-- TODO checks for 2) duplicates
|
||||||
|
-- Set defaults if lit.status = true
|
||||||
|
return meta
|
||||||
|
end
|
||||||
|
|
||||||
-- TODO
|
-- TODO
|
||||||
function lit.assert(e, status)
|
function lit.assert(e, status)
|
||||||
if status == false then
|
if status == false then
|
||||||
|
@ -230,6 +237,7 @@ function lit.assert(e, status)
|
||||||
end
|
end
|
||||||
|
|
||||||
function lit.parseyaml(rawyaml)
|
function lit.parseyaml(rawyaml)
|
||||||
|
-- TODO io.try
|
||||||
local yaml = io.popen("pandoc -t json <<<\"" .. rawyaml .. "\" 2>&1")
|
local yaml = io.popen("pandoc -t json <<<\"" .. rawyaml .. "\" 2>&1")
|
||||||
if yaml:read("*l"):sub(1, 1) == "{" then
|
if yaml:read("*l"):sub(1, 1) == "{" then
|
||||||
yaml = pandoc.read(rawyaml).meta
|
yaml = pandoc.read(rawyaml).meta
|
||||||
|
|
|
@ -9,8 +9,8 @@ WARNING:
|
||||||
es: baz
|
es: baz
|
||||||
ERROR:
|
ERROR:
|
||||||
invalid_key:
|
invalid_key:
|
||||||
en: Invalid key '#1' with value '#2'
|
en: Invalid key '#1'
|
||||||
es: Clave '#1' inválida con valor '#2'
|
es: Clave '#1' inválida
|
||||||
invalid_path:
|
invalid_path:
|
||||||
en: Invalid path '#1' in key '#2'
|
en: Invalid path '#1' in key '#2'
|
||||||
es: Ruta '#1' inválida en clave '#2'
|
es: Ruta '#1' inválida en clave '#2'
|
||||||
|
|
Loading…
Reference in New Issue