From 5026dfaedf4a8043fd1d76c1b7da8880770f9255 Mon Sep 17 00:00:00 2001
From: Albert Krewinkel <albert@zeitkraut.de>
Date: Fri, 1 Dec 2017 17:14:28 +0100
Subject: [PATCH] lua-filters.md: add documentation for pandoc.List

---
 doc/lua-filters.md        | 103 ++++++++++++++++++++++++++++++++++++++
 tools/update-lua-docs.lua |  35 +++++++++----
 2 files changed, 128 insertions(+), 10 deletions(-)

diff --git a/doc/lua-filters.md b/doc/lua-filters.md
index 112a9bab2..8cdb96194 100644
--- a/doc/lua-filters.md
+++ b/doc/lua-filters.md
@@ -1479,3 +1479,106 @@ storage. The "media bag" is used when pandoc is called with the
 
         local diagram_url = "https://pandoc.org/diagram.jpg"
         local contents = pandoc.mediabag.fetch(diagram_url, ".")
+
+# Module pandoc.List
+
+Pandoc\'s List type and helper methods
+
+## Metamethods
+
+[`pandoc.List:__concat (list)`]{#pandoc.List:__concat}
+
+:   Concatenates two lists.
+
+    Parameters:
+
+    `list`:
+    :   second list concatenated to the first
+
+    Returns: a new list containing all elements from list1 and
+    list2
+
+## Methods
+
+[`pandoc.List:clone ()`]{#pandoc.List:clone}
+
+:   Returns a (shallow) copy of the list.
+
+[`pandoc.List:includes (needle, init)`]{#pandoc.List:includes}
+
+:   Checks if the list has an item equal to the given needle.
+
+    Parameters:
+
+    `needle`:
+    :   item to search for
+
+    `init`:
+    :   index at which the search is started
+
+    Returns: true if a list item is equal to the needle, false
+    otherwise
+
+[`pandoc.List:find (needle, init)`]{#pandoc.List:find}
+
+:   Returns the value and index of the first occurrence of the
+    given item.
+
+    Parameters:
+
+    `needle`:
+    :   item to search for
+
+    `init`:
+    :   index at which the search is started
+
+    Returns: first item equal to the needle, or nil if no such
+    item exists.
+
+[`pandoc.List:find_if (pred, init)`]{#pandoc.List:find_if}
+
+:   Returns the value and index of the first element for which
+    the predicate holds true.
+
+    Parameters:
+
+    `pred`:
+    :   the predicate function
+
+    `init`:
+    :   index at which the search is started
+
+    Returns: first item for which \`test\` succeeds, or nil if
+    no such item exists.
+
+[`pandoc.List:extend (list)`]{#pandoc.List:extend}
+
+:   Adds the given list to the end of this list.
+
+    Parameters:
+
+    `list`:
+    :   list to appended
+
+[`pandoc.List:map (fn)`]{#pandoc.List:map}
+
+:   Returns a copy of the current list by applying the given
+    function to all elements.
+
+    Parameters:
+
+    `fn`:
+    :   function which is applied to all list items.
+
+[`pandoc.List:filter (pred)`]{#pandoc.List:filter}
+
+:   Returns a new list containing all items satisfying a given
+    condition.
+
+    Parameters:
+
+    `pred`:
+    :   condition items must satisfy.
+
+    Returns: a new list containing all items for which \`test\`
+    was true.
diff --git a/tools/update-lua-docs.lua b/tools/update-lua-docs.lua
index 223ba3722..daa685269 100644
--- a/tools/update-lua-docs.lua
+++ b/tools/update-lua-docs.lua
@@ -1,14 +1,26 @@
 local in_module_section = false
 
-function pandoc_module_blocks()
-  local tmp_folder = os.tmpname()
-  os.remove(tmp_folder)
-  os.execute("mkdir -p " .. tmp_folder)
-  os.execute("ldoc -q -l tools -d " .. tmp_folder .. " data/pandoc.lua")
-  local module_file = io.open(tmp_folder .. "/index.html")
-  local module_html = module_file:read("*a")
-  local module_doc = pandoc.read(module_html, "html")
-  return module_doc.blocks
+-- Generate tmp folder
+local tmp_folder = os.tmpname()
+os.remove(tmp_folder)
+os.execute("mkdir -p " .. tmp_folder)
+
+function extend(list1, list2)
+  for i = 1, #list2 do
+    list1[#list1 + 1] = list2[i]
+  end
+end
+
+function module_blocks(module_filenames)
+  local blocks = {}
+  for _, filename in pairs(module_filenames) do
+    os.execute("ldoc -q -l tools -d " .. tmp_folder .. " " .. filename)
+    local module_file = io.open(tmp_folder .. "/index.html")
+    local module_html = module_file:read("*a")
+    local module_doc = pandoc.read(module_html, "html")
+    extend(blocks, module_doc.blocks)
+  end
+  return blocks
 end
 
 function Header (el)
@@ -21,7 +33,10 @@ function Header (el)
     end
   elseif el.identifier == "module-pandoc" then
     in_module_section = true
-    return pandoc_module_blocks()
+    return module_blocks{'data/pandoc.lua'}
+  elseif el.identifier == "module-pandoc.list" then
+    in_module_section = true
+    return module_blocks{'data/List.lua'}
   end
 end