MultiMiner-Austria__Geologi.../_extensions/nmfs-opensci/titlepage/coverpage-theme.lua

488 lines
17 KiB
Lua
Raw Normal View History

2023-11-16 14:43:16 +00:00
local function isEmpty(s)
return s == nil or s == ''
end
local function file_exists(name)
local f=io.open(name,"r")
if f~=nil then io.close(f) return true else return false end
end
local function getVal(s)
return pandoc.utils.stringify(s)
end
function script_path()
local str = debug.getinfo(2, "S").source:sub(2)
return str:match("(.*/)")
end
local function has_value (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
local function dump(o)
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end
local function table_concat(t1,t2)
for _,v in ipairs(t2) do table.insert(t1, v) end
return t1
end
function Meta(m)
--[[
This function checks that the value the user set is ok and stops with an error message if no.
yamlelement: the yaml metadata. e.g. m["coverpage-theme"]["page-align"]
yamltext: page, how to print the yaml value in the error message. e.g. coverpage-theme: page-align
okvals: a text table of ok styles. e.g. {"right", "center"}
--]]
local function check_yaml (yamlelement, yamltext, okvals)
choice = pandoc.utils.stringify(yamlelement)
if not has_value(okvals, choice) then
print("\n\ntitlepage extension error: " .. yamltext .. " is set to " .. choice .. ". It can be " .. pandoc.utils.stringify(table.concat(okvals, ", ")) .. ".\n\n")
return false
else
return true
end
return true
end
--[[
This function gets the value of something like coverpage-theme.title-style and sets a value coverpage-theme.title-style.plain (for example). It also
does error checking against okvals. "plain" is always ok and if no value is set then the style is set to plain.
page: titlepage or coverpage
styleement: page, title, subtitle, header, footer, affiliation, etc
okvals: a text table of ok styles. e.g. {"plain", "two-column"}
--]]
local function set_style (page, styleelement, okvals)
yamltext = page .. "-theme" .. ": " .. styleelement .. "-style"
yamlelement = m[page .. "-theme"][styleelement .. "-style"]
if not isEmpty(yamlelement) then
ok = check_yaml (yamlelement, yamltext, okvals)
if ok then
m[page .. "-style-code"][styleelement] = {}
m[page .. "-style-code"][styleelement][getVal(yamlelement)] = true
else
error()
end
else
m[page .. "-style-code"][styleelement] = {}
m[page .. "-style-code"][styleelement]["plain"] = true
end
end
--[[
This function assigns the themevals to the meta data
--]]
local function assign_value (tab)
for i, value in pairs(tab) do
if isEmpty(m['coverpage-theme'][i]) then
m['coverpage-theme'][i] = value
end
end
return m
end
local coverpage_table = {
["title"] = function (m)
themevals = {
["page-align"] = "left",
["title-style"] = "plain",
["author-style"] = "none",
["footer-style"] = "none",
["header-style"] = "none",
["date-style"] = "none",
}
assign_value(themevals)
return m
end,
["author"] = function (m)
themevals = {
["page-align"] = "left",
["title-style"] = "none",
["author-style"] = "plain",
["footer-style"] = "none",
["header-style"] = "none",
["date-style"] = "none",
}
assign_value(themevals)
return m
end,
["titleauthor"] = function (m)
themevals = {
["page-align"] = "left",
["title-style"] = "plain",
["author-style"] = "plain",
["footer-style"] = "none",
["header-style"] = "none",
["date-style"] = "none",
}
assign_value(themevals)
return m
end,
["true"] = function (m)
themevals = {
["page-align"] = "left"
}
assign_value(themevals)
return m
end,
["great-wave"] = function (m)
themevals = {
["page-align"] = "right",
["title-style"] = "plain",
["author-style"] = "none",
["footer-style"] = "plain",
["header-style"] = "none",
["date-style"] = "none",
}
assign_value(themevals)
return m
end,
["otter"] = function (m)
themevals = {
["page-align"] = "left",
["title-style"] = "plain",
["author-style"] = "plain",
["footer-style"] = "none",
["header-style"] = "none",
["date-style"] = "none",
}
assign_value(themevals)
return m
end,
}
m['coverpage-file'] = false
if m.coverpage then
choice = pandoc.utils.stringify(m.coverpage)
okvals = {"none", "true", "title", "author", "titleauthor", "otter", "great-wave"}
isatheme = has_value (okvals, choice)
if not isatheme then
if not file_exists(choice) then
error("titlepage extension error: coverpage can be a tex file or one of the themes: " .. pandoc.utils.stringify(table.concat(okvals, ", ")) .. ".")
else
m['coverpage-file'] = true
m['coverpage-filename'] = choice
m['coverpage'] = "file"
end
else
ok = check_yaml (m.coverpage, "coverpage", okvals)
if not ok then error("") end
end
if not m['coverpage-file'] and choice ~= "none" then
m["coverpage-true"] = true
if isEmpty(m['coverpage-theme']) then
m['coverpage-theme'] = {}
end
coverpage_table[choice](m) -- add the theme defaults
end
if m['coverpage-file'] then
m["coverpage-true"] = true
if not isEmpty(m['coverpage-theme']) then
print("\n\ntitlepage extension message: since you passed in a static coverpage file, coverpage-theme is ignored.n\n")
end
end
if choice == "none" then
m["coverpage-true"] = false
end
else -- coverpage is false or not passed in
m["coverpage-true"] = false
m.coverpage = "none"
end
-- Only for themes
-- coverpage-theme will exist if using a theme
if not m['coverpage-file'] and m['coverpage-true'] then
--[[
Set up the demos
--]]
choice = pandoc.utils.stringify(m.coverpage)
if choice == "great-wave" then
if isEmpty(m['coverpage-bg-image']) then
-- m['coverpage-bg-image'] = script_path().."images/TheGreatWaveoffKanagawa.jpeg"
m['coverpage-bg-image'] = "img/TheGreatWaveoffKanagawa.jpeg"
end
if isEmpty(m['coverpage-title']) then
m['coverpage-title'] = "quarto_titlepages"
end
if isEmpty(m['coverpage-footer']) then
m['coverpage-footer'] = "Templates for title pages and covers"
end
demovals = {["title-align"] = "right", ["title-fontsize"] = 40, ["title-fontfamily"] = "QTDublinIrish.otf", ["title-bottom"] = "10in", ["author-style"] = "none", ["footer-fontsize"] = 20, ["footer-fontfamily"] = "QTDublinIrish.otf", ["footer-align"] = "right", ["footer-bottom"] = "9.5in", ["page-html-color"] = "F6D5A8", ["bg-image-fading"] = "north"}
for dkey, val in pairs(demovals) do
if isEmpty(m['coverpage-theme'][dkey]) then
m['coverpage-theme'][dkey] = val
end
end
end
if choice == "otter" then
if isEmpty(m['coverpage-bg-image']) then
-- m['coverpage-bg-image'] = script_path().."images/otter-bar.jpeg"
m['coverpage-bg-image'] = "img/otter-bar.jpeg"
end
if isEmpty(m['coverpage-title']) then
m['coverpage-title'] = "Otters"
end
if isEmpty(m['coverpage-author']) then
m['coverpage-author'] = {"EE", "Holmes"}
end
demovals = {["title-color"] = "white", ["title-fontfamily"] = "QTDublinIrish.otf", ["title-fontsize"] = 100, ["author-fontstyle"] = {"textsc"}, ["author-sep"] = "newline", ["author-align"] = "right", ["author-fontsize"] = 30, ["author-bottom"] = "2in"}
for dkey, val in pairs(demovals) do
if isEmpty(m['coverpage-theme'][dkey]) then
m['coverpage-theme'][dkey] = val
end
end
end
-- set the coverpage values unless user passed them in
for key, val in pairs({"title", "author", "date"}) do
if isEmpty(m['coverpage-' .. val]) then
if not isEmpty(m[val]) then
m['coverpage-' .. val] = m[val]
end
end
end
-- make a bit more robust to whatever user passes in for coverpage-author
for key, val in pairs(m['coverpage-author']) do
m['coverpage-author'][key] = getVal(m['coverpage-author'][key])
end
-- fix "true" to figure out what was passed in
if choice == "true" then
for key, val in pairs({"title", "author", "footer", "header", "date"}) do
if not isEmpty(m['coverpage-' .. val]) then
m['coverpage-theme'][val .. "-style"] = "plain"
else
m['coverpage-theme'][val .. "-style"] = "none"
end
end
end
--[[
Error checking and setting the style codes
--]]
-- Style codes
m["coverpage-style-code"] = {}
okvals = {"none", "plain"}
set_style("coverpage", "title", okvals)
set_style("coverpage", "footer", okvals)
set_style("coverpage", "header", okvals)
set_style("coverpage", "author", okvals)
set_style("coverpage", "date", okvals)
if isEmpty(m['coverpage-bg-image']) then
m['coverpage-bg-image'] = "none" -- need for stringify to work
end
choice = pandoc.utils.stringify(m['coverpage-bg-image'])
if choice == "none" then
m['coverpage-bg-image'] = false
else
m['coverpage-theme']['bg-image-anchor'] = "south west" -- fixed
image_table = {["bottom"] = 0.0, ["left"] = 0.0, ["rotate"] = 0.0, ["opacity"] = 1.0}
for key, val in pairs(image_table) do
if isEmpty(m['coverpage-theme']['bg-image-' .. key]) then
m['coverpage-theme']['bg-image-' .. key] = val
end
end
if isEmpty(m['coverpage-theme']['bg-image-size']) then
m['coverpage-theme']['bg-image-size'] = pandoc.MetaInlines{
pandoc.RawInline("latex","\\paperwidth")}
end
if not isEmpty(m['coverpage-theme']['bg-image-fading']) then
okvals = {"top", "bottom", "left", "right", "north", "south", "east", "west", "fadeout" }
ok = check_yaml (m["coverpage-theme"]["bg-image-fading"], "coverpage-theme: bg-image-fading", okvals)
if not ok then error("") end
if getVal(m['coverpage-theme']['bg-image-fading']) == "left" then m['coverpage-theme']['bg-image-fading'] = "west" end
if getVal(m['coverpage-theme']['bg-image-fading']) == "right" then m['coverpage-theme']['bg-image-fading'] = "east" end
if getVal(m['coverpage-theme']['bg-image-fading']) == "top" then m['coverpage-theme']['bg-image-fading'] = "north" end
if getVal(m['coverpage-theme']['bg-image-fading']) == "bottom" then m['coverpage-theme']['bg-image-fading'] = "south" end
end
end -- bg-image attributes
if m['coverpage-bg-image'] then -- not false
choice = pandoc.utils.stringify(m['coverpage-bg-image'])
if not file_exists(choice) then
error("\n\ntitlepage extension error: coverpage-bg-image file " .. choice .. " cannot be opened. Is the file path and name correct? Using a demo? Demo options are great-wave and otter.\n\n")
end
end
--[[
Set the fontsize spacing defaults
if page-fontsize was passed in or if fontsize passed in but not spacing
--]]
-- if not passed in then it will take page-fontsize and page-spacing
for key, val in pairs({"title", "author", "footer", "header"}) do
if getVal(m["coverpage-theme"][val .. "-style"]) ~= "none" then
if not isEmpty(m["coverpage-theme"]["page-fontsize"]) then
if isEmpty(m["coverpage-theme"][val .. "-fontsize"]) then
m["coverpage-theme"][val .. "-fontsize"] = getVal(m["coverpage-theme"]["page-fontsize"])
end
end
end
end
-- make sure spacing is set if user passed in fontsize
for key, val in pairs({"page", "title", "author", "footer", "header"}) do
if not isEmpty(m['coverpage-theme'][val .. "-fontsize"]) then
if isEmpty(m['coverpage-theme'][val .. "-spacing"]) then
m['coverpage-theme'][val .. "-spacing"] = 1.2*getVal(m['coverpage-theme'][val .. "-fontsize"])
end
end
end
--[[
Set author sep character
--]]
if isEmpty(m['coverpage-theme']["author-sep"]) then
m['coverpage-theme']["author-sep"] = pandoc.MetaInlines{
pandoc.RawInline("latex",", ")}
end
if getVal(m['coverpage-theme']["author-sep"]) == "newline" then
m['coverpage-theme']["author-sep"] = pandoc.MetaInlines{
pandoc.RawInline("latex","\\\\")}
end
--[[
Set affiliation sep character
--]]
if isEmpty(m['coverpage-theme']["affiliation-sep"]) then
m['coverpage-theme']["affiliation-sep"] = pandoc.MetaInlines{
pandoc.RawInline("latex",",~")}
end
if getVal(m['coverpage-theme']["affiliation-sep"]) == "newline" then
m['coverpage-theme']["affiliation-sep"] = pandoc.MetaInlines{
pandoc.RawInline("latex","\\\\")}
end
--[[
Set the defaults for the coverpage alignments
default coverpage alignment is left
because coverpage uses tikzpicture, the alignments of the elements must be set
--]]
if isEmpty(m['coverpage-theme']["page-align"]) then
m['coverpage-theme']["page-align"] = "left"
end
for key, val in pairs({"page", "title", "author", "footer", "header", "logo", "date"}) do
if not isEmpty(m["coverpage-theme"][val .. "-align"]) then
okvals = {"right", "left", "center"}
if has_value({"title", "author", "footer", "header", "date"}, val) then table.insert(okvals, "spread") end
ok = check_yaml (m["coverpage-theme"][val .. "-align"], "coverpage-theme: " .. val .. "-align", okvals)
if not ok then error("") end
else
m["coverpage-theme"][val .. "-align"] = getVal(m['coverpage-theme']["page-align"])
end
end
--[[
Set left and width alignments, bottom distance and rotation
--]]
for key, val in pairs({"title", "author", "footer", "header", "date"}) do
if m['coverpage-theme'][val .. "-style"] ~= "none" then
if getVal(m['coverpage-theme'][val .. "-align"]) == "left" then
m['coverpage-theme'][val .. "-anchor"] = "north west" -- not user controlled
if isEmpty(m['coverpage-theme'][val .. "-left"]) then
m['coverpage-theme'][val .. '-left'] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.2\\paperwidth")}
if isEmpty(m['coverpage-theme'][val .. '-width']) then
m['coverpage-theme'][val .. '-width'] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.7\\paperwidth")}
end
else
if isEmpty(m['coverpage-theme'][val .. '-width']) then
error("titlepage extension error: if you specify coverpage-theme "..val.."-left, you must also specify "..val.."-width.")
end
end
end -- left
if getVal(m['coverpage-theme'][val .. '-align']) == "right" then
m['coverpage-theme'][val .. '-anchor'] = "north east" -- not user controlled
if isEmpty(m['coverpage-theme'][val .. '-left']) then
m['coverpage-theme'][val .. '-left'] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.8\\paperwidth")}
if isEmpty(m['coverpage-theme'][val .. '-width']) then
m['coverpage-theme'][val .. '-width'] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.7\\paperwidth")}
end
else
if isEmpty(m['coverpage-theme'][val .. '-width']) then
error("titlepage extension error: if you specify coverpage-theme "..val.."-left, you must also specify "..val.."-width.")
end
end
end -- right
if getVal(m['coverpage-theme'][val .. '-align']) == "center" then
m['coverpage-theme'][val .. '-anchor'] = "north" -- not user controlled
if isEmpty(m['coverpage-theme'][val .. '-left']) then
m['coverpage-theme'][val .. '-left'] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.5\\paperwidth")}
if isEmpty(m['coverpage-theme'][val .. '-width']) then
m['coverpage-theme'][val .. '-width'] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.8\\paperwidth")}
end
else
if isEmpty(m['coverpage-theme'][val .. '-width']) then
error("titlepage extension error: if you specify coverpage-theme "..val.."-left, you must also specify "..val.."-width.")
end
end
end -- center
-- Set the bottom distances
bottom_table = {["title"] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.8\\paperheight")}, ["author"] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.25\\paperheight")}, ["footer"] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.1\\paperheight")}, ["header"] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.9\\paperheight")}, ["date"] = pandoc.MetaInlines{
pandoc.RawInline("latex", "0.05\\paperheight")}}
for bkey, bval in pairs(bottom_table) do
if isEmpty(m['coverpage-theme'][bkey .. '-bottom']) then
m['coverpage-theme'][bkey .. '-bottom'] = bval
end
end -- bottom distance
-- set rotation
if isEmpty(m['coverpage-theme'][val .. '-rotate']) then
m['coverpage-theme'][val .. '-rotate'] = 0
end -- rotate
end -- if style not none
end -- for loop
--[[
Set logo defaults
--]]
if not isEmpty(m['coverpage-logo']) then
if isEmpty(m['coverpage-theme']["logo-size"]) then
m['coverpage-theme']["logo-size"] = pandoc.MetaInlines{
pandoc.RawInline("latex","0.2\\paperwidth")}
end
end
end -- end the theme section
return m
end