Check meta done

This commit is contained in:
perro tuerto 2023-04-20 13:37:10 -07:00
parent 3b140b6953
commit 26a62a3f25
4 changed files with 167 additions and 82 deletions

123
dist/lin.lua vendored
View File

@ -6573,28 +6573,6 @@ local lit = {}
-- Status indicator
lit.status = true
-- Valid metadata structure
lit.metastruct = {
["mandatory"] = {
-- Value as table == whole patterns to match
["id"] = {"%a[_%w]*"},
},
["optional"] = {
["lang"] = {"lua", "fennel", "python", "js", "ruby", "lisp", "graphviz"},
["cmd"] = {".+"},
-- Value as string == type to match
["args"] = "table",
["shift"] = "boolean",
["wipe"] = "boolean",
["typed"] = "boolean",
["link"] = "path",
["img"] = "path",
["alt"] = "string",
["dump"] = "path",
["quote"] = "boolean",
},
}
-- Grammars
function lit.g(name)
@ -6650,9 +6628,9 @@ INFO:
en: "Skipping '#1': this check is not supported"
es: "Skipping '#1': esta comprobación no está soportada"
WARNING:
foo:
en: bar
es: baz
ignore_lang:
en: "Keys 'cmd' and 'lang' present: '#1' overrides '#2'"
es: "Llaves 'cmd' y 'lang' presentes: '#1' sobrescribe '#2'"
ERROR:
invalid_key:
en: Invalid key '#1'
@ -6728,6 +6706,69 @@ function lit.exam(doc)
-- Checks code block
local function check(parsed)
-- Indicates if checks passes
local ispass = true
-- Valid metadata structure
local metastruct = {
["mandatory"] = {
-- Value as table == whole patterns to match
["id"] = {"%a[_%w]*"},
},
["optional"] = {
["lang"] = {
"lua", "fennel", "python", "js", "ruby", "lisp", "graphviz",
},
["cmd"] = {".+"},
-- Value as string == type to match
["args"] = "table",
["shift"] = "boolean",
["wipe"] = "boolean",
["typed"] = "boolean",
["link"] = "path",
["img"] = "path",
["alt"] = "string",
["dump"] = "path",
["quote"] = "boolean",
},
}
-- Language commands
local langcmds = {
["lua"] = {["int"] = "TODO"},
["fennel"] = {["int"] = "TODO"},
["python"] = {["ext"] = "TODO"},
["js"] = {["ext"] = "TODO"},
["ruby"] = {["ext"] = "TODO"},
["lisp"] = {["ext"] = "TODO"},
["graphviz"] = {["ext"] = "TODO"},
}
local function putserr(...)
lit.puts(...)
ispass = false
end
-- Checks language and command
local function addeval(meta)
meta["eval"] = {}
if ispass then
if meta["lang"] and meta["cmd"] then
lit.puts("ignore_lang", meta["cmd"], meta["lang"])
meta["eval"] = {["ext"] = meta["cmd"]}
elseif not(meta["lang"]) and not(meta["cmd"])then
meta["lang"] = "lua"
meta["eval"] = langcmds["lua"]
elseif meta["lang"] and not(meta["cmd"]) then
meta["eval"] = langcmds[meta["lang"]]
elseif not(meta["lang"]) and meta["cmd"] then
meta["eval"] = {["ext"] = meta["cmd"]}
end
end
print(meta["lang"], meta["eval"]["int"], meta["eval"]["ext"])
return meta
end
-- Checks for valid command
local function checkcmd(meta)
@ -6735,7 +6776,9 @@ function lit.exam(doc)
cmd = meta["cmd"]:split()[1]
if os.isunix() then
status = io.try("type", cmd)
if not(status) then lit.puts("invalid_cmd", cmd) end
if not(status) then
putserr("invalid_cmd", cmd)
end
else
lit.puts("skip_check", "checkcmd")
end
@ -6745,10 +6788,10 @@ function lit.exam(doc)
-- Checks for extra and unwanted metadata
local function checkextra(meta)
for key, val in pairs(meta) do
local missing1 = lit.metastruct["mandatory"][key] == nil
local missing2 = lit.metastruct["optional"][key] == nil
local missing1 = metastruct["mandatory"][key] == nil
local missing2 = metastruct["optional"][key] == nil
if missing1 and missing2 then
lit.puts("invalid_key", key)
putserr("invalid_key", key)
end
end
end
@ -6763,10 +6806,10 @@ function lit.exam(doc)
if type1 ~= type2 then
if type1 == "path" then
if not(pandoc.path.directory(val):isdir()) then
lit.puts("invalid_path", val, key)
putserr("invalid_path", val, key)
end
else
lit.puts("invalid_type", type2, key)
putserr("invalid_type", type2, key)
end
end
end
@ -6782,13 +6825,13 @@ function lit.exam(doc)
end
end
if not(err:isempty()) then
lit.puts("invalid_value", val, err)
putserr("invalid_value", val, err)
end
end
for key, val in pairs(lit.metastruct[kind]) do
for key, val in pairs(metastruct[kind]) do
if meta[key] == nil and kind == "mandatory" then
lit.puts("no_key", key)
putserr("no_key", key)
elseif meta[key] and type(val) == "table" then
checkpattern(val, meta, key)
elseif meta[key] then
@ -6803,25 +6846,25 @@ function lit.exam(doc)
local meta = {}
if isok and not(pandoc.utils.stringify(res.meta):isempty()) then
meta = pandoc.metatotable(res.meta)
-- These 3 checks should
checkmeta(meta, "mandatory")
checkmeta(meta, "optional")
checkextra(meta)
checkcmd(meta)
-- TODO: checks for
-- with lang and cmd (warn)
-- overrides (warn)
elseif isok and pandoc.utils.stringify(res.meta):isempty() then
lit.puts("meta_empty")
putserr("meta_empty")
else
lit.puts("meta_invalid")
putserr("meta_invalid")
end
return meta
return addeval(meta)
end
lit.puts("checking", table.concat(parsed, ""):indent())
local meta = parsemeta(parsed[1])
-- TODO:
-- meta["code"] = checkcode(parsed[2], meta)
-- TODO: checks for
-- overrides (warn)
-- return meta
return meta
end

