Blame data/pandoc.lua

Packit dda32d
--[[
Packit dda32d
pandoc.lua
Packit dda32d
Packit dda32d
Copyright © 2017 Albert Krewinkel
Packit dda32d
Packit dda32d
Permission to use, copy, modify, and/or distribute this software for any purpose
Packit dda32d
with or without fee is hereby granted, provided that the above copyright notice
Packit dda32d
and this permission notice appear in all copies.
Packit dda32d
Packit dda32d
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
Packit dda32d
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
Packit dda32d
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
Packit dda32d
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
Packit dda32d
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
Packit dda32d
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
Packit dda32d
THIS SOFTWARE.
Packit dda32d
]]
Packit dda32d
Packit dda32d
---
Packit dda32d
-- Lua functions for pandoc scripts.
Packit dda32d
--
Packit dda32d
-- @author Albert Krewinkel
Packit dda32d
-- @copyright © 2017 Albert Krewinkel
Packit dda32d
-- @license MIT
Packit dda32d
local M = {
Packit dda32d
  _VERSION = "0.3.0"
Packit dda32d
}
Packit dda32d
Packit dda32d
local List = require 'pandoc.List'
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- The base class for pandoc's AST elements.
Packit dda32d
-- @type Element
Packit dda32d
-- @local
Packit dda32d
local Element = {}
Packit dda32d
Packit dda32d
--- Create a new element subtype
Packit dda32d
-- @local
Packit dda32d
function Element:make_subtype(o)
Packit dda32d
  o = o or {}
Packit dda32d
  setmetatable(o, self)
Packit dda32d
  self.__index = self
Packit dda32d
  return o
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Create a new element given its tag and arguments
Packit dda32d
-- @local
Packit dda32d
function Element:new(tag, ...)
Packit dda32d
  local element = { t = tag }
Packit dda32d
  local content = {...}
Packit dda32d
  -- special case for unary constructors
Packit dda32d
  if #content == 1 then
Packit dda32d
    element.c = content[1]
Packit dda32d
  -- Don't set 'c' field if no further arguments were given. This is important
Packit dda32d
  -- for nullary constructors like `Space` and `HorizontalRule`.
Packit dda32d
  elseif #content > 0 then
Packit dda32d
    element.c = content
Packit dda32d
  end
Packit dda32d
  setmetatable(element, self)
Packit dda32d
  self.__index = self
Packit dda32d
  return element
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Create a new constructor
Packit dda32d
-- @local
Packit dda32d
-- @param tag Tag used to identify the constructor
Packit dda32d
-- @param fn Function to be called when constructing a new element
Packit dda32d
-- @param accessors names to use as accessors for numerical fields
Packit dda32d
-- @return function that constructs a new element
Packit dda32d
function Element:create_constructor(tag, fn, accessors)
Packit dda32d
  local constr = self:make_subtype({tag = tag, getters = {}, setters = {}})
Packit dda32d
Packit dda32d
  -- Add accessors to the metatable
Packit dda32d
  if type(accessors) == "string" then
Packit dda32d
    constr.getters[accessors] = function(elem)
Packit dda32d
      return elem.c
Packit dda32d
    end
Packit dda32d
    constr.setters[accessors] = function(elem, v)
Packit dda32d
      elem.c = v
Packit dda32d
    end
Packit dda32d
  else
Packit dda32d
    for i = 1, #(accessors or {}) do
Packit dda32d
      if type(accessors[i]) == "string" then
Packit dda32d
        constr.getters[accessors[i]] = function(elem)
Packit dda32d
          return elem.c[i]
Packit dda32d
        end
Packit dda32d
        constr.setters[accessors[i]] = function(elem, v)
Packit dda32d
          elem.c[i] = v
Packit dda32d
        end
Packit dda32d
      else -- only two levels of nesting are supported
Packit dda32d
        for k, v in ipairs(accessors[i]) do
Packit dda32d
          constr.getters[v] = function(elem)
Packit dda32d
            return elem.c[i][k]
Packit dda32d
          end
Packit dda32d
          constr.setters[v] = function(elem, v)
Packit dda32d
            elem.c[i][k] = v
Packit dda32d
          end
Packit dda32d
        end
Packit dda32d
      end
Packit dda32d
    end
Packit dda32d
  end
Packit dda32d
Packit dda32d
  function constr:new(...)
Packit dda32d
    local obj = fn(...)
Packit dda32d
    setmetatable(obj, self)
Packit dda32d
    self.__index = function(t, k)
Packit dda32d
      if getmetatable(t).getters[k] then
Packit dda32d
        return getmetatable(t).getters[k](t)
Packit dda32d
      elseif k == "t" then
