this module contains the code for Template:Titulus; receives the template's parameters, and converts them in strings generating the text to be visualized in the titulus box and the categories in which to place the book, based on the author, year, genre(s) and source available.

The module also checks if the page is a subpage (if it has slashes / in the title), and in this case does not add the categories.


p = {}

function p.titulus(frame)
    pframe = frame:getParent()
    config = frame.args
    args = pframe.args
   
--template parameters
	local saeculumquaero = require "Module:Titulus/SaeculumQuaero"
	operaetitulus = config["OperaeTitulus"]
	subtitulus = config["SubTitulus"] or ""
	scriptor = config["Scriptor"] or ""
	liber = config["Liber"] or ""
	annus = config["Annus"] or ""
	annusmonstratus = config["AnnusMonstratus"] or ""
	operaewikipagina = config["OperaeWikiPagina"] or ""
	fons = config["Fons"] or ""
	editio = config["Editio"] or ""
	interpres = config["Interpres"] or ""
	annusinterpretationis = config["AnnusInterpretationis"] or ""
	linguanativa = config["LinguaNativa"] or ""
	recensor = config["Recensor"] or ""
	genera = config["Genera"] or ""
	frons = config["Frons"] or ""
	scriptor2 = config["Scriptor2"]
	scriptor3 = config["Scriptor3"]
	scriptor4 = config["Scriptor4"]
	scriptor5 = config["Scriptor5"]
	scriptor6 = config["Scriptor6"]
	
--initializes internal variables, for ease of concatenation
	categoriaomnia=""; categoriacapiti = ""; categoriascriptoris = ""; categorialibri = ""; anninumerus = ""; categoriaanni = ""; categoriagenerum = ""
	nexusscriptoris2 = ""; nexusscriptoris3 = ""; nexusscriptoris4 = ""; nexusscriptoris5 = ""; nexusscriptoris6 = ""
	categoriascriptoris2 = ""; categoriascriptoris3 = ""; categoriascriptoris4 = ""; categoriascriptoris5 = ""; categoriascriptoris6 = ""
--fetches the title of the page
	titulus = mw.title.getCurrentTitle().text
	
--checks if the page is a subpage, i.e. if it has slashes /
	if mw.ustring.find(titulus, "/") then
		subpagina = true
	else
		subpagina = false
	end
	
--Generating the strings that translate the templates' parameters

--SCRIPTOR (author of the work)
	if scriptor == "Anonimus" or scriptor == "0" then --for anonimous works
		nexusscriptoris= "Sine Nomine"; 
		categoriascriptoris = "[[Categoria:Opera sine nomine scripta|".. titulus.. "]]" --adds the work in the Categoria:Opera sine nomine scripta
			
	else --when the author is known
		nexusscriptoris = "[[Scriptor:".. scriptor.. "|".. scriptor.. "]]"; 
		if mw.title.new("Scriptor:"..scriptor).isRedirect then
			scriptor = tostring(mw.title.new("Scriptor:".. scriptor).redirectTarget) --fixes the scriptor's name, if redirect, to insert it in the category
			scriptor = string.gsub(scriptor, "Scriptor:", "")
		end
		categoriascriptoris = "[[Categoria:Opera quae ".. scriptor.. " scripsit|".. titulus.. "]]" --adds the work in the author's category
	end
	
