From 26a62a3f25c865a9f708ea8539d8e90a6ba6d8ed Mon Sep 17 00:00:00 2001 From: perro Date: Thu, 20 Apr 2023 13:37:10 -0700 Subject: [PATCH] Check meta done --- dist/lin.lua | 123 ++++++++++++++++++++---------- src/literate.lua | 118 +++++++++++++++++++--------- src/locale.yaml | 6 +- tests/asts/pass.lit.warns.md.json | 2 +- 4 files changed, 167 insertions(+), 82 deletions(-) diff --git a/dist/lin.lua b/dist/lin.lua index 0631934..0e806cb 100644 --- a/dist/lin.lua +++ b/dist/lin.lua @@ -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 diff --git a/src/literate.lua b/src/literate.lua index a0d7e7f..d1436d1 100644 --- a/src/literate.lua +++ b/src/literate.lua @@ -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 diff --git a/src/locale.yaml b/src/locale.yaml index 3610fdf..2bf924e 100644 --- a/src/locale.yaml +++ b/src/locale.yaml @@ -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' diff --git a/tests/asts/pass.lit.warns.md.json b/tests/asts/pass.lit.warns.md.json index f311630..3dd3446 100644 --- a/tests/asts/pass.lit.warns.md.json +++ b/tests/asts/pass.lit.warns.md.json @@ -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"]}]}