Packit dda32d
        return getmetatable(t)["tag"]
Packit dda32d
      else
Packit dda32d
        return getmetatable(t)[k]
Packit dda32d
      end
Packit dda32d
    end
Packit dda32d
    self.__newindex = function(t, k, v)
Packit dda32d
      if getmetatable(t).setters[k] then
Packit dda32d
        getmetatable(t).setters[k](t, v)
Packit dda32d
      else
Packit dda32d
        rawset(t, k, v)
Packit dda32d
      end
Packit dda32d
    end
Packit dda32d
    return obj
Packit dda32d
  end
Packit dda32d
  self.constructor = self.constructor or {}
Packit dda32d
  self.constructor[tag] = constr
Packit dda32d
  return constr
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Calls the constructor, creating a new element.
Packit dda32d
-- @local
Packit dda32d
function Element.__call(t, ...)
Packit dda32d
  return t:new(...)
Packit dda32d
end
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
--- Pandoc Document
Packit dda32d
-- @section document
Packit dda32d
Packit dda32d
--- A complete pandoc document
Packit dda32d
-- @function Pandoc
Packit dda32d
-- @tparam      {Block,...} blocks      document content
Packit dda32d
-- @tparam[opt] Meta        meta        document meta data
Packit dda32d
function M.Pandoc(blocks, meta)
Packit dda32d
  meta = meta or {}
Packit dda32d
  return {
Packit dda32d
    ["blocks"] = List:new(blocks),
Packit dda32d
    ["meta"] = meta,
Packit dda32d
    ["pandoc-api-version"] = {1,17,0,5},
Packit dda32d
  }
Packit dda32d
end
Packit dda32d
Packit dda32d
-- DEPRECATED synonym:
Packit dda32d
M.Doc = M.Pandoc
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Meta
Packit dda32d
-- @section Meta
Packit dda32d
Packit dda32d
--- Create a new Meta object. It sets the metatable of the given table to
Packit dda32d
--- `Meta`.
Packit dda32d
-- @function Meta
Packit dda32d
-- @tparam meta table table containing document meta information
Packit dda32d
M.Meta = {}
Packit dda32d
M.Meta.__call = function(t, meta)
Packit dda32d
  return setmetatable(meta, t)
Packit dda32d
end
Packit dda32d
setmetatable(M.Meta, M.Meta)
Packit dda32d
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- MetaValue
Packit dda32d
-- @section MetaValue
Packit dda32d
M.MetaValue = Element:make_subtype{}
Packit dda32d
M.MetaValue.__call = function(t, ...)
Packit dda32d
  return t:new(...)
