update template

This commit is contained in:
2025-01-08 10:18:39 +08:00
parent 425607160d
commit 7305aca59a
7 changed files with 251 additions and 161 deletions
@@ -19,178 +19,174 @@ THIS SOFTWARE.
-- from @kapsner
-- [import]
local from_utils = require "utils"
local from_utils = require("utils")
local has_key = from_utils.has_key
-- [/import]
local M = {}
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
local List = require 'pandoc.List'
local utils = require 'pandoc.utils'
local List = require("pandoc.List")
local utils = require("pandoc.utils")
local stringify = utils.stringify
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
local default_marks
local default_marks = {
corresponding_author = FORMAT == 'latex'
and {pandoc.RawInline('latex', '*')}
or {pandoc.Str ''},
equal_contributor = FORMAT == 'latex'
and {pandoc.RawInline('latex', '$\\dagger{}$')}
or {pandoc.Str '*'},
corresponding_author = FORMAT == "latex" and { pandoc.RawInline("latex", "*") } or { pandoc.Str("") },
equal_contributor = FORMAT == "latex" and { pandoc.RawInline("latex", "") } or { pandoc.Str("") },
}
M.default_marks = default_marks
-- modified by @kapsner
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
local function is_equal_contributor(author)
if has_key(author, "attributes") then
return author.attributes["equal-contributor"]
end
return nil
if has_key(author, "attributes") then
return author.attributes["equal-contributor"]
end
return nil
end
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
--- Create equal contributors note.
local function create_equal_contributors_block(authors, mark)
local has_equal_contribs = List:new(authors):find_if(is_equal_contributor)
if not has_equal_contribs then
return nil
end
local contributors = {
pandoc.Superscript(mark'equal_contributor'),
pandoc.Space(),
pandoc.Str 'These authors contributed equally to this work.'
}
return List:new{pandoc.Para(contributors)}
local has_equal_contribs = List:new(authors):find_if(is_equal_contributor)
if not has_equal_contribs then
return nil
end
local contributors = {
pandoc.Superscript(mark("equal_contributor")),
pandoc.Space(),
pandoc.Str("These authors contributed equally to this work."),
}
return List:new({ pandoc.Para(contributors) })
end
M.create_equal_contributors_block = create_equal_contributors_block
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
local function intercalate(lists, elem)
local result = List:new{}
for i = 1, (#lists - 1) do
result:extend(lists[i])
result:extend(elem)
end
if #lists > 0 then
result:extend(lists[#lists])
end
return result
local result = List:new({})
for i = 1, (#lists - 1) do
result:extend(lists[i])
result:extend(elem)
end
if #lists > 0 then
result:extend(lists[#lists])
end
return result
end
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
--- Check whether the given author is a corresponding author
local function is_corresponding_author(author)
if has_key(author, "attributes") then
if author.attributes["corresponding"] then
return author.email
end
end
return nil
if has_key(author, "attributes") then
if author.attributes["corresponding"] then
return author.email
end
end
return nil
end
M.is_corresponding_author = is_corresponding_author
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
--- Generate a block element containing the correspondence information
local function create_correspondence_blocks(authors, mark)
local corresponding_authors = List:new{}
for _, author in ipairs(authors) do
if is_corresponding_author(author) then
local mailto = 'mailto:' .. utils.stringify(author.email)
local author_with_mail = List:new(
-- modified by @kapsner
author.name.literal .. List:new{pandoc.Space(), pandoc.Str '<'} ..
author.email .. List:new{pandoc.Str '>'}
)
local link = pandoc.Link(author_with_mail, mailto)
table.insert(corresponding_authors, {link})
end
end
if #corresponding_authors == 0 then
return nil
end
local correspondence = List:new{
pandoc.Superscript(mark'corresponding_author'),
pandoc.Space(),
pandoc.Str'Correspondence:',
pandoc.Space()
}
local sep = List:new{pandoc.Str',', pandoc.Space()}
return {
pandoc.Para(correspondence .. intercalate(corresponding_authors, sep))
}
local corresponding_authors = List:new({})
for _, author in ipairs(authors) do
if is_corresponding_author(author) then
local mailto = "mailto:" .. utils.stringify(author.email)
local author_with_mail = List:new(
-- modified by @kapsner
author.name.literal
.. List:new({ pandoc.Space(), pandoc.Str("<") })
.. author.email
.. List:new({ pandoc.Str(">") })
)
local link = pandoc.Link(author_with_mail, mailto)
table.insert(corresponding_authors, { link })
end
end
if #corresponding_authors == 0 then
return nil
end
local correspondence = List:new({
pandoc.Superscript(mark("corresponding_author")),
pandoc.Space(),
pandoc.Str("Correspondence:"),
pandoc.Space(),
})
local sep = List:new({ pandoc.Str(","), pandoc.Space() })
return {
pandoc.Para(correspondence .. intercalate(corresponding_authors, sep)),
}
end
M.create_correspondence_blocks = create_correspondence_blocks
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
--- Create inlines for a single author (includes all author notes)
local function author_inline_generator (get_mark)
return function (author)
local author_marks = List:new{}
-- modified by @kapsner
if has_key(author, "attributes") then
if author.attributes["equal-contributor"] then
author_marks[#author_marks + 1] = get_mark 'equal_contributor'
end
end
local idx_str
for _, idx in ipairs(author.affiliations) do
if type(idx) ~= 'table' then
idx_str = tostring(idx)
else
idx_str = stringify(idx)
end
author_marks[#author_marks + 1] = {pandoc.Str(idx_str)}
end
if is_corresponding_author(author) then
author_marks[#author_marks + 1] = get_mark 'corresponding_author'
end
-- modified by @kapsner
if FORMAT:match 'latex' then
author.name.literal[#author.name.literal + 1] = pandoc.Superscript(intercalate(author_marks, {pandoc.Str ','}))
return author
else
local res = List.clone(author.name.literal)
res[#res + 1] = pandoc.Superscript(intercalate(author_marks, {pandoc.Str ','}))
return res
end
end
local function author_inline_generator(get_mark)
return function(author)
local author_marks = List:new({})
-- modified by @kapsner
if has_key(author, "attributes") then
if author.attributes["equal-contributor"] then
author_marks[#author_marks + 1] = get_mark("equal_contributor")
end
end
local idx_str
for _, idx in ipairs(author.affiliations) do
if type(idx) ~= "table" then
idx_str = tostring(idx)
else
idx_str = stringify(idx)
end
author_marks[#author_marks + 1] = { pandoc.Str(idx_str) }
end
if is_corresponding_author(author) then
author_marks[#author_marks + 1] = get_mark("corresponding_author")
end
-- modified by @kapsner
if FORMAT:match("latex") then
author.name.literal[#author.name.literal + 1] =
pandoc.Superscript(intercalate(author_marks, { pandoc.Str(",") }))
return author
else
local res = List.clone(author.name.literal)
res[#res + 1] = pandoc.Superscript(intercalate(author_marks, { pandoc.Str(",") }))
return res
end
end
end
M.author_inline_generator = author_inline_generator
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
--- Generate a list of inlines containing all authors.
local function create_authors_inlines(authors, mark)
local inlines_generator = author_inline_generator(mark)
local inlines = List:new(authors):map(inlines_generator)
local and_str = List:new{pandoc.Space(), pandoc.Str'and', pandoc.Space()}
local inlines_generator = author_inline_generator(mark)
local inlines = List:new(authors):map(inlines_generator)
local and_str = List:new({ pandoc.Space(), pandoc.Str("and"), pandoc.Space() })
local last_author = inlines[#inlines]
inlines[#inlines] = nil
local result = intercalate(inlines, {pandoc.Str ',', pandoc.Space()})
if #authors > 1 then
result:extend(List:new{pandoc.Str ","} .. and_str)
end
result:extend(last_author)
return result
local last_author = inlines[#inlines]
inlines[#inlines] = nil
local result = intercalate(inlines, { pandoc.Str(","), pandoc.Space() })
if #authors > 1 then
result:extend(List:new({ pandoc.Str(",") }) .. and_str)
end
result:extend(last_author)
return result
end
M.create_authors_inlines = create_authors_inlines
-- taken from https://github.com/pandoc/lua-filters/blob/1660794b991c3553968beb993f5aabb99b317584/author-info-blocks/author-info-blocks.lua
--- Generate a block list all affiliations, marked with arabic numbers.
local function create_affiliations_blocks(affiliations)
local affil_lines = List:new(affiliations):map(
function (affil, i)
local num_inlines = List:new{
pandoc.Superscript{pandoc.Str(affil.number)},
pandoc.Space()
}
return num_inlines .. affil.name
end
)
return {pandoc.Para(intercalate(affil_lines, {pandoc.LineBreak()}))}
local affil_lines = List:new(affiliations):map(function(affil, i)
local num_inlines = List:new({
pandoc.Superscript({ pandoc.Str(affil.number) }),
pandoc.Space(),
})
return num_inlines .. affil.name
end)
return { pandoc.Para(intercalate(affil_lines, { pandoc.LineBreak() })) }
end
M.create_affiliations_blocks = create_affiliations_blocks