Check meta done
This commit is contained in:
parent
3b140b6953
commit
26a62a3f25
|
@ -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
|
||||
|
|
118
src/literate.lua
118
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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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"]}]}
|
||||
|
|
Loading…
Reference in New Issue