101 lines
2.6 KiB
Lua
101 lines
2.6 KiB
Lua
|
-- conclusions.lua
|
||
|
-- A Pandoc Lua filter to distinguish conclusions from the surrounding text.
|
||
|
-- Copyright 2024 Bastien Dumont (bastien.dumont [at] posteo.net)
|
||
|
-- This file is under the MIT License: see LICENSE for more details
|
||
|
|
||
|
local MAX_HEADER_LEVEL = 6
|
||
|
|
||
|
local config = {
|
||
|
innermost_level_header = 2,
|
||
|
innermost_level_space = 3,
|
||
|
ccl_explicit_titles = {
|
||
|
'Conclusion de la partie',
|
||
|
'Conclusion du chapitre'
|
||
|
}
|
||
|
}
|
||
|
|
||
|
local function check_validity(key, value)
|
||
|
if key ~= 'ccl-explicit-titles'
|
||
|
and (value == nil or value < 1 or value > MAX_HEADER_LEVEL)
|
||
|
then
|
||
|
error(key .. ' must be a numeric value ' ..
|
||
|
'comprised between 1 and ' .. MAX_HEADER_LEVEL .. '.\n')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function get_config(meta)
|
||
|
if meta.conclusions then
|
||
|
for key, value in pairs(meta.conclusions) do
|
||
|
if key ~= 'ccl-explicit-titles' then
|
||
|
value = math.tointeger(value[1].text)
|
||
|
end
|
||
|
check_validity(key, value)
|
||
|
config[string.gsub(key, '-', '_')] = value
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local function set_raw_space()
|
||
|
local raw_space
|
||
|
if FORMAT == 'native' then
|
||
|
FORMAT = pandoc.system.environment().TESTED_FORMAT
|
||
|
set_raw_space()
|
||
|
elseif FORMAT == 'context' then
|
||
|
raw_space = pandoc.RawBlock('tex', '\\blank[big]')
|
||
|
elseif FORMAT == 'docx' then
|
||
|
raw_space = pandoc.RawBlock('openxml', '<w:p/>')
|
||
|
elseif FORMAT == 'latex' then
|
||
|
raw_space = pandoc.RawBlock('tex', '\\bigskip')
|
||
|
else
|
||
|
error(FORMAT ..
|
||
|
' output not supported by complex-paragraphs.lua\n')
|
||
|
end
|
||
|
return raw_space
|
||
|
end
|
||
|
|
||
|
local raw_space = set_raw_space()
|
||
|
|
||
|
local function get_level(div)
|
||
|
local level = MAX_HEADER_LEVEL + 1
|
||
|
local set_value = div.attributes.level
|
||
|
if set_value then
|
||
|
set_value = math.tointeger(set_value)
|
||
|
check_validity('level', set_value)
|
||
|
level = set_value
|
||
|
else
|
||
|
io.stderr:write('level attribute missing to a div ' ..
|
||
|
'with class conclusion or ccl, nothing done.\n')
|
||
|
end
|
||
|
return level
|
||
|
end
|
||
|
|
||
|
local function get_separator_as_list(level)
|
||
|
local separator = {}
|
||
|
if level <= config.innermost_level_header then
|
||
|
local header =
|
||
|
pandoc.Header(level + 1, config.ccl_explicit_titles[level])
|
||
|
table.insert(header.classes, 'unnumbered')
|
||
|
separator = { header }
|
||
|
elseif level <= config.innermost_level_space then
|
||
|
separator = { raw_space }
|
||
|
end
|
||
|
return separator
|
||
|
end
|
||
|
|
||
|
function Div(div)
|
||
|
local classes = div.classes
|
||
|
if classes:includes('conclusion')
|
||
|
or classes:includes('ccl')
|
||
|
then
|
||
|
local level = get_level(div)
|
||
|
local formatted_conclusion = get_separator_as_list(level)
|
||
|
table.insert(formatted_conclusion, div)
|
||
|
return formatted_conclusion
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return {
|
||
|
{ Meta = get_config },
|
||
|
{ Div = Div }
|
||
|
}
|