-
-
Notifications
You must be signed in to change notification settings - Fork 3.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add custom Lua readers #7669
Comments
A prototype is up in the custom-reader branch. |
OK, this is fun. Sample custom reader which works with this branch! -- A sample custom reader for a very simple markup language.
-- This parses a document into paragraphs separated by blank lines.
-- This is _{italic} and this is *{boldface}
-- This is an escaped special character: \_, \*, \{, \}
-- == text makes a level-2 heading
-- That's it!
-- For better performance we put these functions in local variables:
local P, S, R, Cf, Cc, Ct, V, Cs, Cg, Cb, B =
lpeg.P, lpeg.S, lpeg.R, lpeg.Cf, lpeg.Cc, lpeg.Ct, lpeg.V,
lpeg.Cs, lpeg.Cg, lpeg.Cb, lpeg.B
local whitespacechar = S(" \t\r\n")
local specialchar = S("_*{}\\")
local escapedchar = P"\\" * specialchar
/ function (x) return string.sub(x,2) end
local wordchar = (P(1) - (whitespacechar + specialchar)) + escapedchar
local spacechar = S(" \t")
local newline = P"\r"^-1 * P"\n"
local blanklines = newline * spacechar^0 * newline^1
local endline = newline - blanklines
-- Grammar
G = P{ "Pandoc",
Pandoc = blanklines^-1 * Ct(V"Block"^0) / pandoc.Pandoc;
Block = V"Header" + V"Para";
Para = Ct(V"Inline"^1) * blanklines^-1 / pandoc.Para;
Header = Ct(Cg(P("=")^1 / function(x) return #x end, "length")
* spacechar^1
* Cg(Ct(V"Inline"^0), "contents")
* blanklines^-1) /
function(res) return pandoc.Header(res.length, res.contents) end;
Inline = V"Emph" + V"Str" + V"Space" + V"SoftBreak" + V"Special" ;
Str = wordchar^1 / pandoc.Str;
Space = spacechar^1 / pandoc.Space;
SoftBreak = endline / pandoc.SoftBreak;
Emph = Ct(P"_{" * Cg(Ct((V"Inline" - P"}")^1), "contents") * P"}") /
function(res) return pandoc.Emph(res.contents) end;
Special = specialchar / pandoc.Str;
}
function Reader(input)
return lpeg.match(G, input)
end |
See PR #7671 |
New module Text.Pandoc.Readers.Custom, exporting readCustom [API change]. Users can now do `-f myreader.lua` and pandoc will treat the script myreader.lua as a custom reader, which parses an input string to a pandoc AST, using the pandoc module defined for Lua filters. A sample custom reader can be found in data/reader.lua. Closes #7669.
New module Text.Pandoc.Readers.Custom, exporting readCustom [API change]. Users can now do `-f myreader.lua` and pandoc will treat the script myreader.lua as a custom reader, which parses an input string to a pandoc AST, using the pandoc module defined for Lua filters. A sample custom reader can be found in data/reader.lua. Closes #7669.
I've now added a fully functional Creole 1.0 parser as an example (data/creole.lua). It's less than 200 lines of Lua code -- and this custom reader outperforms pandoc's official creole reader! |
These would be similar to custom Lua writers. Possible interface design:
A custom reader would be called by using the name of a lua script as the reader, e.g.
Readers would be expected to define a
Reader
function that takes a string and reader options as input and returns a Pandoc AST.The text was updated successfully, but these errors were encountered: