76 lines
2.3 KiB
Lua
76 lines
2.3 KiB
Lua
--[[
|
||
composite-paragraphs – unindent all blocks but the first in composite paragraphs
|
||
|
||
Copyright © 2021-2022 Bastien Dumont
|
||
|
||
Permission to use, copy, modify, and/or distribute this software for any
|
||
purpose with or without fee is hereby granted, provided that the above
|
||
copyright notice and this permission notice appear in all copies.
|
||
|
||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||
]]
|
||
|
||
local is_after_first_block
|
||
local RAW_ATTRIBUTE
|
||
|
||
if FORMAT == 'native' then
|
||
RAW_ATTRIBUTE = pandoc.system.environment().TESTED_FORMAT
|
||
elseif FORMAT == 'docx' then
|
||
RAW_ATTRIBUTE = 'openxml'
|
||
elseif FORMAT == 'context' or FORMAT == 'latex' then
|
||
RAW_ATTRIBUTE = FORMAT
|
||
else
|
||
error(FORMAT ..
|
||
' output not supported by composite-paragraphs.lua\n')
|
||
end
|
||
|
||
local function make_noindent_code()
|
||
if RAW_ATTRIBUTE == 'context' then
|
||
return '\\noindentation{}'
|
||
elseif RAW_ATTRIBUTE == 'openxml' then
|
||
return '<w:pPr>' ..
|
||
'<w:pStyle w:val="BodyText"/>' ..
|
||
'<w:ind w:hanging="0"/>' ..
|
||
'<w:rPr></w:rPr></w:pPr>'
|
||
elseif RAW_ATTRIBUTE == 'latex' then
|
||
return '\\noindent{}'
|
||
end
|
||
end
|
||
|
||
local noindent_rawinline =
|
||
pandoc.RawInline(RAW_ATTRIBUTE, make_noindent_code())
|
||
|
||
local function turn_to_nonindented_textblock(para)
|
||
para.c:insert(1, noindent_rawinline)
|
||
end
|
||
|
||
local function unindent_paragraphs_after_first_block(blocks)
|
||
for i = 1, #blocks do
|
||
block = blocks[i]
|
||
if block.t == 'Para' and is_after_first_block then
|
||
turn_to_nonindented_textblock(block)
|
||
elseif block.t == 'Div' then
|
||
unindent_paragraphs_after_first_block(block.content)
|
||
end
|
||
is_after_first_block = true
|
||
end
|
||
end
|
||
|
||
local function turn_to_composite_paragraph(div)
|
||
unindent_paragraphs_after_first_block(div.content)
|
||
end
|
||
|
||
function Div(div)
|
||
if div.classes:includes('composite-paragraph') then
|
||
is_after_first_block = false
|
||
turn_to_composite_paragraph(div)
|
||
return div
|
||
end
|
||
end
|