--SCRIPTOR2, 3 etc., for works with more authors (up to 5)
	if scriptor2 ~= "0" then --2
		nexusscriptoris2 = ", [[Scriptor:".. scriptor2.. "|".. scriptor2.. "]]"; 
		if mw.title.new("Scriptor:"..scriptor2).isRedirect then
			scriptor2 = tostring(mw.title.new("Scriptor:".. scriptor2).redirectTarget) --fixes the scriptor's name, if redirect, to insert it in the category
			scriptor2 = string.gsub(scriptor2, "Scriptor:", "")
		end
		categoriascriptoris2 = "[[Categoria:Opera quae ".. scriptor2.. " scripsit|".. titulus.. "]]"
	end
	if scriptor3 ~= "0" then --3
		nexusscriptoris3 = ", [[Scriptor:".. scriptor3.. "|".. scriptor3.. "]]"; 
		if mw.title.new("Scriptor:"..scriptor3).isRedirect then
			scriptor3 = tostring(mw.title.new("Scriptor:".. scriptor3).redirectTarget) --fixes the scriptor's name, if redirect, to insert it in the category
			scriptor3 = string.gsub(scriptor3, "Scriptor:", "")
		end
		categoriascriptoris3 = "[[Categoria:Opera quae ".. scriptor3.. " scripsit|".. titulus.. "]]"
	end
	if scriptor4 ~= "0" then --4
		nexusscriptoris4 = ", [[Scriptor:".. scriptor4.. "|".. scriptor4.. "]]"; 
		if mw.title.new("Scriptor:"..scriptor4).isRedirect then
			scriptor4 = tostring(mw.title.new("Scriptor:".. scriptor4).redirectTarget) --fixes the scriptor's name, if redirect, to insert it in the category
			scriptor4 = string.gsub(scriptor4, "Scriptor:", "")
		end
		categoriascriptoris2 = "[[Categoria:Opera quae ".. scriptor4.. " scripsit|".. titulus.. "]]"
	end
	if scriptor5 ~= "0" then --5
		nexusscriptoris5 = ", [[Scriptor:".. scriptor5.. "|".. scriptor5.. "]]"; 
		if mw.title.new("Scriptor:"..scriptor5).isRedirect then
			scriptor5 = tostring(mw.title.new("Scriptor:".. scriptor5).redirectTarget) --fixes the scriptor's name, if redirect, to insert it in the category
			scriptor5 = string.gsub(scriptor5, "Scriptor:", "")
		end
		categoriascriptoris5 = "[[Categoria:Opera quae ".. scriptor5.. " scripsit|".. titulus.. "]]"
	end
	if scriptor6 ~= "0" then --6
		nexusscriptoris6 = ", [[Scriptor:".. scriptor6.. "|".. scriptor6.. "]]"; 
		if mw.title.new("Scriptor:"..scriptor6).isRedirect then
			scriptor6 = tostring(mw.title.new("Scriptor:".. scriptor6).redirectTarget) --fixes the scriptor's name, if redirect, to insert it in the category
			scriptor6 = string.gsub(scriptor6, "Scriptor:", "")
		end
		categoriascriptoris6 = "[[Categoria:Opera quae ".. scriptor6.. " scripsit|".. titulus.. "]]"
	end

--OPERAETITULUS (title oh the work)
	if operaetitulus == "0" then error('quaeso titulum operis in campo |OperaeTitulus= insere') end --if the title is not specified, calls for error

	if subpagina == false then --if the page is not a subpage
		nexusoperaetituli = operaetitulus --does not gerate a link
	elseif subpagina == true then --if the page is a subpage
		if operaewikipagina > "0" then 
			nexusoperaetituli = "[[".. operaewikipagina.. "|".. operaetitulus.. "]]"
		else
			nexusoperaetituli = "[[".. operaetitulus.. "]]"
		end
	end
	
--SUBTITULUS (subtitle of the work)
	if subtitulus ~= "0" then
		nexussubtituli = subtitulus
	else
		nexussubtituli = ""
	end
	
--ANNUS (publication year)
	if annus ~= "0" then --if the "annus" parameter is defined...
		if annusmonstratus > "0" then
			nexusanni = annusmonstratus --visualizes a different value from that used for categorizations, for cases like "inter 1650 et 1655" or similar
		else
			nexusanni = annus --the year will be visualized just as inserted in the template
		end
		saeculum = saeculumquaero.annus(annus)
		categoriaanni = "[[Categoria:Saeculi ".. saeculum.. " opera|".. titulus.. "]]" --generates the category by putting together the "saeculum" and the eventuale "aCn"

	else --if the annus parameter is not compiled, the year is unknown and the corresponding category is added
	nexusanni = "anno incognito"
	categoriaanni = "[[Categoria:Saeculi incogniti opera|".. titulus.. "]]"
	end
	
-- INTERPRES and ANNUSINTERPRETATIONIS, for the translator and the year of translation
	if interpres ~= "0" then
		nexusinterpretis= "[[Scriptor:".. interpres.. "|".. interpres.. "]] latine vertit"
		if mw.title.new("Scriptor:"..interpres).isRedirect then
			interpres = tostring(mw.title.new("Scriptor:".. interpres).redirectTarget) --fixes the translator's name, if redirect, to insert it in the category
			interpres = string.gsub(interpres, "Scriptor:", "")
		end
		categoriainterpretis = "[[Categoria:Opera quae ".. interpres.. " latine vertit|".. titulus.. "]]"
		if interpres == "anonimus" or interpres == "Anonimus" or interpres == "incognitus" or interpres == "Incognitus" then --if the author of the translation is not known
			nexusinterpretis = "Incognitus auctor latine vertit" 
			categoriainterpretis = "[[Categoria:Auctoris incogniti interpretationes|".. titulus.. "]]"
		end
		if annusinterpretationis ~= "0" then --if the "annusinterpretationis" parameter is defined...
			nexusanniinterpretationis = ", ".. annusinterpretationis
			saeculum = saeculumquaero.annus(annusinterpretationis)
			categoriaanniinterpretationis = "[[Categoria:Saeculi ".. saeculum.. " interpretationes|".. titulus.. "]]" --generates the category by putting together the "saeculum" and the eventuale "aCn"
			if linguanativa ~= "0" then
				if linguanativa == "anglicus" or linguanativa == "anglica" then
					nexuslinguaenativae = " ab anglico"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Anglica|".. titulus.. "]]"
				elseif linguanativa == "arabicus" or linguanativa == "arabus" or linguanativa == "arabica" or linguanativa == "araba" then
					nexuslinguaenativae = " ab arabico"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Arabica|".. titulus.. "]]"
				elseif linguanativa == "francicus" or linguanativa == "gallicus" or linguanativa == "francogallicus" or linguanativa == "gallica" or linguanativa == "francica" or linguanativa == "francogallica" then
					nexuslinguaenativae = " a francogallico"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Francogallica|".. titulus.. "]]"
				elseif linguanativa == "germanicus" or linguanativa == "theodiscus" or linguanativa == "teodiscus" or linguanativa == "germanica" or linguanativa == "theodisca" or linguanativa == "teodisca" then
					nexuslinguaenativae = " a germanico"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Germanica|".. titulus.. "]]"
				elseif linguanativa == "graecus" or linguanativa == "grecus" or linguanativa == "graeca" or linguanativa == "greca" then
					nexuslinguaenativae = " a graeco"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Graeca|".. titulus.. "]]"
				elseif linguanativa == "hebraicus" or linguanativa == "hebraeus" or linguanativa == "iudaicus" or linguanativa == "hebraica" or linguanativa == "hebraea" or linguanativa == "iudaica" then
					nexuslinguaenativae = " ab hebraico"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Hebraica|".. titulus.. "]]"
				elseif linguanativa == "italicus" or linguanativa == "italianus" or linguanativa == "italica" or linguanativa == "italiana" then
					nexuslinguaenativae = " ab italiano"
					categorialinguaenativae = "[[Categoria:Interpretationes a lingua Italiana|".. titulus.. "]]"
				else
					nexuslinguaenativae = ""; categorialinguaenativae = "[[Categoria:Interpretationes a lingua incognita|".. titulus.. "]]"
				end
			else
				nexuslinguaenativae = ""; categorialinguaenativae = ""
			end
		else --if the annusinterpretationis parameter is not compiled, the year is unknown and the corresponding category is added
		nexusanni = ", anno incognito"
		categoriaanniinterpretationis = "[[Categoria:Saeculi incogniti interpretationes|".. titulus.. "]]"
		end
	end	
--RECENSOR and EDITIO, for edition year and curator
	if recensor ~= "0" then
		editioest=true
		nexusrecensoris= "[[Scriptor:".. recensor.. "|".. recensor.. "]] recensuit"
		if mw.title.new("Scriptor:"..recensor).isRedirect then
			recensor = tostring(mw.title.new("Scriptor:".. recensor).redirectTarget) --fixes the recensor's name, if redirect, to insert it in the category
			recensor = string.gsub(recensor, "Scriptor:", "")
		end
		categoriarecensoris = "[[Categoria:Opera quae ".. recensor.. " recensuit|".. titulus.. "]]"
	else
		nexusrecensoris = ""; categoriarecensoris = ""
	end
	if editio ~= "0" then
		if recensor > "0" then comma = "; " else comma = "" end
		nexuseditionis= "</br>editio: ".. editio.. comma
		categoriaeditionis = "[[Categoria:Opera cum editione|".. titulus.. "]]"
	else
		nexuseditionis = "editio: incognita"
		categoriaeditionis = "[[Categoria:Opera sine editione|".. titulus.. "]]"
	end
	
--FONS, generates a link to the source of the text
	if fons ~= "0" then
		nexusfontis = "fons: ".. fons
		categoriafontis = "[[Categoria:Opera cum fonte|".. titulus.. "]]"
	else
		nexusfontis = "fons: incognitus" 
		if mw.title.new("Disputatio:"..mw.title.getCurrentTitle().rootText).exists then --TEMPORARY PATCH (25/06/20): looks for the discussion page to add the "sine fonte" category
			categoriafontis = "[[Categoria:Opera sine fonte|".. titulus.. "]] [[Categoria:Opera cum fonte in disputatione|".. titulus.. "]]" --this category is only a TEMPORARY working tool, the whole string will be deleted after all the works are properly categorized!
		else
			categoriafontis = "[[Categoria:Opera sine fonte|".. titulus.. "]]"
		end	
	end
	nexusfontis = nexusfontis.. categoriafontis
	--LIBER (generates a link to the scanned copy OR, lacking this, the discussion page)
	if liber ~= "0" then
	nexuslibri = "fons: [[Liber:".. liber.. "|librum vide]]"
		if mw.title.new("Liber:"..liber).exists then
			categoriafontis = "[[Categoria:Opera cum libro digitali".. "|".. titulus.. "]]"
		else
			error("Librum ".. liber.. " deest! - there is not such index!")
		end
	nexusfontis = nexuslibri.. categoriafontis
	end 

--GENERA (puts the page into the "genera" categories)
	if genera ~= "0" then --if the "genera" parameter is defined...
		genera = string.gsub(genera, ", ", ",") --adjusts the commas
		genera = string.gsub(genera, ",", "]][[Categoria:") --splits the arguments, separated by commas, generating a category for each one
		categoriagenerum = "[[Categoria:".. genera.. "]]"
	else --if the "genera" parameter is not defined...
		categoriagenerum = "[[Categoria:Opera sine generibus]]" --adds the corresponding category
	end
	
--FRONS (locates a front page for exports)
	if frons ~= "0" then
		nexusfrontis = frons
	else
		nexusfrontis = ""
	end
	
--puts the generic category "Opera omnia", collecting all published works
	categoriaomnia = "[[Categoria:Opera omnia".. "|".. titulus.. "]]"
	
--Retieves Wikidata item
	item = mw.wikibase.getEntity()	
	id = mw.wikibase.getEntityIdForCurrentPage()
	
	if id == nil then
		wikidata_cat = "[[Categoria:Opera sine re wikidata".. "|".. titulus.. "]]"
	else
		wikidata_cat = ""
	end
			
	if subpagina == true then
	categoriacapiti = "[[Categoria:Capita ex operibus".. "|".. titulus.. "]]" --adds the "capita" (''chapter'') category 
	categoriascriptoris = ""
	categoriafontis = ""
	if annus == "0" then nexusanni = "" end
	categoriaanni = ""
	categoriainterpretis = ""
	categoriaanniinterpretationis = ""
	categoriaanniinterpretationis = ""
	categorialinguaenativae = ""
	categoriarecensoris = ""
	categoriagenerum = ""
	nexusfrontis = ""
	categoriaomnia = ""
	if editio == "0" then nexuseditionis = "" end
	if fons == "0" then nexusfontis = "" end
	if liber ~= "0" then nexusfontis = nexuslibri end
	categoriaeditionis = ""
	wikidata_cat = ""
	end


--builds the table
	tab = '<div id="ws-data" class="ws-noexport" style="display:none; speak:none">'
	tab = tab.. '<span id="ws-author">'.. scriptor..  '</span>'
	tab = tab.. '<span id="ws-title">'.. operaetitulus.. '</span>'
	tab = tab.. '<span id="ws-scan">'.. liber.. '</span>'
	tab = tab.. '<span id="ws-year">'.. annus.. '</span>'
if nexusfrontis > "0" then
	tab = tab.. '<span id="ws-cover">'.. nexusfrontis.. '</span>'
	tab = tab.. '</div>'
else
    tab = tab.. '</div>'
end
	tab = tab.. '<div class="titulusHeaderBox">'
    tab = tab.. '<div class="ws-noexport" style="padding:1ex;font-size:120%; font-weight: bold;">'
    tab = tab.. categoriaomnia.. nexusscriptoris.. categoriascriptoris.. nexusscriptoris2.. categoriascriptoris2.. nexusscriptoris3.. categoriascriptoris3.. nexusscriptoris4.. categoriascriptoris4.. nexusscriptoris5.. categoriascriptoris5.. nexusscriptoris6.. categoriascriptoris6
    tab = tab.. '</div>'
    tab = tab.. '<div class="ws-noexport" style="padding:1ex;font-size:140%;font-variant:small-caps; font-weight: bold;">'
	tab = tab.. nexusoperaetituli.. categoriacapiti.. categoriagenerum
	tab = tab.. '</div>'
	tab = tab.. '<div class="ws-noexport" style="padding:1ex;font-size:110%; font-weight:bold;">'
    tab = tab.. nexussubtituli
    if interpres > "0" then
	tab = tab.. '</div><div class="ws-noexport" style="padding:1ex;font-size:110%; font-weight:bold;">'
	tab = tab.. nexusinterpretis.. nexuslinguaenativae.. categorialinguaenativae.. nexusanniinterpretationis.. categoriainterpretis.. categoriaanniinterpretationis
	tab = tab.. '</div>'
else
    tab = tab.. '</div>'
end
    tab = tab.. '<div class="ws-noexport" class="ws-noexport" style="padding:1ex; font-weight: bold;">'
    tab = tab.. nexusanni.. categoriaanni
    tab = tab.. '</div>'
    tab = tab.. '<div align="left" class="ws-noexport" style="padding:1ex;font-size:65%; font-weight:bold;">'
    tab = tab.. nexuseditionis.. nexusrecensoris.. categoriarecensoris.. categoriaeditionis.. "</br>".. nexusfontis.. wikidata_cat
    tab = tab.. '</div>'
	tab = tab.. '</div>'
	tab = tab.. '<div title="beginning"></div>'
	tab = tab.. '<div class="text">'
	
return tab
    
    end
return p