-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathabstract-section.lua
81 lines (74 loc) · 2.84 KB
/
abstract-section.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
--[[
abstract-section – move an "abstract" section into document metadata
Copyright: © 2017–2023 Albert Krewinkel
License: MIT – see LICENSE file for details
]] local stringify = (require 'pandoc.utils').stringify
local section_identifiers = {abstract = true}
local collected = {}
--- The level of the highest heading that was seen so far. Abstracts
--- must be at or above this level to prevent nested sections from being
--- treated as metadata. Only top-level sections should become metadata.
local toplevel = 6
--- Extract abstract from a list of blocks.
local function abstract_from_blocklist(blocks)
local body_blocks = {}
local looking_at_section = false
for _, block in ipairs(blocks) do
if block.t == 'Header' and block.level <= toplevel then
toplevel = block.level
if section_identifiers[block.identifier] then
looking_at_section = block.identifier
collected[looking_at_section] = {}
else
looking_at_section = false
body_blocks[#body_blocks + 1] = block
end
elseif looking_at_section then
if block.t == 'HorizontalRule' then
looking_at_section = false
else
local collect = collected[looking_at_section]
collect[#collect + 1] = block
end
else
body_blocks[#body_blocks + 1] = block
end
end
return body_blocks
end
Pandoc = function(doc)
local meta = doc.meta
-- configure
section_identifiers_list =
(doc.meta['abstract-section'] or {})['section-identifiers']
if section_identifiers_list and #section_identifiers_list > 0 then
section_identifiers = {}
for i, ident in ipairs(section_identifiers_list) do
section_identifiers[stringify(ident)] = true
end
end
-- unset config in meta
doc.meta['abstract-section'] = nil
local blocks = {}
if PANDOC_VERSION >= {2, 17} then
-- Walk all block lists by default
blocks = doc.blocks:walk{Blocks = abstract_from_blocklist}
elseif PANDOC_VERSION >= {2, 9, 2} then
-- Do the same with pandoc versions that don't have walk methods but the
-- `walk_block` function.
blocks = pandoc.utils.walk_block(pandoc.Div(doc.blocks),
{Blocks = abstract_from_blocklist})
.content
else
-- otherwise, just check the top-level block-list
blocks = abstract_from_blocklist(doc.blocks)
end
for metakey in pairs(section_identifiers) do
metakey = stringify(metakey)
local abstract = collected[metakey]
if not meta[metakey] and abstract and #abstract > 0 then
meta[metakey] = pandoc.MetaBlocks(abstract)
end
end
return pandoc.Pandoc(blocks, meta)
end