summaryrefslogtreecommitdiff
path: root/data/pandoc.lua
diff options
context:
space:
mode:
authorAlbert Krewinkel <albert+github@zeitkraut.de>2017-03-20 15:17:03 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2017-03-20 15:17:03 +0100
commitf2f6851713674545e2f303b95589cbaff8e6a6b9 (patch)
treea3b65213bb63aece6b0ae3726394abb153b1c7fd /data/pandoc.lua
parentb010a8c5e7ba4969100fe078f0f9a1a6cdaf7c5c (diff)
Lua filters (#3514)
* Add `--lua-filter` option. This works like `--filter` but takes pathnames of special lua filters and uses the lua interpreter baked into pandoc, so that no external interpreter is needed. Note that lua filters are all applied after regular filters, regardless of their position on the command line. * Add Text.Pandoc.Lua, exporting `runLuaFilter`. Add `pandoc.lua` to data files. * Add private module Text.Pandoc.Lua.PandocModule to supply the default lua module. * Add Tests.Lua to tests. * Add data/pandoc.lua, the lua module pandoc imports when processing its lua filters. * Document in MANUAL.txt.
Diffstat (limited to 'data/pandoc.lua')
-rw-r--r--data/pandoc.lua144
1 files changed, 144 insertions, 0 deletions
diff --git a/data/pandoc.lua b/data/pandoc.lua
new file mode 100644
index 000000000..79729fc35
--- /dev/null
+++ b/data/pandoc.lua
@@ -0,0 +1,144 @@
+--[[
+pandoc.lua
+
+Copyright (c) 2017 Albert Krewinkel
+
+Permission to use, copy, modify, and/or distribute this software for any purpose
+with or without fee is hereby granted, provided that the above copyright notice
+and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+]]
+
+--- The module
+local M = {
+ _version = "0.1.0"
+}
+
+--- Create a new set of attributes (Attr).
+function M.Attributes(id, classes, key_values)
+ return {id, classes, key_values}
+end
+
+local Element = {}
+--- Create a new element subtype
+function Element:make_subtype(o)
+ o = o or {}
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+--- Create a new element given its tag and arguments
+function Element:new(tag, ...)
+ local element = { t = tag }
+ local content = {...}
+ -- special case for unary constructors
+ if #content == 1 then
+ element.c = content[1]
+ -- Don't set 'c' field if no further arguments were given. This is important
+ -- for nullary constructors like `Space` and `HorizontalRule`.
+ elseif #content > 0 then
+ element.c = content
+ end
+ setmetatable(element, self)
+ self.__index = self
+ return element
+end
+
+local function Doc(blocks, meta)
+ return {
+ ["blocks"] = blocks,
+ ["meta"] = meta,
+ ["pandoc-api-version"] = {1,17,0,5},
+ }
+end
+
+local Inline = Element:make_subtype{}
+local Block = Element:make_subtype{}
+
+M.block_types = {
+ "BlockQuote",
+ "BulletList",
+ "CodeBlock",
+ "DefinitionList",
+ "Div",
+ "Header",
+ "HorizontalRule",
+ "HorizontalRule",
+ "LineBlock",
+ "Null",
+ "OrderedList",
+ "Para",
+ "Plain",
+ "RawBlock",
+ "Table",
+}
+
+M.inline_types = {
+ "Cite",
+ "Code",
+ "DisplayMath",
+ "DoubleQuoted",
+ "Emph",
+ "Image",
+ "InlineMath",
+ "LineBreak",
+ "Link",
+ "Math",
+ "Note",
+ "Quoted",
+ "RawInline",
+ "SingleQuoted",
+ "SmallCaps",
+ "SoftBreak",
+ "Space",
+ "Span",
+ "Str",
+ "Strikeout",
+ "Strong",
+ "Subscript",
+ "Superscript"
+}
+
+for _, block_type in pairs(M.block_types) do
+ M[block_type] = function(...)
+ return Block:new(block_type, ...)
+ end
+end
+
+for _, inline_type in pairs(M.inline_types) do
+ M[inline_type] = function(...)
+ return Inline:new(inline_type, ...)
+ end
+end
+
+--- Arrays to provide fast lookup of element types
+local set_of_inline_types = {}
+local set_of_block_types = {}
+
+for i = 1, #M.inline_types do
+ set_of_inline_types[M.inline_types[i]] = true
+end
+for i = 1, #M.block_types do
+ set_of_block_types[M.block_types[i]] = true
+end
+
+function M.global_filter()
+ local res = {}
+ for k, v in pairs(_G) do
+ if set_of_inline_types[k] or set_of_block_types[k] or k == "Doc" then
+ res[k] = v
+ end
+ end
+ return res
+end
+
+M["Doc"] = Doc
+
+return M