From e7436e07a0a5c8fefba9b5ea4045172dde71c6c8 Mon Sep 17 00:00:00 2001 From: perro Date: Mon, 17 Apr 2023 17:59:58 -0700 Subject: [PATCH] Finished refactoring --- dist/lin.lua | 85 +++++++++++++++---------------- opt/lua-extensions/extensions.lua | 38 +++++++------- src/literate.lua | 40 +++++++-------- src/pandoc.lua | 6 +-- 4 files changed, 82 insertions(+), 87 deletions(-) diff --git a/dist/lin.lua b/dist/lin.lua index cabc1db..cf9176a 100644 --- a/dist/lin.lua +++ b/dist/lin.lua @@ -6514,19 +6514,20 @@ if pandoc ~= nil then -- @param content pandoc.MetaValue: Pandoc content value -- @return string: Pandoc stringified value function pandoc.utils.rawstringify(content) - if pandoc.utils.type(content) == "Inlines" then - return pandoc.utils.stringify(content:walk { - Quoted = function(quoted) - local q = (quoted.quotetype == SingleQuoted and '"' or "'") - return pandoc.Str(q .. pandoc.utils.stringify(quoted.content) .. q) - 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, - }) - end - return pandoc.utils.stringify(content) + return pandoc.utils.stringify(content:walk { + Plain = function(plain) + table.insert(plain.content, pandoc.Space()) + return plain + end, + Quoted = function(quoted) + local q = (quoted.quotetype == SingleQuoted and '"' or "'") + return pandoc.Str(q .. pandoc.utils.stringify(quoted.content) .. q) + 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, + }) end -- Converts pandoc.Meta to table @@ -6536,17 +6537,17 @@ if pandoc ~= nil then -- @param meta pandoc.Meta: Pandoc MetaValues collection -- @return table: Pandoc metadata as table function pandoc.metatotable(meta) - local newmeta = {} for k, v in pairs(meta) do if pandoc.utils.type(v) == "table" then newmeta[k] = pandoc.metatotable(v) else - newmeta[k] = pandoc.utils.rawstringify(v) - if newmeta[k] == "true" or meta[k] == "false" then - newmeta[k] = newmeta[k] == "true" - elseif tonumber(newmeta[k]) then - newmeta[k] = tonumber(newmeta[k]) + if type(v) == "boolean" then + newmeta[k] = v + elseif tonumber(v) then + newmeta[k] = tonumber(v) + else + newmeta[k] = pandoc.utils.rawstringify(v) end end end @@ -6692,14 +6693,8 @@ ERROR: end end --- TODO --- Inserts evaluations in inline code -function lit.insert(code) - return code -end - --- Examinates (parses and evaluates) code blocks -function lit.exam(blocks) +-- Examinates (parses and evaluates) document +function lit.exam(doc) -- Evaluates code block -- Evals Lisp code @@ -6720,7 +6715,7 @@ function lit.exam(blocks) ]]-- -- Parses code block - local function parse(codeblock, islast) + local function parse(codeblock) -- Checks code block local function check(parsed) @@ -6810,32 +6805,34 @@ function lit.exam(blocks) local checked = (parsed ~= nil and check(parsed) or parsed) -- TODO: -- evaluated = eval(checked) - if islast and not(lit.status) then - lit.puts("aborted") - os.exit(1) - end - -- TODO: -- return evaluated return codeblock end - local curr, last = 0, 0 - blocks:walk { CodeBlock = function(_) last = last + 1 end } - return blocks:walk { - CodeBlock = function(codeblock) - curr = curr + 1 - return parse(codeblock, curr == last) + -- TODO + -- Evals and inserts inline code + local function insert(code) + return code + end + + -- Asserts literate status + local function assert() + if not(lit.status) then + lit.puts("aborted") + os.exit(1) end - } + end + + return doc:walk { CodeBlock = function(block) return parse(block) end } + :walk { Code = function(inline) return insert(inline) end } + :walk { Pandoc = function(_) assert() end } end ------------------------------------ PANDOC ----------------------------------- return { - -- Parses and evals literate blocks - { Blocks = function(blocks) return lit.exam(blocks) end }, - -- Parses and inserts literate evals - { Code = function(code) return lit.insert(code) end }, + -- Parses and evals literate programming + { Pandoc = function(doc) return lit.exam(doc) end }, { -- Parses and evals natural programming -- TODO diff --git a/opt/lua-extensions/extensions.lua b/opt/lua-extensions/extensions.lua index a662aa5..519d27f 100644 --- a/opt/lua-extensions/extensions.lua +++ b/opt/lua-extensions/extensions.lua @@ -253,19 +253,20 @@ if pandoc ~= nil then -- @param content pandoc.MetaValue: Pandoc content value -- @return string: Pandoc stringified value function pandoc.utils.rawstringify(content) - if pandoc.utils.type(content) == "Inlines" then - return pandoc.utils.stringify(content:walk { - Quoted = function(quoted) - local q = (quoted.quotetype == SingleQuoted and '"' or "'") - return pandoc.Str(q .. pandoc.utils.stringify(quoted.content) .. q) - 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, - }) - end - return pandoc.utils.stringify(content) + return pandoc.utils.stringify(content:walk { + Plain = function(plain) + table.insert(plain.content, pandoc.Space()) + return plain + end, + Quoted = function(quoted) + local q = (quoted.quotetype == SingleQuoted and '"' or "'") + return pandoc.Str(q .. pandoc.utils.stringify(quoted.content) .. q) + 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, + }) end -- Converts pandoc.Meta to table @@ -280,11 +281,12 @@ if pandoc ~= nil then if pandoc.utils.type(v) == "table" then newmeta[k] = pandoc.metatotable(v) else - newmeta[k] = pandoc.utils.rawstringify(v) - if newmeta[k] == "true" or meta[k] == "false" then - newmeta[k] = newmeta[k] == "true" - elseif tonumber(newmeta[k]) then - newmeta[k] = tonumber(newmeta[k]) + if type(v) == "boolean" then + newmeta[k] = v + elseif tonumber(v) then + newmeta[k] = tonumber(v) + else + newmeta[k] = pandoc.utils.rawstringify(v) end end end diff --git a/src/literate.lua b/src/literate.lua index 525d9f1..3f26e0a 100644 --- a/src/literate.lua +++ b/src/literate.lua @@ -94,14 +94,8 @@ function lit.puts(key, ...) end end --- TODO --- Inserts evaluations in inline code -function lit.insert(code) - return code -end - --- Examinates (parses and evaluates) code blocks -function lit.exam(blocks) +-- Examinates (parses and evaluates) document +function lit.exam(doc) -- Evaluates code block -- Evals Lisp code @@ -122,7 +116,7 @@ function lit.exam(blocks) ]]-- -- Parses code block - local function parse(codeblock, islast) + local function parse(codeblock) -- Checks code block local function check(parsed) @@ -212,23 +206,27 @@ function lit.exam(blocks) local checked = (parsed ~= nil and check(parsed) or parsed) -- TODO: -- evaluated = eval(checked) - if islast and not(lit.status) then - lit.puts("aborted") - os.exit(1) - end - -- TODO: -- return evaluated return codeblock end - local curr, last = 0, 0 - blocks:walk { CodeBlock = function(_) last = last + 1 end } - return blocks:walk { - CodeBlock = function(codeblock) - curr = curr + 1 - return parse(codeblock, curr == last) + -- TODO + -- Evals and inserts inline code + local function insert(code) + return code + end + + -- Asserts literate status + local function assert() + if not(lit.status) then + lit.puts("aborted") + os.exit(1) end - } + end + + return doc:walk { CodeBlock = function(block) return parse(block) end } + :walk { Code = function(inline) return insert(inline) end } + :walk { Pandoc = function(_) assert() end } end return lit diff --git a/src/pandoc.lua b/src/pandoc.lua index ad030b1..3133977 100644 --- a/src/pandoc.lua +++ b/src/pandoc.lua @@ -1,10 +1,8 @@ ------------------------------------ PANDOC ----------------------------------- return { - -- Parses and evals literate blocks - { Blocks = function(blocks) return lit.exam(blocks) end }, - -- Parses and inserts literate evals - { Code = function(code) return lit.insert(code) end }, + -- Parses and evals literate programming + { Pandoc = function(doc) return lit.exam(doc) end }, { -- Parses and evals natural programming -- TODO