61 lines
2 KiB
Lua
61 lines
2 KiB
Lua
--- include-files.lua – filter to include Markdown files
|
||
---
|
||
--- Copyright: © 2019–2020 Albert Krewinkel
|
||
--- Copyright: © 2020 Michael Reed
|
||
--- License: MIT – see LICENSE file for details
|
||
---
|
||
--- Created by Albert Krewinkel. Slightly modified by Michael Reed for use in
|
||
--- generating the EPUB for "Programming Language Foundations in Agda".
|
||
---
|
||
--- For documentation, see: https://github.com/pandoc/lua-filters/tree/master/include-files
|
||
|
||
-- pandoc's List type
|
||
local List = require 'pandoc.List'
|
||
|
||
--- Shift headings in block list by given number
|
||
function shift_headings(blocks, shift_by)
|
||
if not shift_by then
|
||
return blocks
|
||
end
|
||
|
||
local shift_headings_filter = {
|
||
Header = function (header)
|
||
header.level = header.level + shift_by
|
||
return header
|
||
end
|
||
}
|
||
|
||
return pandoc.walk_block(pandoc.Div(blocks), shift_headings_filter).content
|
||
end
|
||
|
||
--- Filter function for code blocks
|
||
function CodeBlock(cb)
|
||
-- ignore code blocks which are not of class "include".
|
||
if not cb.classes:includes 'include' then
|
||
return
|
||
end
|
||
|
||
-- Markdown is used if this is nil.
|
||
local format = cb.attributes['format']
|
||
local shift_heading_level_by =
|
||
tonumber(cb.attributes['shift-heading-level-by'])
|
||
|
||
|
||
local blocks = List:new()
|
||
for line in cb.text:gmatch('[^\n]+') do
|
||
if line:sub(1,2) ~= '//' then
|
||
-- Read in the document at the file path specified by `line`.
|
||
local fh = io.open(line)
|
||
local document = pandoc.read(fh:read '*a', format)
|
||
-- Before shifting headings, add a title heading at the beginning of the chapter.
|
||
local heading = pandoc.Header(1, pandoc.Str(pandoc.utils.stringify(document.meta.title)))
|
||
document.blocks:insert(1, heading)
|
||
-- Shift all headings by the user-specified amount, which is 0 by default.
|
||
local chapter = shift_headings(document.blocks, shift_heading_level_by)
|
||
-- Concatenate the chapter blocks (discarding the metadata) to the current document.
|
||
blocks:extend(chapter)
|
||
fh:close()
|
||
end
|
||
end
|
||
return blocks
|
||
end
|