local function parse_inlines(text) return pandoc.read(text, "markdown").blocks[1].content end function Pandoc(doc) local articles = pandoc.List() local blocks = pandoc.Blocks({}) for _, block in ipairs(doc.blocks) do if block.t == "Header" and block.level == 1 then local date = block.attributes["data-date"] if not date or date == "" then error("article is missing data-date: " .. pandoc.utils.stringify(block.content)) end block.attributes["data-date"] = nil local label = pandoc.Inlines(block.content) label:insert(pandoc.Span(parse_inlines(date), {class = "article-date"})) articles:insert({pandoc.Plain({pandoc.Link(label, block.identifier .. ".html")})}) blocks:insert(block) blocks:insert(pandoc.Para(parse_inlines(date))) else blocks:insert(block) end end doc.blocks = blocks doc.meta["article-list"] = pandoc.MetaBlocks({pandoc.BulletList(articles)}) return doc end