96 lines
2.2 KiB
Lua
96 lines
2.2 KiB
Lua
|
|
function has_class(el, class)
|
|
if el.attr == nil then
|
|
return nil
|
|
end
|
|
for i,v in ipairs(el.attr.classes) do
|
|
if v == class then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function get_block_with_class(el, class)
|
|
return find_node(el, function(el)
|
|
return has_class(el, class)
|
|
end)
|
|
end
|
|
|
|
function get_image(el)
|
|
return find_node(el, function (v)
|
|
return v.t == "Image"
|
|
end)
|
|
end
|
|
|
|
function attribute(el, name, default)
|
|
for k,v in pairs(el.attr.attributes) do
|
|
if k == name then
|
|
return v
|
|
end
|
|
end
|
|
return default
|
|
end
|
|
|
|
function replace_node(blocks, predicate, replacement)
|
|
for i, el in pairs(blocks) do
|
|
if predicate(el) then
|
|
table.remove(blocks, i)
|
|
if type(replacement) == "function" then
|
|
replacement = replacement(el)
|
|
end
|
|
table.insert(blocks, i, replacement)
|
|
return el
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
local bibname = ''
|
|
|
|
return {
|
|
{
|
|
Meta = function(meta)
|
|
for _i, v in ipairs(meta.bibliography) do
|
|
if bibname ~= '' then
|
|
bibname = bibname .. ','
|
|
end
|
|
bibname = bibname .. pandoc.utils.stringify(v)
|
|
end
|
|
|
|
end,
|
|
Pandoc = function(doc)
|
|
if not quarto.doc.is_format("latex") then
|
|
return doc
|
|
end
|
|
|
|
-- add bibliography to the right place
|
|
-- local bibname = "sample-base"
|
|
local bibliography = pandoc.RawBlock(
|
|
"latex",
|
|
"\\bibliographystyle{ACM-Reference-Format}\n\\bibliography{" .. bibname .. "}")
|
|
replace_node(doc.blocks, function(el)
|
|
return el.t == "Header" and pandoc.utils.stringify(el.content) == "References"
|
|
end, bibliography)
|
|
|
|
-- fix appendix compilation
|
|
local appendix = pandoc.RawBlock("latex", "\\appendix")
|
|
replace_node(doc.blocks, function(el)
|
|
return el.t == "Header" and pandoc.utils.stringify(el.content) == "Appendix"
|
|
end, appendix)
|
|
|
|
-- fix acknowledgments
|
|
replace_node(doc.blocks, function(el)
|
|
return el.t == "Div" and has_class(el, "acks")
|
|
end, function(el)
|
|
local text = pandoc.write(pandoc.Pandoc(el.content), "latex")
|
|
local node = pandoc.RawBlock(
|
|
"latex", "\\begin{acks}\n" .. text .. "\n\\end{acks}")
|
|
return node
|
|
end)
|
|
|
|
return doc
|
|
end
|
|
}
|
|
}
|