View File

@ -6,28 +6,6 @@ local lit = {}
-- Status indicator
lit.status = true
-- Valid metadata structure
lit.metastruct = {
["mandatory"] = {
-- Value as table == whole patterns to match
["id"] = {"%a[_%w]*"},
},
["optional"] = {
["lang"] = {"lua", "fennel", "python", "js", "ruby", "lisp", "graphviz"},
["cmd"] = {".+"},
-- Value as string == type to match
["args"] = "table",
["shift"] = "boolean",
["wipe"] = "boolean",
["typed"] = "boolean",
["link"] = "path",
["img"] = "path",
["alt"] = "string",
["dump"] = "path",
["quote"] = "boolean",
},
}
-- Grammars
function lit.g(name)
@ -120,6 +98,70 @@ function lit.exam(doc)
-- Checks code block
local function check(parsed)
-- Indicates if checks passes
local ispass = true
-- Valid metadata structure
local metastruct = {
["mandatory"] = {
-- Value as table == whole patterns to match
["id"] = {"%a[_%w]*"},
},
["optional"] = {
["lang"] = {
"lua", "fennel", "python", "js", "ruby", "lisp", "graphviz",
},
["cmd"] = {".+"},
-- Value as string == type to match
["args"] = "table",
["shift"] = "boolean",
["wipe"] = "boolean",
["typed"] = "boolean",
["link"] = "path",
["img"] = "path",
["alt"] = "string",
["dump"] = "path",
["quote"] = "boolean",
},
}
-- Language commands
local langcmds = {
["lua"] = {["int"] = "TODO"},
["fennel"] = {["int"] = "TODO"},
["python"] = {["ext"] = "TODO"},
["js"] = {["ext"] = "TODO"},
["ruby"] = {["ext"] = "TODO"},
["lisp"] = {["ext"] = "TODO"},
["graphviz"] = {["ext"] = "TODO"},
}
-- Prints error and does not pass the check
local function putserr(...)
lit.puts(...)
ispass = false
end
-- Adds 'eval' key in meta
-- This keys indicates what to eval
local function addeval(meta)
meta["eval"] = {}
if ispass then
if meta["lang"] and meta["cmd"] then
lit.puts("ignore_lang", meta["cmd"], meta["lang"])
meta["eval"] = {["ext"] = meta["cmd"]}
elseif not(meta["lang"]) and not(meta["cmd"])then
meta["lang"] = "lua"
meta["eval"] = langcmds["lua"]
elseif meta["lang"] and not(meta["cmd"]) then
meta["eval"] = langcmds[meta["lang"]]
elseif not(meta["lang"]) and meta["cmd"] then
meta["eval"] = {["ext"] = meta["cmd"]}
end
end
return meta
end
-- Checks for valid command
local function checkcmd(meta)
@ -127,7 +169,9 @@ function lit.exam(doc)
cmd = meta["cmd"]:split()[1]
if os.isunix() then
status = io.try("type", cmd)
if not(status) then lit.puts("invalid_cmd", cmd) end
if not(status) then
putserr("invalid_cmd", cmd)
end
else
lit.puts("skip_check", "checkcmd")
end
@ -137,10 +181,10 @@ function lit.exam(doc)
-- Checks for extra and unwanted metadata
local function checkextra(meta)
for key, val in pairs(meta) do
local missing1 = lit.metastruct["mandatory"][key] == nil
local missing2 = lit.metastruct["optional"][key] == nil
local missing1 = metastruct["mandatory"][key] == nil
local missing2 = metastruct["optional"][key] == nil
if missing1 and missing2 then
lit.puts("invalid_key", key)
putserr("invalid_key", key)
end
end
end
@ -155,10 +199,10 @@ function lit.exam(doc)
if type1 ~= type2 then
if type1 == "path" then
if not(pandoc.path.directory(val):isdir()) then
lit.puts("invalid_path", val, key)
putserr("invalid_path", val, key)
end
else
lit.puts("invalid_type", type2, key)
putserr("invalid_type", type2, key)
end
end
end
@ -174,13 +218,13 @@ function lit.exam(doc)
end
end
if not(err:isempty()) then
lit.puts("invalid_value", val, err)
putserr("invalid_value", val, err)
end
end
for key, val in pairs(lit.metastruct[kind]) do
for key, val in pairs(metastruct[kind]) do
if meta[key] == nil and kind == "mandatory" then
lit.puts("no_key", key)
putserr("no_key", key)
elseif meta[key] and type(val) == "table" then
checkpattern(val, meta, key)
elseif meta[key] then
@ -199,22 +243,19 @@ function lit.exam(doc)
checkmeta(meta, "optional")
checkextra(meta)
checkcmd(meta)
-- TODO: checks for
-- with lang and cmd (warn)
-- overrides (warn)
elseif isok and pandoc.utils.stringify(res.meta):isempty() then
lit.puts("meta_empty")
putserr("meta_empty")
else
lit.puts("meta_invalid")
putserr("meta_invalid")
end
return meta
return addeval(meta)
end
lit.puts("checking", table.concat(parsed, ""):indent())
local meta = parsemeta(parsed[1])
-- TODO:
-- meta["code"] = checkcode(parsed[2], meta)
-- return meta
-- NOTE: if not valid code, return meta["eval"] = {}
return meta
end
@ -222,6 +263,7 @@ function lit.exam(doc)
local checked = (parsed ~= nil and check(parsed) or parsed)
-- TODO:
-- evaluated = eval(checked)
-- TODO: write evaluated and do overrides with warns
-- return evaluated
return codeblock
end

