junior-sheer/_extensions/quarto-journals/acm/add-bibliography.lua
Carl Colglazier fc929dbfed Init
2024-01-31 17:08:47 -06:00

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
}
}