computable-pandoc/src/literate.lua

61 lines
1.8 KiB
Lua

-------------------------------------------------------------------------------
-- IMPORTANT: these lines are changed to "local fennel = mod"
-- IMPORTANT: these line are for development setup
-- Enables Fennel <https://fennel-lang.org> for Lisp-Lua compatibility
local src_root = pandoc.path.directory(PANDOC_SCRIPT_FILE)
local fennel_lua = pandoc.path.join({src_root, "../opt/fennel.lua"})
package.path = package.path .. ";" .. fennel_lua
local fennel = require("fennel")
-------------------------------------------------------------------------------
-- Lua LPeg shortcuts
local P, S, R, Cf, Cc, Ct, V, Cs, Cg, Cb, B, C, Cmt =
lpeg.P, lpeg.S, lpeg.R, lpeg.Cf, lpeg.Cc, lpeg.Ct, lpeg.V,
lpeg.Cs, lpeg.Cg, lpeg.Cb, lpeg.B, lpeg.C, lpeg.Cmt
-- Lexical elements
local space = S(" \t\r\n")
local lbracket = P"("
local rbracket = P")"
local word = (1 - (space + lbracket + rbracket))
-- Grammar
G = P{
"Doc";
Doc = space^0 * Ct(V"SExpr"^0) * space^0 / pandoc.Pandoc;
SExpr = (V"List" + V"Atom");
List = lbracket * V"SExpr"^0 * rbracket;
Atom = space + V"Word";
Word = word^1 / pandoc.Str;
}
-- Evals Lisp code
-- @param code string: code to evaluate
-- @return table: evaluation result as {bool, string, string, string}
local function eval(code)
local is_passed, out = pcall (
function () return fennel.eval(code) end,
function (e) return e end
)
local lua = ""
local out = tostring(out)
local preview = out:gsub("\n.*", "")
if is_passed then
lua = fennel.compileString(code)
end
return {is_passed = is_passed, preview = preview, out = out, lua = lua}
end
-- Calls Pandoc Reader.
function Reader(input, options)
--[[
local doc = lpeg.match(G, tostring(input))
if options.standalone then
return exec(doc)
else
return doc
end
]]--
return pandoc.Pandoc(tostring(input))
end