Packit dda32d
end
Packit dda32d
--- Meta blocks
Packit dda32d
-- @function MetaBlocks
Packit dda32d
-- @tparam {Block,...} blocks blocks
Packit dda32d
Packit dda32d
--- Meta inlines
Packit dda32d
-- @function MetaInlines
Packit dda32d
-- @tparam {Inline,...} inlines inlines
Packit dda32d
Packit dda32d
--- Meta list
Packit dda32d
-- @function MetaList
Packit dda32d
-- @tparam {MetaValue,...} meta_values list of meta values
Packit dda32d
M.meta_value_list_types = {
Packit dda32d
  "MetaBlocks",
Packit dda32d
  "MetaInlines",
Packit dda32d
  "MetaList",
Packit dda32d
}
Packit dda32d
for i = 1, #M.meta_value_list_types do
Packit dda32d
  M[M.meta_value_list_types[i]] = M.MetaValue:create_constructor(
Packit dda32d
    M.meta_value_list_types[i],
Packit dda32d
    function(content)
Packit dda32d
      return List:new(content)
Packit dda32d
    end
Packit dda32d
  )
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Meta map
Packit dda32d
-- @function MetaMap
Packit dda32d
-- @tparam table key_value_map a string-indexed map of meta values
Packit dda32d
M.MetaMap = M.MetaValue:create_constructor(
Packit dda32d
  "MetaMap",
Packit dda32d
  function (mm) return mm end
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates string to be used in meta data.
Packit dda32d
-- Does nothing, lua strings are meta strings.
Packit dda32d
-- @function MetaString
Packit dda32d
-- @tparam string str string value
Packit dda32d
function M.MetaString(str)
Packit dda32d
  return str
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Creates boolean to be used in meta data.
Packit dda32d
-- Does nothing, lua booleans are meta booleans.
Packit dda32d
-- @function MetaBool
Packit dda32d
-- @tparam boolean bool boolean value
Packit dda32d
function M.MetaBool(bool)
Packit dda32d
  return bool
Packit dda32d
end
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Blocks
Packit dda32d
-- @section Block
Packit dda32d
Packit dda32d
--- Block elements
Packit dda32d
M.Block = Element:make_subtype{}
Packit dda32d
M.Block.__call = function (t, ...)
Packit dda32d
  return t:new(...)
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Creates a block quote element
Packit dda32d
-- @function BlockQuote
Packit dda32d
-- @tparam      {Block,...} content     block content
Packit dda32d
-- @treturn     Block                   block quote element
Packit dda32d
M.BlockQuote = M.Block:create_constructor(
Packit dda32d
  "BlockQuote",
Packit dda32d
  function(content) return {c = content} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a bullet (i.e. unordered) list.
Packit dda32d
-- @function BulletList
Packit dda32d
-- @tparam      {{Block,...},...} content     list of items
Packit dda32d
-- @treturn     Block block quote element
Packit dda32d
M.BulletList = M.Block:create_constructor(
Packit dda32d
  "BulletList",
Packit dda32d
  function(content) return {c = content} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a code block element
Packit dda32d
-- @function CodeBlock
Packit dda32d
-- @tparam      string      text        code string
Packit dda32d
-- @tparam[opt] Attr        attr element attributes
Packit dda32d
-- @treturn     Block                   code block element
Packit dda32d
M.CodeBlock = M.Block:create_constructor(
Packit dda32d
  "CodeBlock",
Packit dda32d
  function(text, attr) return {c = {attr or M.Attr(), text}} end,
Packit dda32d
  {{"identifier", "classes", "attributes"}, "text"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a definition list, containing terms and their explanation.
Packit dda32d
-- @function DefinitionList
Packit dda32d
-- @tparam      {{{Inline,...},{Block,...}},...} content     list of items
Packit dda32d
-- @treturn     Block block quote element
Packit dda32d
M.DefinitionList = M.Block:create_constructor(
Packit dda32d
  "DefinitionList",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a div element
Packit dda32d
-- @function Div
Packit dda32d
-- @tparam      {Block,...} content     block content
Packit dda32d
-- @tparam[opt] Attr        attr  element attributes
Packit dda32d
-- @treturn     Block                   code block element
Packit dda32d
M.Div = M.Block:create_constructor(
Packit dda32d
  "Div",
Packit dda32d
  function(content, attr)
Packit dda32d
    return {c = {attr or M.Attr(), List:new(content)}}
Packit dda32d
  end,
Packit dda32d
  {{"identifier", "classes", "attributes"}, "content"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a block quote element.
Packit dda32d
-- @function Header
Packit dda32d
-- @tparam      int          level       header level
Packit dda32d
-- @tparam      {Inline,...} content     inline content
Packit dda32d
-- @tparam[opt] Attr         attr element attributes
Packit dda32d
-- @treturn     Block                    header element
Packit dda32d
M.Header = M.Block:create_constructor(
Packit dda32d
  "Header",
Packit dda32d
  function(level, content, attr)
Packit dda32d
    return {c = {level, attr or M.Attr(), content}}
Packit dda32d
  end,
Packit dda32d
  {"level", {"identifier", "classes", "attributes"}, "content"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a horizontal rule.
Packit dda32d
-- @function HorizontalRule
Packit dda32d
-- @treturn     Block                   horizontal rule
Packit dda32d
M.HorizontalRule = M.Block:create_constructor(
Packit dda32d
  "HorizontalRule",
Packit dda32d
  function() return {} end
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a line block element.
Packit dda32d
-- @function LineBlock
Packit dda32d
-- @tparam      {{Inline,...},...} content    inline content
Packit dda32d
-- @treturn     Block                   block quote element
Packit dda32d
M.LineBlock = M.Block:create_constructor(
Packit dda32d
  "LineBlock",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a null element.
Packit dda32d
-- @function Null
Packit dda32d
-- @treturn     Block                   null element
Packit dda32d
M.Null = M.Block:create_constructor(
Packit dda32d
  "Null",
Packit dda32d
  function() return {} end
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates an ordered list.
Packit dda32d
-- @function OrderedList
Packit dda32d
-- @tparam      {{Block,...},...} items list items
Packit dda32d
-- @param[opt]  listAttributes list parameters
Packit dda32d
-- @treturn     Block
Packit dda32d
M.OrderedList = M.Block:create_constructor(
Packit dda32d
  "OrderedList",
Packit dda32d
  function(items, listAttributes)
Packit dda32d
    listAttributes = listAttributes or {1, M.DefaultStyle, M.DefaultDelim}
Packit dda32d
    return {c = {listAttributes, List:new(items)}}
Packit dda32d
  end,
Packit dda32d
  {{"start", "style", "delimiter"}, "content"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a para element.
Packit dda32d
-- @function Para
Packit dda32d
-- @tparam      {Inline,...} content    inline content
Packit dda32d
-- @treturn     Block                   block quote element
Packit dda32d
M.Para = M.Block:create_constructor(
Packit dda32d
  "Para",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a plain element.
Packit dda32d
-- @function Plain
Packit dda32d
-- @tparam      {Inline,...} content    inline content
Packit dda32d
-- @treturn     Block                   block quote element
Packit dda32d
M.Plain = M.Block:create_constructor(
Packit dda32d
  "Plain",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a raw content block of the specified format.
Packit dda32d
-- @function RawBlock
Packit dda32d
-- @tparam      string      format      format of content
Packit dda32d
-- @tparam      string      text        string content
Packit dda32d
-- @treturn     Block                   block quote element
Packit dda32d
M.RawBlock = M.Block:create_constructor(
Packit dda32d
  "RawBlock",
Packit dda32d
  function(format, text) return {c = {format, text}} end,
Packit dda32d
  {"format", "text"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a table element.
Packit dda32d
-- @function Table
Packit dda32d
-- @tparam      {Inline,...} caption    table caption
Packit dda32d
-- @tparam      {AlignDefault|AlignLeft|AlignRight|AlignCenter,...} aligns alignments
Packit dda32d
-- @tparam      {int,...}    widths     column widths
Packit dda32d
-- @tparam      {Block,...}  headers    header row
Packit dda32d
-- @tparam      {{Block,...}} rows      table rows
Packit dda32d
-- @treturn     Block                   block quote element
Packit dda32d
M.Table = M.Block:create_constructor(
Packit dda32d
  "Table",
Packit dda32d
  function(caption, aligns, widths, headers, rows)
Packit dda32d
    return {
Packit dda32d
      c = {
Packit dda32d
        List:new(caption),
Packit dda32d
        List:new(aligns),
Packit dda32d
        List:new(widths),
Packit dda32d
        List:new(headers),
Packit dda32d
        List:new(rows)
Packit dda32d
      }
Packit dda32d
    }
Packit dda32d
  end,
Packit dda32d
  {"caption", "aligns", "widths", "headers", "rows"}
Packit dda32d
)
Packit dda32d
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Inline
Packit dda32d
-- @section Inline
Packit dda32d
Packit dda32d
--- Inline element class
Packit dda32d
M.Inline = Element:make_subtype{}
Packit dda32d
M.Inline.__call = function (t, ...)
Packit dda32d
  return t:new(...)
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Creates a Cite inline element
Packit dda32d
-- @function Cite
Packit dda32d
-- @tparam {Inline,...}   content       List of inlines
Packit dda32d
-- @tparam {Citation,...} citations     List of citations
Packit dda32d
-- @treturn Inline citations element
Packit dda32d
M.Cite = M.Inline:create_constructor(
Packit dda32d
  "Cite",
Packit dda32d
  function(content, citations)
Packit dda32d
    return {c = {List:new(citations), List:new(content)}}
Packit dda32d
  end,
Packit dda32d
  {"citations", "content"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Code inline element
Packit dda32d
-- @function Code
Packit dda32d
-- @tparam      string      text        brief image description
Packit dda32d
-- @tparam[opt] Attr        attr  additional attributes
Packit dda32d
-- @treturn Inline code element
Packit dda32d
M.Code = M.Inline:create_constructor(
Packit dda32d
  "Code",
Packit dda32d
  function(text, attr) return {c = {attr or M.Attr(), text}} end,
Packit dda32d
  {{"identifier", "classes", "attributes"}, "text"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates an inline element representing emphasised text.
Packit dda32d
-- @function Emph
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn Inline emphasis element
Packit dda32d
M.Emph = M.Inline:create_constructor(
Packit dda32d
  "Emph",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Image inline element
Packit dda32d
-- @function Image
Packit dda32d
-- @tparam      {Inline,..} caption     text used to describe the image
Packit dda32d
-- @tparam      string      src         path to the image file
Packit dda32d
-- @tparam[opt] string      title       brief image description
Packit dda32d
-- @tparam[opt] Attr        attr additional attributes
Packit dda32d
-- @treturn Inline image element
Packit dda32d
M.Image = M.Inline:create_constructor(
Packit dda32d
  "Image",
Packit dda32d
  function(caption, src, title, attr)
Packit dda32d
    title = title or ""
Packit dda32d
    attr = attr or M.Attr()
Packit dda32d
    return {c = {attr, List:new(caption), {src, title}}}
Packit dda32d
  end,
Packit dda32d
  {{"identifier", "classes", "attributes"}, "caption", {"src", "title"}}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Create a LineBreak inline element
Packit dda32d
-- @function LineBreak
Packit dda32d
-- @treturn Inline linebreak element
Packit dda32d
M.LineBreak = M.Inline:create_constructor(
Packit dda32d
  "LineBreak",
Packit dda32d
  function() return {} end
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a link inline element, usually a hyperlink.
Packit dda32d
-- @function Link
Packit dda32d
-- @tparam      {Inline,..} content     text for this link
Packit dda32d
-- @tparam      string      target      the link target
Packit dda32d
-- @tparam[opt] string      title       brief link description
Packit dda32d
-- @tparam[opt] Attr        attr additional attributes
Packit dda32d
-- @treturn Inline image element
Packit dda32d
M.Link = M.Inline:create_constructor(
Packit dda32d
  "Link",
Packit dda32d
  function(content, target, title, attr)
Packit dda32d
    title = title or ""
Packit dda32d
    attr = attr or M.Attr()
Packit dda32d
    return {c = {attr, List:new(content), {target, title}}}
Packit dda32d
  end,
Packit dda32d
  {{"identifier", "classes", "attributes"}, "content", {"target", "title"}}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Math element, either inline or displayed.
Packit dda32d
-- @function Math
Packit dda32d
-- @tparam      "InlineMath"|"DisplayMath" mathtype rendering specifier
Packit dda32d
-- @tparam      string      text        Math content
Packit dda32d
-- @treturn     Inline                  Math element
Packit dda32d
M.Math = M.Inline:create_constructor(
Packit dda32d
  "Math",
Packit dda32d
  function(mathtype, text)
Packit dda32d
    return {c = {mathtype, text}}
Packit dda32d
  end,
Packit dda32d
  {"mathtype", "text"}
Packit dda32d
)
Packit dda32d
--- Creates a DisplayMath element (DEPRECATED).
Packit dda32d
-- @function DisplayMath
Packit dda32d
-- @tparam      string      text        Math content
Packit dda32d
-- @treturn     Inline                  Math element
Packit dda32d
M.DisplayMath = M.Inline:create_constructor(
Packit dda32d
  "DisplayMath",
Packit dda32d
  function(text) return M.Math("DisplayMath", text) end,
Packit dda32d
  {"mathtype", "text"}
Packit dda32d
)
Packit dda32d
--- Creates an InlineMath inline element (DEPRECATED).
Packit dda32d
-- @function InlineMath
Packit dda32d
-- @tparam      string      text        Math content
Packit dda32d
-- @treturn     Inline                  Math element
Packit dda32d
M.InlineMath = M.Inline:create_constructor(
Packit dda32d
  "InlineMath",
Packit dda32d
  function(text) return M.Math("InlineMath", text) end,
Packit dda32d
  {"mathtype", "text"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Note inline element
Packit dda32d
-- @function Note
Packit dda32d
-- @tparam      {Block,...} content     footnote block content
Packit dda32d
M.Note = M.Inline:create_constructor(
Packit dda32d
  "Note",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Quoted inline element given the quote type and quoted content.
Packit dda32d
-- @function Quoted
Packit dda32d
-- @tparam      "DoubleQuote"|"SingleQuote" quotetype type of quotes to be used
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  quoted element
Packit dda32d
M.Quoted = M.Inline:create_constructor(
Packit dda32d
  "Quoted",
Packit dda32d
  function(quotetype, content) return {c = {quotetype, List:new(content)}} end,
Packit dda32d
  {"quotetype", "content"}
Packit dda32d
)
Packit dda32d
--- Creates a single-quoted inline element (DEPRECATED).
Packit dda32d
-- @function SingleQuoted
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  quoted element
Packit dda32d
-- @see Quoted
Packit dda32d
M.SingleQuoted = M.Inline:create_constructor(
Packit dda32d
  "SingleQuoted",
Packit dda32d
  function(content) return M.Quoted(M.SingleQuote, content) end,
Packit dda32d
  {"quotetype", "content"}
Packit dda32d
)
Packit dda32d
--- Creates a single-quoted inline element (DEPRECATED).
Packit dda32d
-- @function DoubleQuoted
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  quoted element
Packit dda32d
-- @see Quoted
Packit dda32d
M.DoubleQuoted = M.Inline:create_constructor(
Packit dda32d
  "DoubleQuoted",
Packit dda32d
  function(content) return M.Quoted("DoubleQuote", content) end,
Packit dda32d
  {"quotetype", "content"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a RawInline inline element
Packit dda32d
-- @function RawInline
Packit dda32d
-- @tparam      string      format      format of the contents
Packit dda32d
-- @tparam      string      text        string content
Packit dda32d
-- @treturn     Inline                  raw inline element
Packit dda32d
M.RawInline = M.Inline:create_constructor(
Packit dda32d
  "RawInline",
Packit dda32d
  function(format, text) return {c = {format, text}} end,
Packit dda32d
  {"format", "text"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates text rendered in small caps
Packit dda32d
-- @function SmallCaps
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  smallcaps element
Packit dda32d
M.SmallCaps = M.Inline:create_constructor(
Packit dda32d
  "SmallCaps",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a SoftBreak inline element.
Packit dda32d
-- @function SoftBreak
Packit dda32d
-- @treturn     Inline                  softbreak element
Packit dda32d
M.SoftBreak = M.Inline:create_constructor(
Packit dda32d
  "SoftBreak",
Packit dda32d
  function() return {} end
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Create a Space inline element
Packit dda32d
-- @function Space
Packit dda32d
-- @treturn Inline space element
Packit dda32d
M.Space = M.Inline:create_constructor(
Packit dda32d
  "Space",
Packit dda32d
  function() return {} end
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Span inline element
Packit dda32d
-- @function Span
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @tparam[opt] Attr        attr  additional attributes
Packit dda32d
-- @treturn Inline span element
Packit dda32d
M.Span = M.Inline:create_constructor(
Packit dda32d
  "Span",
Packit dda32d
  function(content, attr)
Packit dda32d
    return {c = {attr or M.Attr(), List:new(content)}}
Packit dda32d
  end,
Packit dda32d
  {{"identifier", "classes", "attributes"}, "content"}
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Str inline element
Packit dda32d
-- @function Str
Packit dda32d
-- @tparam      string      text        content
Packit dda32d
-- @treturn     Inline                  string element
Packit dda32d
M.Str = M.Inline:create_constructor(
Packit dda32d
  "Str",
Packit dda32d
  function(text) return {c = text} end,
Packit dda32d
  "text"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates text which is striked out.
Packit dda32d
-- @function Strikeout
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  strikeout element
Packit dda32d
M.Strikeout = M.Inline:create_constructor(
Packit dda32d
  "Strikeout",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Strong element, whose text is usually displayed in a bold font.
Packit dda32d
-- @function Strong
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  strong element
Packit dda32d
M.Strong = M.Inline:create_constructor(
Packit dda32d
  "Strong",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Subscript inline element
Packit dda32d
-- @function Subscript
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  subscript element
Packit dda32d
M.Subscript = M.Inline:create_constructor(
Packit dda32d
  "Subscript",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
--- Creates a Superscript inline element
Packit dda32d
-- @function Superscript
Packit dda32d
-- @tparam      {Inline,..} content     inline content
Packit dda32d
-- @treturn     Inline                  strong element
Packit dda32d
M.Superscript = M.Inline:create_constructor(
Packit dda32d
  "Superscript",
Packit dda32d
  function(content) return {c = List:new(content)} end,
Packit dda32d
  "content"
Packit dda32d
)
Packit dda32d
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Helpers
Packit dda32d
-- @section helpers
Packit dda32d
Packit dda32d
local function assoc_key_equals (x)
Packit dda32d
  return function (y) return y[1] == x end
Packit dda32d
end
Packit dda32d
Packit dda32d
-- Lookup a value in an associative list
Packit dda32d
-- @function lookup
Packit dda32d
-- @tparam {{key, value},...} alist associative list
Packit dda32d
-- @param key key for which the associated value is to be looked up
Packit dda32d
local function lookup(alist, key)
Packit dda32d
  return (List.find_if(alist, assoc_key_equals(key)) or {})[2]
Packit dda32d
end
Packit dda32d
Packit dda32d
--- Return an iterator which returns key-value pairs of an associative list.
Packit dda32d
-- @function apairs
Packit dda32d
-- @tparam {{key, value},...} alist associative list
Packit dda32d
local apairs = function (alist)
Packit dda32d
  local i = 1
Packit dda32d
  local cur
Packit dda32d
  function nxt ()
Packit dda32d
    cur = rawget(alist, i)
Packit dda32d
    if cur then
Packit dda32d
      i = i + 1
Packit dda32d
      return cur[1], cur[2]
Packit dda32d
    end
Packit dda32d
    return nil
Packit dda32d
  end
Packit dda32d
  return nxt, nil, nil
Packit dda32d
end
Packit dda32d
Packit dda32d
-- AttributeList, a metatable to allow table-like access to attribute lists
Packit dda32d
-- represented by associative lists.
Packit dda32d
local AttributeList = {
Packit dda32d
  __index = function (t, k)
Packit dda32d
    if type(k) == "number" then
Packit dda32d
      return rawget(t, k)
Packit dda32d
    else
Packit dda32d
      return lookup(t, k)
Packit dda32d
    end
Packit dda32d
  end,
Packit dda32d
Packit dda32d
  __newindex = function (t, k, v)
Packit dda32d
    local cur, idx = List.find_if(t, assoc_key_equals(k))
Packit dda32d
    if v == nil then
Packit dda32d
      table.remove(t, idx)
Packit dda32d
    elseif cur then
Packit dda32d
      cur[2] = v
Packit dda32d
    elseif type(k) == "number" then
Packit dda32d
      rawset(t, k, v)
Packit dda32d
    else
Packit dda32d
      rawset(t, #t + 1, {k, v})
Packit dda32d
    end
Packit dda32d
  end,
Packit dda32d
Packit dda32d
  __pairs = apairs
Packit dda32d
}
Packit dda32d
Packit dda32d
-- convert a table to an associative list. The order of key-value pairs in the
Packit dda32d
-- alist is undefined. The table should either contain no numeric keys or
Packit dda32d
-- already be an associative list.
Packit dda32d
-- @tparam table associative list or table without numeric keys.
Packit dda32d
-- @treturn table associative list
Packit dda32d
local to_alist = function (tbl)
Packit dda32d
  if #tbl ~= 0 or next(tbl) == nil then
Packit dda32d
    -- probably already an alist
Packit dda32d
    return tbl
Packit dda32d
  end
Packit dda32d
  local alist = {}
Packit dda32d
  local i = 1
Packit dda32d
  for k, v in pairs(tbl) do
Packit dda32d
    alist[i] = {k, v}
Packit dda32d
    i = i + 1
Packit dda32d
  end
Packit dda32d
  return alist
Packit dda32d
end
Packit dda32d
Packit dda32d
-- Attr
Packit dda32d
M.Attr = {}
Packit dda32d
M.Attr._field_names = {identifier = 1, classes = 2, attributes = 3}
Packit dda32d
--- Create a new set of attributes (Attr).
Packit dda32d
-- @function Attr
Packit dda32d
-- @tparam[opt] string       identifier element identifier
Packit dda32d
-- @tparam[opt] {string,...} classes    element classes
Packit dda32d
-- @tparam[opt] table        attributes table containing string keys and values
Packit dda32d
-- @return element attributes
Packit dda32d
M.Attr.__call = function(t, identifier, classes, attributes)
Packit dda32d
  identifier = identifier or ''
Packit dda32d
  classes = List:new(classes or {})
Packit dda32d
  attributes = setmetatable(to_alist(attributes or {}), AttributeList)
Packit dda32d
  local attr = {identifier, classes, attributes}
Packit dda32d
  setmetatable(attr, t)
Packit dda32d
  return attr
Packit dda32d
end
Packit dda32d
M.Attr.__index = function(t, k)
Packit dda32d
  return rawget(t, k) or
Packit dda32d
    rawget(t, M.Attr._field_names[k]) or
Packit dda32d
    rawget(getmetatable(t), k)
Packit dda32d
end
Packit dda32d
M.Attr.__newindex = function(t, k, v)
Packit dda32d
  if M.Attr._field_names[k] then
Packit dda32d
    rawset(t, M.Attr._field_names[k], v)
Packit dda32d
  else
Packit dda32d
    rawset(t, k, v)
Packit dda32d
  end
Packit dda32d
end
Packit dda32d
setmetatable(M.Attr, M.Attr)
Packit dda32d
Packit dda32d
Packit dda32d
--- Creates a single citation.
Packit dda32d
-- @function Citation
Packit dda32d
-- @tparam      string       id       citation identifier (like a bibtex key)
Packit dda32d
-- @tparam      AuthorInText|SuppressAuthor|NormalCitation mode citation mode
Packit dda32d
-- @tparam[opt] {Inline,...} prefix   citation prefix
Packit dda32d
-- @tparam[opt] {Inline,...} suffix   citation suffix
Packit dda32d
-- @tparam[opt] int          note_num note number
Packit dda32d
-- @tparam[opt] int          hash  hash number
Packit dda32d
M.Citation = function(id, mode, prefix, suffix, note_num, hash)
Packit dda32d
  prefix = prefix or {}
Packit dda32d
  suffix = suffix or {}
Packit dda32d
  note_num = note_num or 0
Packit dda32d
  hash = hash or 0
Packit dda32d
  return {
Packit dda32d
    citationId = id,
Packit dda32d
    citationPrefix = prefix,
Packit dda32d
    citationSuffix = suffix,
Packit dda32d
    citationMode = mode,
Packit dda32d
    citationNoteNum = note_num,
Packit dda32d
    citationHash = hash,
Packit dda32d
  }
Packit dda32d
end
Packit dda32d
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Constants
Packit dda32d
-- @section constants
Packit dda32d
Packit dda32d
--- Author name is mentioned in the text.
Packit dda32d
-- @see Citation
Packit dda32d
-- @see Cite
Packit dda32d
M.AuthorInText = "AuthorInText"
Packit dda32d
Packit dda32d
--- Author name is suppressed.
Packit dda32d
-- @see Citation
Packit dda32d
-- @see Cite
Packit dda32d
M.SuppressAuthor = "SuppressAuthor"
Packit dda32d
Packit dda32d
--- Default citation style is used.
Packit dda32d
-- @see Citation
Packit dda32d
-- @see Cite
Packit dda32d
M.NormalCitation = "NormalCitation"
Packit dda32d
Packit dda32d
--- Table cells aligned left.
Packit dda32d
-- @see Table
Packit dda32d
M.AlignLeft = "AlignLeft"
Packit dda32d
Packit dda32d
--- Table cells right-aligned.
Packit dda32d
-- @see Table
Packit dda32d
M.AlignRight = "AlignRight"
Packit dda32d
Packit dda32d
--- Table cell content is centered.
Packit dda32d
-- @see Table
Packit dda32d
M.AlignCenter = "AlignCenter"
Packit dda32d
Packit dda32d
--- Table cells are alignment is unaltered.
Packit dda32d
-- @see Table
Packit dda32d
M.AlignDefault = "AlignDefault"
Packit dda32d
Packit dda32d
--- Default list number delimiters are used.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.DefaultDelim = "DefaultDelim"
Packit dda32d
Packit dda32d
--- List numbers are delimited by a period.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.Period = "Period"
Packit dda32d
Packit dda32d
--- List numbers are delimited by a single parenthesis.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.OneParen = "OneParen"
Packit dda32d
Packit dda32d
--- List numbers are delimited by a double parentheses.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.TwoParens = "TwoParens"
Packit dda32d
Packit dda32d
--- List are numbered in the default style
Packit dda32d
-- @see OrderedList
Packit dda32d
M.DefaultStyle = "DefaultStyle"
Packit dda32d
Packit dda32d
--- List items are numbered as examples.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.Example = "Example"
Packit dda32d
Packit dda32d
--- List are numbered using decimal integers.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.Decimal = "Decimal"
Packit dda32d
Packit dda32d
--- List are numbered using lower-case roman numerals.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.LowerRoman = "LowerRoman"
Packit dda32d
Packit dda32d
--- List are numbered using upper-case roman numerals
Packit dda32d
-- @see OrderedList
Packit dda32d
M.UpperRoman = "UpperRoman"
Packit dda32d
Packit dda32d
--- List are numbered using lower-case alphabetic characters.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.LowerAlpha = "LowerAlpha"
Packit dda32d
Packit dda32d
--- List are numbered using upper-case alphabetic characters.
Packit dda32d
-- @see OrderedList
Packit dda32d
M.UpperAlpha = "UpperAlpha"
Packit dda32d
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Helper Functions
Packit dda32d
-- @section helpers
Packit dda32d
Packit dda32d
--- Use functions defined in the global namespace to create a pandoc filter.
Packit dda32d
-- All globally defined functions which have names of pandoc elements are
Packit dda32d
-- collected into a new table.
Packit dda32d
-- @return A list of filter functions
Packit dda32d
-- @usage
Packit dda32d
-- -- within a file defining a pandoc filter:
Packit dda32d
-- function Str(text)
Packit dda32d
--   return pandoc.Str(utf8.upper(text))
Packit dda32d
-- end
Packit dda32d
--
Packit dda32d
-- return {pandoc.global_filter()}
Packit dda32d
-- -- the above is equivallent to
Packit dda32d
-- -- return {{Str = Str}}
Packit dda32d
function M.global_filter()
Packit dda32d
  local res = {}
Packit dda32d
  function is_filter_function(k)
Packit dda32d
    return M.Inline.constructor[k] or
Packit dda32d
      M.Block.constructor[k] or
Packit dda32d
      k == "Meta" or k == "Doc" or k == "Pandoc" or
Packit dda32d
      k == "Block" or k == "Inline"
Packit dda32d
  end
Packit dda32d
  for k, v in pairs(_G) do
Packit dda32d
    if is_filter_function(k) then
Packit dda32d
      res[k] = v
Packit dda32d
    end
Packit dda32d
  end
Packit dda32d
  return res
Packit dda32d
end
Packit dda32d
Packit dda32d
------------------------------------------------------------------------
Packit dda32d
-- Functions which have moved to different modules
Packit dda32d
local utils = require 'pandoc.utils'
Packit dda32d
M.sha1 = utils.sha1
Packit dda32d
Packit dda32d
return M