488 lines
17 KiB
Lua
488 lines
17 KiB
Lua
|
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
|
||
|
|
||
|
|