<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.pantonianrepublic.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AClass_mask</id>
	<title>Module:Class mask - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.pantonianrepublic.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AClass_mask"/>
	<link rel="alternate" type="text/html" href="https://wiki.pantonianrepublic.com/index.php?title=Module:Class_mask&amp;action=history"/>
	<updated>2026-04-23T23:44:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.0</generator>
	<entry>
		<id>https://wiki.pantonianrepublic.com/index.php?title=Module:Class_mask&amp;diff=2570&amp;oldid=prev</id>
		<title>Sebbog: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.pantonianrepublic.com/index.php?title=Module:Class_mask&amp;diff=2570&amp;oldid=prev"/>
		<updated>2023-05-22T17:21:31Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en-GB&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:21, 22 May 2023&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wiki:diff::1.12:old-2569:rev-2570 --&gt;
&lt;/table&gt;</summary>
		<author><name>Sebbog</name></author>
	</entry>
	<entry>
		<id>https://wiki.pantonianrepublic.com/index.php?title=Module:Class_mask&amp;diff=2569&amp;oldid=prev</id>
		<title>wikipedia&gt;MSGJ: reorder arguments and add default</title>
		<link rel="alternate" type="text/html" href="https://wiki.pantonianrepublic.com/index.php?title=Module:Class_mask&amp;diff=2569&amp;oldid=prev"/>
		<updated>2023-05-19T11:14:58Z</updated>

		<summary type="html">&lt;p&gt;reorder arguments and add default&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local isarticle = function(class)&lt;br /&gt;
	local nonarticleclasses = {&amp;#039;Template&amp;#039;, &amp;#039;File&amp;#039;, &amp;#039;Category&amp;#039;, &amp;#039;Disambig&amp;#039;, &amp;#039;Redirect&amp;#039;, &amp;#039;Portal&amp;#039;, &amp;#039;Project&amp;#039;, &amp;#039;Draft&amp;#039;, &amp;#039;Book&amp;#039;, &amp;#039;FM&amp;#039;} -- these classes will not be identified as conflicting with NA-class&lt;br /&gt;
	local article = true&lt;br /&gt;
	for _,v in ipairs(nonarticleclasses) do&lt;br /&gt;
		if class==v then -- class matches one of the non-article classes&lt;br /&gt;
			article = false&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return article&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local ucfirst = function(s)&lt;br /&gt;
	-- Returns the given string with the first character in upper case.&lt;br /&gt;
	-- Should not be used with non-ascii strings.&lt;br /&gt;
	return s:sub(1, 1):upper() .. s:sub(2, -1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local isTruthyBParam = function(s)&lt;br /&gt;
	s = s and s:lower()&lt;br /&gt;
	return not s or s == &amp;#039;yes&amp;#039; or s == &amp;#039;y&amp;#039; or s == &amp;#039;1&amp;#039; or s == &amp;#039;pass&amp;#039; or s == &amp;#039;na&amp;#039; or s == &amp;#039;n/a&amp;#039; or s == &amp;#039;¬&amp;#039; or s == &amp;#039;unused&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local resolveFQSgrade = function(grade, args)&lt;br /&gt;
	if (args[grade] or args.FQS) == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		return ucfirst(grade)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;NA&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local resolveExtraGrade = function(grade, args)&lt;br /&gt;
	if args[grade] == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		return ucfirst(grade)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;NA&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local resolveDefaultGrade = function(args, title, talkDefault)&lt;br /&gt;
	if title.subjectPageTitle.isRedirect then&lt;br /&gt;
		return resolveExtraGrade(&amp;#039;redirect&amp;#039;,args)&lt;br /&gt;
	end&lt;br /&gt;
	local ns = title.namespace&lt;br /&gt;
	if ns==1 then -- Talk&lt;br /&gt;
		if require(&amp;#039;Module:Disambiguation&amp;#039;).isDisambiguation(title.subjectPageTitle:getContent()) then&lt;br /&gt;
			return resolveFQSgrade(&amp;#039;disambig&amp;#039;,args)&lt;br /&gt;
		else&lt;br /&gt;
			return talkDefault&lt;br /&gt;
		end&lt;br /&gt;
	elseif ns==7 or ns==711 then -- File talk&lt;br /&gt;
		return resolveFQSgrade(&amp;#039;file&amp;#039;, args)&lt;br /&gt;
	elseif ns==15 then -- Category talk&lt;br /&gt;
		return resolveFQSgrade(&amp;#039;category&amp;#039;, args)&lt;br /&gt;
	elseif ns==101 then -- Portal talk&lt;br /&gt;
		return resolveFQSgrade(&amp;#039;portal&amp;#039;, args)&lt;br /&gt;
	elseif ns==11 or ns==829 then -- Template talk&lt;br /&gt;
		return resolveFQSgrade(&amp;#039;template&amp;#039;, args)&lt;br /&gt;
	elseif ns==5 then -- Wikipedia talk&lt;br /&gt;
		return resolveFQSgrade(&amp;#039;project&amp;#039;, args)&lt;br /&gt;
	elseif ns==119 then -- Draft talk&lt;br /&gt;
		return resolveFQSgrade(&amp;#039;draft&amp;#039;, args)&lt;br /&gt;
	elseif ns==13 then -- Help talk&lt;br /&gt;
		return resolveExtraGrade(&amp;#039;help&amp;#039;, args)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;NA&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local getGrade = function(args, title)&lt;br /&gt;
	local grade = args[1]&lt;br /&gt;
	grade = grade and grade:match(&amp;#039;^%s*(.-)%s*$&amp;#039;):lower()&lt;br /&gt;
	local ret&lt;br /&gt;
&lt;br /&gt;
	if not grade or grade == &amp;#039;¬&amp;#039; then -- undefined&lt;br /&gt;
		ret = &amp;#039;¬&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- Ucfirst&lt;br /&gt;
	elseif grade == &amp;#039;start&amp;#039; or grade == &amp;#039;stub&amp;#039; or grade == &amp;#039;list&amp;#039; then&lt;br /&gt;
		if args[grade] ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
			ret = ucfirst(grade)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	-- B&lt;br /&gt;
	elseif grade == &amp;#039;b&amp;#039; then&lt;br /&gt;
		local bParams = {&amp;#039;b1&amp;#039;, &amp;#039;b2&amp;#039;, &amp;#039;b3&amp;#039;, &amp;#039;b4&amp;#039;, &amp;#039;b5&amp;#039;, &amp;#039;b6&amp;#039;}&lt;br /&gt;
		local isExtended = false&lt;br /&gt;
		for _, param in ipairs(bParams) do&lt;br /&gt;
			if args[param] then&lt;br /&gt;
				isExtended = true&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if isExtended then&lt;br /&gt;
			local isB = true&lt;br /&gt;
			for _, param in ipairs(bParams) do&lt;br /&gt;
				if not isTruthyBParam(args[param]) then&lt;br /&gt;
					isB = false&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			ret = isB and &amp;#039;B&amp;#039; or &amp;#039;C&amp;#039;&lt;br /&gt;
		elseif args.b ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
			ret = &amp;#039;B&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	-- Upper-case&lt;br /&gt;
	elseif grade == &amp;#039;fa&amp;#039; or grade == &amp;#039;fl&amp;#039; or grade == &amp;#039;a&amp;#039; or grade == &amp;#039;ga&amp;#039; or grade == &amp;#039;c&amp;#039; then&lt;br /&gt;
		if args[grade] ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
			ret = grade:upper()&lt;br /&gt;
		end&lt;br /&gt;
	elseif grade == &amp;#039;na&amp;#039; then&lt;br /&gt;
		if args.forceNA == &amp;#039;yes&amp;#039; then&lt;br /&gt;
			ret = resolveDefaultGrade(args, title, &amp;#039;NA&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			ret = &amp;#039;NA&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	elseif grade == &amp;#039;file&amp;#039; or grade == &amp;#039;image&amp;#039; or grade == &amp;#039;img&amp;#039; then&lt;br /&gt;
		ret = resolveFQSgrade(&amp;#039;file&amp;#039;, args)&lt;br /&gt;
	elseif grade == &amp;#039;category&amp;#039; or grade == &amp;#039;cat&amp;#039; or grade == &amp;#039;categ&amp;#039; then&lt;br /&gt;
		ret = resolveFQSgrade(&amp;#039;category&amp;#039;, args)&lt;br /&gt;
	elseif grade == &amp;#039;dab&amp;#039; or grade == &amp;#039;disambig&amp;#039; or grade == &amp;#039;disambiguation&amp;#039; or grade == &amp;#039;disamb&amp;#039; then&lt;br /&gt;
		ret = resolveFQSgrade(&amp;#039;disambig&amp;#039;, args)&lt;br /&gt;
	elseif grade == &amp;#039;redirect&amp;#039; or grade == &amp;#039;red&amp;#039; or grade == &amp;#039;redir&amp;#039; then&lt;br /&gt;
		ret = resolveExtraGrade(&amp;#039;redirect&amp;#039;, args)&lt;br /&gt;
	elseif grade == &amp;#039;help&amp;#039; then&lt;br /&gt;
		ret = resolveExtraGrade(&amp;#039;help&amp;#039;, args)&lt;br /&gt;
	elseif grade == &amp;#039;portal&amp;#039; or grade == &amp;#039;project&amp;#039; or grade == &amp;#039;draft&amp;#039; then&lt;br /&gt;
		ret = resolveFQSgrade(grade, args)&lt;br /&gt;
	elseif grade == &amp;#039;template&amp;#039; or grade == &amp;#039;temp&amp;#039; or grade == &amp;#039;tpl&amp;#039; or grade == &amp;#039;templ&amp;#039; then&lt;br /&gt;
		ret = resolveFQSgrade(&amp;#039;template&amp;#039;, args)&lt;br /&gt;
	elseif grade == &amp;#039;fm&amp;#039; then&lt;br /&gt;
		if args.fm == &amp;#039;yes&amp;#039; then&lt;br /&gt;
			ret = &amp;#039;FM&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			ret = resolveFQSgrade(&amp;#039;file&amp;#039;, args)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		-- Upper-case syntax&lt;br /&gt;
		ret = args[grade:upper()]&lt;br /&gt;
&lt;br /&gt;
		-- Lower-case syntax&lt;br /&gt;
		if not ret then&lt;br /&gt;
			if args[grade:lower()] == &amp;#039;yes&amp;#039; then&lt;br /&gt;
				ret = mw.language.getContentLanguage():ucfirst(grade:lower())&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Defaults&lt;br /&gt;
		if not ret then&lt;br /&gt;
			ret = resolveDefaultGrade(args, title)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._main = function(args, title)&lt;br /&gt;
	title = title or mw.title.getCurrentTitle()&lt;br /&gt;
	local out = &amp;#039;&amp;#039;&lt;br /&gt;
	if title.namespace == 10 and title.subpageText == &amp;#039;class&amp;#039; then&lt;br /&gt;
		out = mw.getCurrentFrame():expandTemplate{title = &amp;#039;Class mask/doc warning&amp;#039;}&lt;br /&gt;
	end&lt;br /&gt;
	out = out .. (getGrade(args, title) or &amp;#039;&amp;#039;)&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame)&lt;br /&gt;
	local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	local args = getArgs(frame,{removeBlanks=false, wrappers=&amp;#039;Template:Class mask&amp;#039;})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local getclass = function(args, title)&lt;br /&gt;
	local class = &amp;#039;¬&amp;#039;&lt;br /&gt;
	if args.QUALITY_SCALE == &amp;#039;inline&amp;#039; then&lt;br /&gt;
		class = args.class&lt;br /&gt;
	elseif args.QUALITY_SCALE == &amp;#039;subpage&amp;#039; then&lt;br /&gt;
		if mw.title.new(args.BANNER_NAME..&amp;#039;/class&amp;#039;).exists then&lt;br /&gt;
			local frame = mw.getCurrentFrame()&lt;br /&gt;
			class = frame:expandTemplate{title = args.BANNER_NAME..&amp;#039;/class&amp;#039;, args = args}&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		args.FQS = (args.QUALITY_SCALE == &amp;#039;extended&amp;#039;) and &amp;#039;yes&amp;#039; or &amp;#039;no&amp;#039;&lt;br /&gt;
		args[1] = args.class&lt;br /&gt;
		class = p._main(args, title)&lt;br /&gt;
	end&lt;br /&gt;
	return class&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.readarticleclass = function(options, page) -- used by p._quality and Module:Banner shell&lt;br /&gt;
	page = page or mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
	local get_parameter_value = require(&amp;quot;Module:Template parameter value&amp;quot;).getValue&lt;br /&gt;
	local WPBSredirects = {&amp;#039;WikiProject banner shell&amp;#039;,&amp;#039;WikiProject banner shell/sandbox&amp;#039;,&amp;#039;Bannershell&amp;#039;,&amp;#039;Multiple wikiprojects&amp;#039;,&amp;#039;Project shell&amp;#039;,&amp;#039;Scope shell&amp;#039;,&amp;#039;WPB&amp;#039;,&amp;#039;WPBS&amp;#039;,&amp;#039;WPBannerShell&amp;#039;,&amp;#039;WP Banner Shell&amp;#039;,&amp;#039;WP banner shell&amp;#039;,&amp;#039;WikiProjectBannerShell&amp;#039;,&amp;#039;WikiProjectBanner Shell&amp;#039;,&amp;#039;WikiProjectBanners&amp;#039;,&amp;#039;WikiProject BannerShell&amp;#039;,&amp;#039;WikiProject Banner Shell&amp;#039;,&amp;#039;WikiProject Banners&amp;#039;,&amp;#039;WikiProject Banners Shell&amp;#039;,&amp;#039;WikiProject Shell&amp;#039;,&amp;#039;WikiProject banner&amp;#039;,&amp;#039;WikiProject banner shell/redirect&amp;#039;,&amp;#039;WikiProject shell&amp;#039;,&amp;#039;WikiprojectBannerShell&amp;#039;,&amp;#039;Wikiproject banner holder&amp;#039;,&amp;#039;Wikiproject banner shell&amp;#039;,&amp;#039;Wikiprojectbanners&amp;#039;,&amp;#039;Wikiprojectbannershell&amp;#039;,&amp;#039;Wpb&amp;#039;,&amp;#039;Wpbannershell&amp;#039;,&amp;#039;Wpbsgclass&amp;#039;}&lt;br /&gt;
	local success, result = get_parameter_value(page, WPBSredirects, &amp;quot;class&amp;quot;, options)&lt;br /&gt;
	return success and result&lt;br /&gt;
	-- returns FALSE if banner shell template does not exist on page&lt;br /&gt;
	-- returns BLANK if class parameter is not defined or is defined blank&lt;br /&gt;
	-- otherwise returns class parameter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p._quality = function(args)&lt;br /&gt;
	local title = args.page and mw.title.new(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
	local local_class = getclass(args, title)&lt;br /&gt;
	local prefix, class = &amp;#039;Y&amp;#039;, local_class&lt;br /&gt;
	if local_class==&amp;#039;¬&amp;#039; then&lt;br /&gt;
		class = &amp;#039;¬&amp;#039;&lt;br /&gt;
	elseif args.QUALITY_CRITERIA ~= &amp;#039;custom&amp;#039; then -- project uses standard scale and will inherit article class if needed&lt;br /&gt;
		local article_class = p.readarticleclass({ignore_subtemplates=true},title.prefixedText)&lt;br /&gt;
		article_class = article_class and p._main({article_class}, title)&lt;br /&gt;
		if article_class then -- banner shell exists&lt;br /&gt;
			if article_class == &amp;#039;&amp;#039; then -- no article class defined&lt;br /&gt;
				if local_class == &amp;#039;&amp;#039; then -- local class also does not exist, check whether any other class parameters are defined inside the shell&lt;br /&gt;
					local classparam = p.readarticleclass({ignore_blank=true, only_subtemplates=true},title.prefixedText)&lt;br /&gt;
					if classparam == &amp;#039;&amp;#039; then -- no class parameters defined, display as globally unassessed&lt;br /&gt;
						prefix = &amp;#039;H&amp;#039; -- hide quality class in project banner&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			elseif local_class == &amp;#039;&amp;#039; or local_class == article_class then -- local class matches article class or is blank&lt;br /&gt;
				prefix = &amp;#039;H&amp;#039; -- hide quality class in project banner&lt;br /&gt;
				class = article_class&lt;br /&gt;
			elseif (article_class == &amp;#039;NA&amp;#039;) and not isarticle(local_class) then -- article class and local class are both non-article classes&lt;br /&gt;
				prefix = &amp;#039;H&amp;#039;&lt;br /&gt;
			else -- article class exists and differs from local class&lt;br /&gt;
				prefix = &amp;#039;X&amp;#039; -- X will indicate to meta banner that classes are different, so trigger a tracking category&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return (args.noprefix and &amp;#039;&amp;#039; or prefix) .. class&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.quality = function(frame) -- used by WPBM to check global quality and compare with local parameter&lt;br /&gt;
	return p._quality(frame.args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;MSGJ</name></author>
	</entry>
</feed>