View File

@ -7,9 +7,9 @@ INFO:
en: "Skipping '#1': this check is not supported"
es: "Skipping '#1': esta comprobación no está soportada"
WARNING:
foo:
en: bar
es: baz
ignore_lang:
en: "Keys 'cmd' and 'lang' present: '#1' overrides '#2'"
es: "Llaves 'cmd' y 'lang' presentes: '#1' sobrescribe '#2'"
ERROR:
invalid_key:
en: Invalid key '#1'

View File

@ -1 +1 @@
{"pandoc-api-version":[1,23],"meta":{},"blocks":[{"t":"Header","c":[1,["block-override",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"Override"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn1\n...\n1 + 2 + 3"]},{"t":"Para","c":[{"t":"Str","c":"Override:"}]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn1\n...\n4 + 5 + 6"]},{"t":"Header","c":[1,["block-with-unused-argument",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"with"},{"t":"Space"},{"t":"Str","c":"Unused"},{"t":"Space"},{"t":"Str","c":"Argument"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn3\nargs:\n a: 1\n...\n7 + 8 + 9"]},{"t":"Header","c":[1,["block-with-language-and-command",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"with"},{"t":"Space"},{"t":"Str","c":"Language"},{"t":"Space"},{"t":"Str","c":"and"},{"t":"Space"},{"t":"Str","c":"Command"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn4\nlang: python\ncmd: python -E -X utf8\nargs:\n n: 2\n...\n#n * #n"]},{"t":"Header","c":[1,["block-with-unknown-language",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"with"},{"t":"Space"},{"t":"Str","c":"Unknown"},{"t":"Space"},{"t":"Str","c":"Language"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn5\n...\n\"Lang becomes cmd.\""]}]}
{"pandoc-api-version":[1,23],"meta":{},"blocks":[{"t":"Header","c":[1,["block-override",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"Override"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn1\n...\n1 + 1"]},{"t":"Para","c":[{"t":"Str","c":"Override:"}]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn1\n...\n1 + 2"]},{"t":"Header","c":[1,["block-with-language-and-command",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"with"},{"t":"Space"},{"t":"Str","c":"Language"},{"t":"Space"},{"t":"Str","c":"and"},{"t":"Space"},{"t":"Str","c":"Command"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn4\nlang: python\ncmd: python -E -X utf8\n...\n1 + 1"]},{"t":"Header","c":[1,["block-with-unused-argument",[],[]],[{"t":"Str","c":"Block"},{"t":"Space"},{"t":"Str","c":"with"},{"t":"Space"},{"t":"Str","c":"Unused"},{"t":"Space"},{"t":"Str","c":"Argument"}]]},{"t":"CodeBlock","c":[["",[],[]],"---\nid: fn3\nargs:\n a: 1\n...\n1 + 1"]}]}