Initial commit
This commit is contained in:
commit
0581281524
200 changed files with 9070 additions and 0 deletions
487
_extensions/nmfs-opensci/titlepage/coverpage-theme.lua
Normal file
487
_extensions/nmfs-opensci/titlepage/coverpage-theme.lua
Normal file
|
|
@ -0,0 +1,487 @@
|
|||
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
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue