<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ekatrafoundation.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AHeader</id>
	<title>Module:Header - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ekatrafoundation.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AHeader"/>
	<link rel="alternate" type="text/html" href="https://wiki.ekatrafoundation.org/index.php?title=Module:Header&amp;action=history"/>
	<updated>2026-04-24T04:55:11Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.38.2</generator>
	<entry>
		<id>https://wiki.ekatrafoundation.org/index.php?title=Module:Header&amp;diff=1339&amp;oldid=prev</id>
		<title>Jayprakash12345: Created page with &quot;--[=[ This is a module to implement logic for the {{header}} template  It doesn&#039;t do everything yet, but over time it can accrete functions from the template, which will becom...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.ekatrafoundation.org/index.php?title=Module:Header&amp;diff=1339&amp;oldid=prev"/>
		<updated>2021-06-01T14:22:33Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[=[ This is a module to implement logic for the {{header}} template  It doesn&amp;#039;t do everything yet, but over time it can accrete functions from the template, which will becom...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[=[&lt;br /&gt;
This is a module to implement logic for the {{header}} template&lt;br /&gt;
&lt;br /&gt;
It doesn&amp;#039;t do everything yet, but over time it can accrete functions from&lt;br /&gt;
the template, which will become simpler and simpler until it&amp;#039;s just an invoke.&lt;br /&gt;
&lt;br /&gt;
Not implemented yet:&lt;br /&gt;
 * Categories (deprecated anyway)&lt;br /&gt;
 * Subpage checking&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local p = {} --p stands for package&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- get the param_override or param parameter in that order&lt;br /&gt;
-- nil if neither is there&lt;br /&gt;
function get_arg_or_override(args, param)&lt;br /&gt;
	if args[&amp;quot;override_&amp;quot; .. param] then&lt;br /&gt;
		return args[&amp;quot;override_&amp;quot; .. param]&lt;br /&gt;
	elseif args[param] then&lt;br /&gt;
		return args[param]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- return true if any value in list is nil in args&lt;br /&gt;
-- (nil means not present; empty string is not nil)&lt;br /&gt;
function any_arg_nil(args, list)&lt;br /&gt;
	for k,v in pairs(list) do&lt;br /&gt;
		if args[v] == nil then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- return true if any value in list is not nil or empty in args&lt;br /&gt;
-- (nil means not present; empty string is not nil)&lt;br /&gt;
function has_any_arg(args, list)&lt;br /&gt;
	for k,v in pairs(list) do&lt;br /&gt;
		if args[v] ~= nil and args[v] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct a warning if required parameters are missing&lt;br /&gt;
]=]&lt;br /&gt;
function p.missing_params_error(frame)&lt;br /&gt;
	local args = getArgs(frame, {&lt;br /&gt;
		removeBlanks = false&lt;br /&gt;
	})&lt;br /&gt;
	&lt;br /&gt;
	local s = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local required_args = {&amp;#039;title&amp;#039;, &amp;#039;section&amp;#039;, &amp;#039;author&amp;#039;, &amp;#039;previous&amp;#039;, &amp;#039;next&amp;#039;, &amp;#039;notes&amp;#039;}&lt;br /&gt;
	if any_arg_nil(args, required_args) then&lt;br /&gt;
		local error_div = mw.html.create(&amp;quot;div&amp;quot;)&lt;br /&gt;
			:css({[&amp;#039;margin-right&amp;#039;] = &amp;#039;auto&amp;#039;,&lt;br /&gt;
				[&amp;#039;margin-left&amp;#039;] = &amp;#039;auto&amp;#039;,&lt;br /&gt;
				[&amp;#039;border-top&amp;#039;] = &amp;#039;1px solid #CCC&amp;#039;,&lt;br /&gt;
				[&amp;#039;border-right&amp;#039;]  = &amp;#039;1px solid #CCC&amp;#039;,&lt;br /&gt;
				[&amp;#039;border-bottom&amp;#039;] = &amp;#039;1px hidden transparent&amp;#039;,&lt;br /&gt;
				[&amp;#039;border-left&amp;#039;] = &amp;#039;1px solid #CCC&amp;#039;,&lt;br /&gt;
				[&amp;#039;text-align&amp;#039;] = &amp;#039;center&amp;#039;&lt;br /&gt;
			})&lt;br /&gt;
			&lt;br /&gt;
		error_div:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
			:addClass(&amp;quot;error&amp;quot;)&lt;br /&gt;
			:css({&lt;br /&gt;
				[&amp;#039;font-size&amp;#039;] = &amp;quot;90%&amp;quot;,&lt;br /&gt;
				[&amp;#039;font-weight&amp;#039;] = &amp;quot;bold&amp;quot;,&lt;br /&gt;
			})&lt;br /&gt;
			:wikitext(&amp;quot;Template error: please do not remove empty parameters (see the [[WS:STYLE#Templates|style guide]] and [[Template:Header#documentation|template documentation]]).&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
		s = tostring(error_div)&lt;br /&gt;
		&lt;br /&gt;
		-- categorise only in mainspace&lt;br /&gt;
		if mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
			s = s .. &amp;quot;[[Category:Headers missing parameters]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Place each value from a table of IDs:values into the given parent element&lt;br /&gt;
function append_mf_values(parent, values)&lt;br /&gt;
	for k,v in pairs(values) do&lt;br /&gt;
		parent:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
			:attr(&amp;quot;id&amp;quot;, k)&lt;br /&gt;
			:wikitext(v)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create the Microformat wrapper div&lt;br /&gt;
function construct_mf_wrapper(args)&lt;br /&gt;
	local mf_div =  mw.html.create(&amp;quot;div&amp;quot;)&lt;br /&gt;
	mf_div:addClass(&amp;quot;ws-noexport&amp;quot;)&lt;br /&gt;
	    :attr(&amp;quot;id&amp;quot;, &amp;quot;ws-data&amp;quot;)&lt;br /&gt;
		:css({&lt;br /&gt;
			speak = &amp;quot;none&amp;quot;&lt;br /&gt;
		})&lt;br /&gt;
	&lt;br /&gt;
	-- hide the microformat unless it&amp;#039;s overriden&lt;br /&gt;
	if not (args[&amp;quot;show_microformat&amp;quot;] and yesno(args[&amp;#039;show_microformat&amp;#039;])) then&lt;br /&gt;
		mf_div:css(&amp;quot;display&amp;quot;, &amp;quot;none&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return mf_div&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Collect all the values of microformat data from the arguments provided&lt;br /&gt;
-- Returns a table of microformat ID:contents.&lt;br /&gt;
function collect_mf_data(args)&lt;br /&gt;
	-- collect the MF values here&lt;br /&gt;
	local mf = {};&lt;br /&gt;
&lt;br /&gt;
	mf[&amp;quot;ws-article-id&amp;quot;] = mw.title.getCurrentTitle().id &lt;br /&gt;
	&lt;br /&gt;
	-- add the title&lt;br /&gt;
	if args[&amp;quot;title&amp;quot;] then&lt;br /&gt;
		mf[&amp;quot;ws-title&amp;quot;] = args[&amp;#039;title&amp;#039;]&lt;br /&gt;
&lt;br /&gt;
		-- append section if there is one&lt;br /&gt;
		if args[&amp;quot;section&amp;quot;] then&lt;br /&gt;
			mf[&amp;quot;ws-title&amp;quot;] = mf[&amp;quot;ws-title&amp;quot;] .. &amp;quot; — &amp;quot; .. args[&amp;quot;section&amp;quot;]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local author = get_arg_or_override(args, &amp;quot;contributor&amp;quot;)&lt;br /&gt;
	if not author then&lt;br /&gt;
		author = get_arg_or_override(args, &amp;quot;section_author&amp;quot;)	&lt;br /&gt;
	end&lt;br /&gt;
	if not author then&lt;br /&gt;
		author = get_arg_or_override(args, &amp;quot;author&amp;quot;)	&lt;br /&gt;
	end&lt;br /&gt;
	if author then&lt;br /&gt;
		mf[&amp;#039;ws-author&amp;#039;] = author&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local translator = get_arg_or_override(args, &amp;quot;translator&amp;quot;)&lt;br /&gt;
	if translator then&lt;br /&gt;
		mf[&amp;#039;ws-translator&amp;#039;] = translator&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local year = get_arg_or_override(args, &amp;quot;year&amp;quot;)&lt;br /&gt;
	if year then&lt;br /&gt;
		mf[&amp;#039;ws-year&amp;#039;] = year&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;#039;cover&amp;#039;] then&lt;br /&gt;
		mf[&amp;#039;ws-cover&amp;#039;] = args[&amp;#039;cover&amp;#039;]	&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return mf&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct the [[Help:Microformat]] for the page.&lt;br /&gt;
&lt;br /&gt;
This is in the form:&lt;br /&gt;
&amp;lt;div id=&amp;quot;ws-data&amp;quot; ...&amp;gt;&lt;br /&gt;
  &amp;lt;span id=&amp;quot;ws-title&amp;quot;&amp;gt;Title here...&amp;lt;/span&amp;gt;&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;div&amp;gt;&lt;br /&gt;
]=]&lt;br /&gt;
function p.microformat(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	local mf_div =  construct_mf_wrapper(args)&lt;br /&gt;
	local mf = collect_mf_data(args)&lt;br /&gt;
&lt;br /&gt;
	append_mf_values(mf_div, mf)&lt;br /&gt;
	return tostring(mf_div)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function make_category_list(categories)&lt;br /&gt;
	local s = &amp;quot;&amp;quot;&lt;br /&gt;
	for k,v in pairs(categories) do&lt;br /&gt;
		s = s .. &amp;quot;[[Category:&amp;quot; .. v .. &amp;quot;]]\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Detect illegal formatting in fields like &amp;quot;section&amp;quot; and &amp;quot;title&amp;quot;&lt;br /&gt;
]=]&lt;br /&gt;
function illegal_formatting(str)&lt;br /&gt;
	return string.match(str, &amp;quot;&amp;#039;&amp;#039;&amp;#039;?&amp;quot;)&lt;br /&gt;
		or string.match(str, &amp;quot;&amp;lt;%s*/?%s*[iIbB]%s*&amp;gt;&amp;quot;)&lt;br /&gt;
		-- add more cases here&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function check_non_existent_author_pages(args, param, categories)&lt;br /&gt;
&lt;br /&gt;
	if args[param] then&lt;br /&gt;
		-- some pages expect an invalid author&lt;br /&gt;
		local special = false&lt;br /&gt;
		local lower_arg =  string.lower(args[param])&lt;br /&gt;
		if lower_arg == &amp;quot;unknown&amp;quot; or lower_arg == &amp;quot;not mentioned&amp;quot; then&lt;br /&gt;
			special = true&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if not special then&lt;br /&gt;
			local target = mw.title.makeTitle(&amp;quot;Author&amp;quot;, args[param])&lt;br /&gt;
			-- expensive function!&lt;br /&gt;
			if not target.exists then&lt;br /&gt;
				table.insert(categories, &amp;quot;Works with non-existent author pages&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct the automatic categories for the header&lt;br /&gt;
]=]&lt;br /&gt;
function p.categories(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	local categories = {}&lt;br /&gt;
	local this_page = mw.title.getCurrentTitle();&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;override_author&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;Pages with override author&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if this_page:inNamespaces(0, 114) then&lt;br /&gt;
		check_non_existent_author_pages(args, &amp;quot;author&amp;quot;, categories)&lt;br /&gt;
		check_non_existent_author_pages(args, &amp;quot;editor&amp;quot;, categories)&lt;br /&gt;
		check_non_existent_author_pages(args, &amp;quot;translator&amp;quot;, categories)&lt;br /&gt;
		check_non_existent_author_pages(args, &amp;quot;section_translator&amp;quot;, categories)&lt;br /&gt;
		check_non_existent_author_pages(args, &amp;quot;section_author&amp;quot;, categories)&lt;br /&gt;
		check_non_existent_author_pages(args, &amp;quot;contributor&amp;quot;, categories)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;contributor&amp;quot;] or args[&amp;quot;section_author&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;Pages with contributor&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;override_contributor&amp;quot;] or args[&amp;quot;override_section_author&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;Pages with override contributor&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local author = get_arg_or_override(args, &amp;quot;author&amp;quot;)&lt;br /&gt;
	if author and (string.lower(author) == &amp;quot;unknown&amp;quot;) then&lt;br /&gt;
		table.insert(categories, &amp;quot;Anonymous texts&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local editor = get_arg_or_override(args, &amp;quot;editor&amp;quot;)&lt;br /&gt;
	if editor then&lt;br /&gt;
		editor = string.lower(editor)&lt;br /&gt;
		if editor == &amp;quot;unknown&amp;quot; or editor == &amp;quot;?&amp;quot; then&lt;br /&gt;
			table.insert(categories, &amp;quot;Works with unknown editors&amp;quot;)&lt;br /&gt;
		elseif editor == &amp;quot;not mentioned&amp;quot; then&lt;br /&gt;
			table.insert(categories, &amp;quot;Works with unmentioned editors&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local translator = get_arg_or_override(args, &amp;quot;translator&amp;quot;)&lt;br /&gt;
	if translator then&lt;br /&gt;
		translator = string.lower(translator)&lt;br /&gt;
		if translator == &amp;quot;unknown&amp;quot; or translator == &amp;quot;not mentioned&amp;quot; or translator == &amp;quot;?&amp;quot; then&lt;br /&gt;
			table.insert(categories, &amp;quot;Translations without translator information specified&amp;quot;)&lt;br /&gt;
		elseif translator == &amp;quot;wikisource&amp;quot; and (this_page.baseText == this_page.text) then&lt;br /&gt;
			-- if a basepage&lt;br /&gt;
			-- ?? why is this not done by {{translation}} ??&lt;br /&gt;
			table.insert(categories, &amp;quot;Wikisource translations&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;shortcut&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;Mainspace pages with shortcuts&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;override_year&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;pages with override year&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if args[&amp;quot;noyear&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;pages with noyear&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	if args[&amp;quot;noyearcat&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;pages with noyearcat&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[&amp;quot;cover&amp;quot;] then&lt;br /&gt;
		table.insert(categories, &amp;quot;Pages with an export cover&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- sanity/maintenance checks on various parameters&lt;br /&gt;
	&lt;br /&gt;
	-- allow_illegal_formatting parameter suppresses this check&lt;br /&gt;
	-- used by, for example, [[Template:Versions]]&lt;br /&gt;
	if args[&amp;quot;allow_illegal_formatting&amp;quot;] == nil then&lt;br /&gt;
&lt;br /&gt;
		if args[&amp;quot;title&amp;quot;] and illegal_formatting(args[&amp;#039;title&amp;#039;]) then&lt;br /&gt;
			table.insert(categories, &amp;quot;pages with illegal formatting in header fields&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if args[&amp;quot;section&amp;quot;] and illegal_formatting(args[&amp;#039;section&amp;#039;]) then&lt;br /&gt;
			table.insert(categories, &amp;quot;pages with illegal formatting in header fields&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return make_category_list(categories)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function get_plain_sister(frame, args, sister_args)&lt;br /&gt;
	local ps_args = {}&lt;br /&gt;
	for k,v in pairs(sister_args) do&lt;br /&gt;
		if args[v] then&lt;br /&gt;
			ps_args[v] = args[v]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;plain sister&amp;quot;, args = ps_args}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Return the title span&lt;br /&gt;
&lt;br /&gt;
&amp;gt; &lt;br /&gt;
--]=]&lt;br /&gt;
function construct_title(args)&lt;br /&gt;
	local title = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;id&amp;quot;, &amp;quot;header_title_text&amp;quot;)&lt;br /&gt;
		:css({&lt;br /&gt;
			[&amp;quot;font-weight&amp;quot;] = &amp;quot;bold&amp;quot;,&lt;br /&gt;
		})&lt;br /&gt;
		&lt;br /&gt;
	if args[&amp;quot;title&amp;quot;] then&lt;br /&gt;
		title:wikitext(args[&amp;quot;title&amp;quot;])&lt;br /&gt;
	else&lt;br /&gt;
		title:wikitext(&amp;quot;Untitled&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct the title field&lt;br /&gt;
]=]&lt;br /&gt;
function p.title(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	local title = construct_title(args)&lt;br /&gt;
	return tostring(title)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct the year span&lt;br /&gt;
--]=]&lt;br /&gt;
function construct_year(frame, args)&lt;br /&gt;
&lt;br /&gt;
	local year = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
		:attr(&amp;quot;id&amp;quot;, &amp;quot;header_year_text&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
	if args[&amp;quot;year_override&amp;quot;] then&lt;br /&gt;
		year:wikitext(args[&amp;quot;year_override&amp;quot;])&lt;br /&gt;
	else&lt;br /&gt;
		local year_args = {&lt;br /&gt;
			[1] = args[&amp;quot;year&amp;quot;],&lt;br /&gt;
			noprint = &amp;quot;0&amp;quot;,&lt;br /&gt;
			nocat = &amp;quot;0&amp;quot;,&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		if args[&amp;quot;noyear&amp;quot;] then&lt;br /&gt;
			year_args[&amp;#039;noprint&amp;#039;] = &amp;quot;1&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if args[&amp;quot;disambiguation&amp;quot;] and yesno(args[&amp;#039;disambiguation&amp;#039;]) then&lt;br /&gt;
			-- disambiguations never categorise&lt;br /&gt;
			year_args[&amp;#039;nocat&amp;#039;] = &amp;quot;1&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			if args[&amp;quot;noyearcat&amp;quot;] and yesno(args[&amp;#039;noyearcat&amp;#039;]) then&lt;br /&gt;
				-- manually no-catted&lt;br /&gt;
				year_args[&amp;#039;nocat&amp;#039;] = &amp;quot;1&amp;quot;&lt;br /&gt;
			elseif mw.title.getCurrentTitle().isSubpage then&lt;br /&gt;
				-- only categorise if this is a base page&lt;br /&gt;
				year_args[&amp;#039;nocat&amp;#039;] = &amp;quot;1&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		mw.logObject(year_args)&lt;br /&gt;
		year:wikitext(mw.text.trim(frame:expandTemplate{&lt;br /&gt;
			title = &amp;quot;header/year&amp;quot;,&lt;br /&gt;
			args  = year_args&lt;br /&gt;
		}))&lt;br /&gt;
	end&lt;br /&gt;
	return year&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct the year field&lt;br /&gt;
]=]	&lt;br /&gt;
function p.year(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	ret = &amp;quot;&amp;quot;&lt;br /&gt;
	if get_arg_or_override(args, &amp;quot;year&amp;quot;) then&lt;br /&gt;
		ret = tostring(construct_year(frame, args))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function create_vcard(id, content, wrap_fn)&lt;br /&gt;
	local span = mw.html.create(&amp;quot;span&amp;quot;)&lt;br /&gt;
		:addClass(&amp;quot;vcard&amp;quot;)&lt;br /&gt;
		:css({&lt;br /&gt;
			[&amp;#039;font-style&amp;#039;] = &amp;#039;italic&amp;#039;&lt;br /&gt;
		})&lt;br /&gt;
		:attr(&amp;quot;id&amp;quot;, id)&lt;br /&gt;
	&lt;br /&gt;
	if wrap_fn then&lt;br /&gt;
		span:tag(&amp;quot;span&amp;quot;)&lt;br /&gt;
			:addClass(&amp;quot;fn&amp;quot;)&lt;br /&gt;
			:wikitext(content)&lt;br /&gt;
	else&lt;br /&gt;
		span:wikitext(content)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return span&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.author(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	local param_name = &amp;quot;author&amp;quot;&lt;br /&gt;
	local prefix = &amp;quot;by&amp;quot;&lt;br /&gt;
	local id = &amp;quot;header_author_text&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local s = &amp;quot;&amp;quot;&lt;br /&gt;
	local atext;&lt;br /&gt;
	&lt;br /&gt;
	local wrap_fn = true&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;override_&amp;quot; .. param_name] then&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
		atext = args[&amp;quot;override_&amp;quot; .. param_name]&lt;br /&gt;
	elseif args[param_name] then&lt;br /&gt;
		if args[&amp;#039;section&amp;#039;] then&lt;br /&gt;
			s = s .. &amp;quot;&amp;amp;#32;&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			s = s .. &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if string.lower(args[param_name]) == &amp;quot;unknown&amp;quot; then&lt;br /&gt;
			atext = &amp;quot;Unknown&amp;quot;&lt;br /&gt;
			wrap_fn = false&lt;br /&gt;
		else&lt;br /&gt;
			atext = &amp;quot;[[Author:&amp;quot; .. args[param_name] .. &amp;quot;|&amp;quot; .. args[param_name] .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
 		&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. prefix .. &amp;quot;&amp;lt;/i&amp;gt;&amp;quot; .. &amp;quot; &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local a_span = create_vcard(id, atext, wrap_fn)&lt;br /&gt;
	return s .. tostring(a_span)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.editor(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	local ed = get_arg_or_override(args, &amp;quot;editor&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- no editors&lt;br /&gt;
	if ed == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local have_authors = get_arg_or_override(args, &amp;quot;author&amp;quot;) ~= nil&lt;br /&gt;
&lt;br /&gt;
	local s = &amp;quot; &amp;quot;&lt;br /&gt;
	if have_authors then&lt;br /&gt;
		s = &amp;quot;, &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not have_authors and not args[&amp;quot;section&amp;quot;] then&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- need to tidy this up and check for override_editor = unknown|not mentioned|?&lt;br /&gt;
	local special&lt;br /&gt;
	if ed == &amp;quot;?&amp;quot; or string.lower(ed) == &amp;quot;unknown&amp;quot; then&lt;br /&gt;
		special = &amp;quot;editor unknown&amp;quot;&lt;br /&gt;
	elseif string.lower(ed) == &amp;quot;not mentioned&amp;quot; then&lt;br /&gt;
		special = &amp;quot;editor not mentioned&amp;quot;&lt;br /&gt;
	elseif ed ~= nil then&lt;br /&gt;
		s = s .. &amp;quot;edited by&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	s = &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. s .. &amp;quot;&amp;lt;/i&amp;gt; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local etext&lt;br /&gt;
	local wrap_fn = true&lt;br /&gt;
	if args[&amp;quot;override_editor&amp;quot;] then&lt;br /&gt;
		etext = args[&amp;quot;override_editor&amp;quot;]&lt;br /&gt;
	elseif args[&amp;quot;editor&amp;quot;] then&lt;br /&gt;
&lt;br /&gt;
		if special then&lt;br /&gt;
			etext = special&lt;br /&gt;
			wrap_fn = false&lt;br /&gt;
		else&lt;br /&gt;
			etext = &amp;quot;[[Author:&amp;quot; .. args[&amp;quot;editor&amp;quot;] .. &amp;quot;|&amp;quot; .. args[&amp;quot;editor&amp;quot;] .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local span = create_vcard(&amp;quot;header_editor_text&amp;quot;, etext, true)&lt;br /&gt;
	return s .. tostring(span)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.translator(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
&lt;br /&gt;
	local tr = get_arg_or_override(args, &amp;quot;translator&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- no translator&lt;br /&gt;
	if tr == nil then&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local have_authors = get_arg_or_override(args, &amp;quot;author&amp;quot;) ~= nil&lt;br /&gt;
	local have_editors = get_arg_or_override(args, &amp;quot;editor&amp;quot;) ~= nil&lt;br /&gt;
&lt;br /&gt;
	local s = &amp;quot; &amp;quot;&lt;br /&gt;
	if have_authors or have_editors then&lt;br /&gt;
		s = &amp;quot;, &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not have_authors and not have_authors and args[&amp;quot;section&amp;quot;] == nil then&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local special&lt;br /&gt;
	if tr == &amp;quot;?&amp;quot; or string.lower(tr) == &amp;quot;unknown&amp;quot; then&lt;br /&gt;
		special = &amp;quot;translator unknown&amp;quot;&lt;br /&gt;
	elseif string.lower(tr) == &amp;quot;not mentioned&amp;quot; then&lt;br /&gt;
		special = &amp;quot;translator not mentioned&amp;quot;&lt;br /&gt;
	elseif string.lower(tr) == &amp;quot;wikisource&amp;quot; then&lt;br /&gt;
		special = &amp;quot;translated by [[Wikisource:Translations|&amp;lt;span id=\&amp;quot;header_translator_text\&amp;quot;&amp;gt;Wikisource&amp;lt;/span&amp;gt;]]&amp;quot;&lt;br /&gt;
	elseif tr ~= nil then&lt;br /&gt;
		s = s .. &amp;quot;translated by&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	s = &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. s .. &amp;quot;&amp;lt;/i&amp;gt; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
	local etext&lt;br /&gt;
	local wrap_fn = true&lt;br /&gt;
	if args[&amp;quot;override_translator&amp;quot;] then&lt;br /&gt;
		etext = args[&amp;quot;override_translator&amp;quot;]&lt;br /&gt;
	elseif args[&amp;quot;translator&amp;quot;] then&lt;br /&gt;
&lt;br /&gt;
		if special then&lt;br /&gt;
			etext = special&lt;br /&gt;
			wrap_fn = false&lt;br /&gt;
		else&lt;br /&gt;
			etext = &amp;quot;[[Author:&amp;quot; .. args[&amp;quot;translator&amp;quot;] .. &amp;quot;|&amp;quot; .. args[&amp;quot;translator&amp;quot;] .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local span = create_vcard(&amp;quot;header_translator_text&amp;quot;, etext, true)&lt;br /&gt;
	return s .. tostring(span)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.section(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	if not args[&amp;quot;section&amp;quot;] then&lt;br /&gt;
		return&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local s = &amp;quot;&amp;lt;br /&amp;gt;&amp;lt;span id=\&amp;quot;header_section_text\&amp;quot;&amp;gt;&amp;quot; .. args[&amp;quot;section&amp;quot;] .. &amp;quot;&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	-- there are synonyms for this&lt;br /&gt;
	local trans = get_arg_or_override(args, &amp;quot;section_translator&amp;quot;)&lt;br /&gt;
	if trans == nil then&lt;br /&gt;
		trans = get_arg_or_override(args, &amp;quot;contributing_translator&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- there are synonyms for this&lt;br /&gt;
	local sec_author = get_arg_or_override(args, &amp;quot;section_author&amp;quot;)&lt;br /&gt;
	if sec_author == nil then&lt;br /&gt;
		sec_author = get_arg_or_override(args, &amp;quot;contributor&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- first part of section_translator, adds a line return to split to two lines due to length if section translator exists	&lt;br /&gt;
	if trans and sec_author then&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if sec_author then&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;i&amp;gt; by &amp;lt;span id=\&amp;quot;header_contributor_text\&amp;quot; class=\&amp;quot;vcard\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;span class=\&amp;quot;fn\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		if args[&amp;quot;override_section_author&amp;quot;] then&lt;br /&gt;
			s = s .. args[&amp;quot;override_section_author&amp;quot;]&lt;br /&gt;
		elseif args[&amp;quot;override_contributor&amp;quot;] then&lt;br /&gt;
			s = s .. args[&amp;quot;override_contributor&amp;quot;]&lt;br /&gt;
		else&lt;br /&gt;
			s = s .. &amp;quot;[[Author:&amp;quot; .. sec_author .. &amp;quot;|&amp;quot; .. sec_author .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if trans then&lt;br /&gt;
		if sec_author then&lt;br /&gt;
			s = s .. &amp;quot;,&amp;quot;	&lt;br /&gt;
		end&lt;br /&gt;
		s = s .. &amp;quot; &amp;lt;i&amp;gt;translated by &amp;lt;span id=\&amp;quot;header_section_translator_text\&amp;quot; class=\&amp;quot;vcard\&amp;quot;&amp;gt;&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		if args[&amp;quot;override_section_translator&amp;quot;] then&lt;br /&gt;
			s = s .. args[&amp;#039;override_section_translator&amp;#039;]&lt;br /&gt;
		else&lt;br /&gt;
			s = s .. &amp;quot;[[Author:&amp;quot; .. trans .. &amp;quot;|&amp;quot; .. trans .. &amp;quot;]]&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		s = s .. &amp;quot;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/i&amp;gt;&amp;quot;		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[=[&lt;br /&gt;
Construct the notes field&lt;br /&gt;
]=]&lt;br /&gt;
function p.notes(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	&lt;br /&gt;
	local notes_args = {&lt;br /&gt;
		style = &amp;quot;border-bottom: 1px solid #A0A0A0; background-color: #FAFAFF;&amp;quot;,&lt;br /&gt;
		id = navigationNotes&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local wdid = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	local sister_args = {&amp;quot;disambiguation&amp;quot;, &amp;quot;edition&amp;quot;, &amp;quot;portal&amp;quot;, &amp;quot;related_author&amp;quot;,&lt;br /&gt;
		&amp;quot;wikipedia&amp;quot;, &amp;quot;commons&amp;quot;, &amp;quot;commonscat&amp;quot;, &amp;quot;wikiquote&amp;quot;, &amp;quot;wikinews&amp;quot;, &lt;br /&gt;
		&amp;quot;wiktionary&amp;quot;, &amp;quot;wikibooks&amp;quot;,  &amp;quot;wikidata&amp;quot;, &amp;quot;wikivoyage&amp;quot;, &lt;br /&gt;
		&amp;quot;wikiversity&amp;quot;, &amp;quot;wikispecies&amp;quot;, &amp;quot;meta&amp;quot;}&lt;br /&gt;
	local sisters = &amp;quot;&amp;quot;&lt;br /&gt;
	if wdid ~= nil or has_any_arg(args, sister_args) then&lt;br /&gt;
		notes_args[&amp;#039;sister&amp;#039;] = (get_plain_sister(frame, args, sister_args))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    -- TODO: Temporarily track pages sisterlinking to Wikilivres.&lt;br /&gt;
    if args[&amp;quot;wikilivres&amp;quot;] ~= nil and args[&amp;quot;wikilivres&amp;quot;] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        table.insert(categories, &amp;quot;Pages using header with sister links to Wikilivres&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	if args[&amp;quot;shortcut&amp;quot;] then&lt;br /&gt;
		notes_args[&amp;#039;shortcut&amp;#039;] = args[&amp;quot;shortcut&amp;quot;]&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if args[&amp;quot;notes&amp;quot;] then&lt;br /&gt;
		notes_args[&amp;#039;content&amp;#039;] = args[&amp;#039;notes&amp;#039;] &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return frame:expandTemplate{title = &amp;quot;header/notes block&amp;quot;, args = notes_args}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Jayprakash12345</name></author>
	</entry>
</feed>