<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.badwolfmc.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ABanner_shell</id>
	<title>Module:Banner shell - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.badwolfmc.com/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ABanner_shell"/>
	<link rel="alternate" type="text/html" href="https://wiki.badwolfmc.com/w/index.php?title=Module:Banner_shell&amp;action=history"/>
	<updated>2026-05-07T17:28:09Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.badwolfmc.com/w/index.php?title=Module:Banner_shell&amp;diff=5849&amp;oldid=prev</id>
		<title>Merc: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://wiki.badwolfmc.com/w/index.php?title=Module:Banner_shell&amp;diff=5849&amp;oldid=prev"/>
		<updated>2025-05-04T08:33:12Z</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;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 08:33, 4 May 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Merc</name></author>
	</entry>
	<entry>
		<id>https://wiki.badwolfmc.com/w/index.php?title=Module:Banner_shell&amp;diff=5848&amp;oldid=prev</id>
		<title>wikipedia&gt;Aidan9382: You  seem to have toggled sandbox mode there</title>
		<link rel="alternate" type="text/html" href="https://wiki.badwolfmc.com/w/index.php?title=Module:Banner_shell&amp;diff=5848&amp;oldid=prev"/>
		<updated>2025-01-18T16:25:02Z</updated>

		<summary type="html">&lt;p&gt;You&lt;a href=&quot;/w/index.php?title=User:Timrollpickering&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:Timrollpickering (page does not exist)&quot;&gt; &lt;/a&gt; seem to have toggled sandbox mode there&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local sandbox-- = &amp;#039;/sandbox&amp;#039; -- BE SURE TO COMMENT OUT this definition when deploying to live&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local shell = function(frame, header, content, collapsed, class)&lt;br /&gt;
	local styles = frame:extensionTag(&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src = &amp;#039;Module:Message box/tmbox.css&amp;#039;})&lt;br /&gt;
		.. frame:extensionTag(&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src = &amp;#039;Module:Banner shell&amp;#039; .. (sandbox or &amp;#039;&amp;#039;) .. &amp;#039;/styles.css&amp;#039;})&lt;br /&gt;
	local content_row&lt;br /&gt;
	if content then&lt;br /&gt;
		content_row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;banner-shell-inner&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;outercollapse&amp;#039;)&lt;br /&gt;
			:wikitext(content)&lt;br /&gt;
			:done()&lt;br /&gt;
	end&lt;br /&gt;
	local holder = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;role&amp;#039;, &amp;#039;presentation&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;tmbox&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;tmbox-notice&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;banner-shell&amp;#039;)&lt;br /&gt;
		:addClass(class) -- allow additional class to be specified&lt;br /&gt;
		:addClass(content and &amp;#039;mw-collapsible&amp;#039; or nil)&lt;br /&gt;
		:addClass(collapsed and &amp;#039;mw-collapsed&amp;#039; or nil)&lt;br /&gt;
		:node(header)&lt;br /&gt;
		:node(content_row)&lt;br /&gt;
	return styles .. tostring(holder)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.banner_holder = function(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {wrappers = {&amp;#039;Template:Banner holder&amp;#039;}})&lt;br /&gt;
	local image = &amp;#039;[[File:&amp;#039; .. (args.image or &amp;#039;NewFavicon icon.svg&amp;#039;)&lt;br /&gt;
		.. &amp;#039;|&amp;#039; .. (args.size or &amp;#039;24&amp;#039;) .. &amp;#039;px&amp;#039;&lt;br /&gt;
		.. &amp;#039;|link=&amp;#039; .. (args.image_link or &amp;#039;&amp;#039;)&lt;br /&gt;
		.. &amp;#039;|alt=&amp;#039; .. (args.alt or &amp;#039;&amp;#039;) .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	local image_cell = mw.html.create(&amp;#039;td&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;mbox-image&amp;#039;)&lt;br /&gt;
		:wikitext(image)&lt;br /&gt;
	local text_cell = mw.html.create(&amp;#039;td&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;banner-shell-header&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;nowrap&amp;#039;)&lt;br /&gt;
		:css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
		:wikitext(string.rep(&amp;#039;&amp;amp;nbsp;&amp;#039;, 10))&lt;br /&gt;
		:done()&lt;br /&gt;
		:wikitext(args.text or &amp;#039;Other talk page banners&amp;#039;)&lt;br /&gt;
	local header = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:node(image_cell)&lt;br /&gt;
		:node(text_cell)&lt;br /&gt;
	return shell(frame, header, args[1], yesno(args.collapsed))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local DuplicateBanners = function(text)&lt;br /&gt;
	local capture = &amp;#039;&amp;lt;span class=&amp;quot;wpb%-project&amp;quot;&amp;gt;([^&amp;lt;&amp;gt;]*)&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	local banners = {}&lt;br /&gt;
	for project in text:gmatch(capture) do&lt;br /&gt;
		if banners[project] == true then&lt;br /&gt;
			return project&lt;br /&gt;
		end&lt;br /&gt;
		banners[project] = true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.banner_shell = function(frame)&lt;br /&gt;
	local cfg = mw.loadData(&amp;#039;Module:Banner shell/config&amp;#039; .. (sandbox or &amp;#039;&amp;#039;))&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {wrappers = {cfg.template}})&lt;br /&gt;
	local title = args.demo_page and mw.title.new(args.demo_page) or mw.title.getCurrentTitle()&lt;br /&gt;
	local pagetype = require(&amp;#039;Module:Pagetype&amp;#039;)._main{&lt;br /&gt;
		page = title.prefixedText,&lt;br /&gt;
		dab = cfg.page_types.dab,&lt;br /&gt;
		sia = &amp;#039;set index article&amp;#039;,&lt;br /&gt;
		soft_redirect = cfg.page_types.soft_redirect,&lt;br /&gt;
		nonexistent = cfg.page_types.nonexistent,&lt;br /&gt;
		timedtext = cfg.page_types.timedtext,&lt;br /&gt;
		defaultns = &amp;#039;extended&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local lang = mw.language.getContentLanguage()&lt;br /&gt;
	local classmask = require(&amp;#039;Module:WikiProject banner&amp;#039; .. (sandbox or &amp;#039;&amp;#039;)).class_mask&lt;br /&gt;
	local class = classmask(args.class or &amp;#039;&amp;#039;, title.talkPageTitle, false, pagetype)&lt;br /&gt;
	local demo = not yesno(args.category or true, true) or args.demo_page&lt;br /&gt;
	local out = {}&lt;br /&gt;
	local addCategory = function(category, sort_key)&lt;br /&gt;
		if not demo and title.isTalkPage then&lt;br /&gt;
			local category_title = mw.title.new(&amp;#039;Category:&amp;#039; .. category)&lt;br /&gt;
			table.insert(out, &amp;#039;[[&amp;#039; .. category_title.prefixedText .. (sort_key and (&amp;#039;|&amp;#039; .. sort_key) or &amp;#039;&amp;#039;) .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if demo and not args.demo_page then&lt;br /&gt;
		pagetype = &amp;#039;article&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local blp = args.blp and args.blp:lower()&lt;br /&gt;
	if yesno(blp) or blp==&amp;#039;activepol&amp;#039; or yesno(args.living) then&lt;br /&gt;
		table.insert(out, frame:expandTemplate{&lt;br /&gt;
			title = cfg.blp_template.blp,&lt;br /&gt;
			args = {activepol = blp==&amp;#039;activepol&amp;#039; and &amp;#039;yes&amp;#039;}&lt;br /&gt;
		})&lt;br /&gt;
	elseif blp==&amp;#039;other&amp;#039; then&lt;br /&gt;
		table.insert(out, frame:expandTemplate{&lt;br /&gt;
			title = cfg.blp_template.blpo}&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	local vital&lt;br /&gt;
	if yesno(args.vital) then&lt;br /&gt;
		local page = mw.ustring.upper(mw.ustring.sub(title.subjectPageTitle.text, 1, 1)) -- get first letter of article name&lt;br /&gt;
		local codepoint = mw.ustring.codepoint(page, 1, 1)&lt;br /&gt;
		if codepoint&amp;lt;65 or codepoint&amp;gt;90 then --first letter is not between A-Z&lt;br /&gt;
			page = &amp;#039;others&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		local data_page = mw.title.new(&amp;#039;Wikipedia:Vital articles/data/&amp;#039; .. page .. &amp;#039;.json&amp;#039;)&lt;br /&gt;
		if data_page.exists then&lt;br /&gt;
			local index = title.subjectPageTitle.text&lt;br /&gt;
			index = tostring(tonumber(index))==index and tonumber(index) or index --convert to number if page is numerical, otherwise loadJsonData does not work&lt;br /&gt;
			local data = mw.loadJsonData(data_page.fullText)[index]&lt;br /&gt;
			if data then&lt;br /&gt;
				local level = data.level and tostring(data.level)&lt;br /&gt;
				if level and data.topic then&lt;br /&gt;
					local link = &amp;#039;Wikipedia:Vital articles/Level/&amp;#039; .. level&lt;br /&gt;
					if (level==&amp;#039;4&amp;#039; or level==&amp;#039;5&amp;#039;) then&lt;br /&gt;
						link = link .. &amp;#039;/&amp;#039; .. data.topic&lt;br /&gt;
					end&lt;br /&gt;
					if data.sublist then&lt;br /&gt;
						link = link .. &amp;#039;/&amp;#039; .. data.sublist&lt;br /&gt;
					end&lt;br /&gt;
					if data.section then&lt;br /&gt;
						link = link .. &amp;#039;#&amp;#039; .. data.section&lt;br /&gt;
					end&lt;br /&gt;
					if not mw.title.new(link).exists then -- add tracking category if link does not exist&lt;br /&gt;
						addCategory(cfg.vital.attention, &amp;#039;L&amp;#039;)&lt;br /&gt;
					end&lt;br /&gt;
					vital = cfg.vital.with_level:format(link, level)&lt;br /&gt;
				else&lt;br /&gt;
					vital = cfg.vital.without_level&lt;br /&gt;
				end&lt;br /&gt;
				for _, cat in ipairs(cfg.vital.categories) do&lt;br /&gt;
					if cat:find(&amp;#039;_CLASS&amp;#039;) and (class==&amp;#039;NA&amp;#039; or class==&amp;#039;&amp;#039;) then&lt;br /&gt;
						addCategory(cfg.vital.attention, class==&amp;#039;NA&amp;#039; and &amp;#039;N&amp;#039; or &amp;#039;U&amp;#039;)&lt;br /&gt;
					elseif level==nil then&lt;br /&gt;
						addCategory(cfg.vital.attention, &amp;#039;V&amp;#039;)&lt;br /&gt;
					elseif data.topic==nil then&lt;br /&gt;
						addCategory(cfg.vital.attention, &amp;#039;T&amp;#039;)&lt;br /&gt;
					else&lt;br /&gt;
						local category = cat&lt;br /&gt;
							:gsub(&amp;#039;_CLASS&amp;#039;, class .. &amp;#039;-Class&amp;#039;)&lt;br /&gt;
							:gsub(&amp;#039;_LEVEL&amp;#039;, level)&lt;br /&gt;
							:gsub(&amp;#039;_TOPIC&amp;#039;, data.topic)&lt;br /&gt;
						addCategory(category)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				addCategory(cfg.vital.all)&lt;br /&gt;
			else&lt;br /&gt;
				addCategory(cfg.vital.not_listed)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local text, icon_image, icon_str&lt;br /&gt;
	if class==&amp;#039;NA&amp;#039; then&lt;br /&gt;
		icon_image = cfg.icons.type[pagetype] or cfg.icons.default&lt;br /&gt;
		icon_str = pagetype==&amp;#039;page&amp;#039; and &amp;#039;Non-article page&amp;#039; or lang:ucfirst(pagetype)&lt;br /&gt;
		text = {cfg.rating.not_required:format(vital or pagetype)}&lt;br /&gt;
		if args.class then&lt;br /&gt;
			addCategory(cfg.tracking.redundant_class)&lt;br /&gt;
		end&lt;br /&gt;
	elseif class==&amp;#039;&amp;#039; then&lt;br /&gt;
		icon_image = cfg.icons.unassessed&lt;br /&gt;
		icon_str =  &amp;#039;Unassessed article&amp;#039;&lt;br /&gt;
		text = {cfg.rating.not_yet:format(vital or pagetype)}&lt;br /&gt;
		addCategory(&amp;#039;All unassessed articles&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		icon_image = cfg.icons.quality[class] or cfg.icons.unassessed&lt;br /&gt;
		icon_str =  class .. &amp;#039;-Class &amp;#039; .. pagetype&lt;br /&gt;
		text = {cfg.rating.rated:format(vital or pagetype, class)}&lt;br /&gt;
	end&lt;br /&gt;
	local icon = string.format(&amp;#039;[[File:%s|%s|35px|class=noviewer|alt=]]&amp;#039;, icon_image, icon_str)&lt;br /&gt;
	table.insert(text, &amp;#039; &amp;#039; .. cfg.rating.scale)&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		table.insert(text, &amp;#039;&amp;lt;br&amp;gt;&amp;#039; .. cfg.project.interest .. &amp;#039; &amp;#039;)&lt;br /&gt;
		table.insert(text, yesno(args.collapsed) and cfg.project.collapsed or cfg.project.uncollapsed)&lt;br /&gt;
		local duplicate_cat = DuplicateBanners(args[1])&lt;br /&gt;
		if duplicate_cat and title.isTalkPage then&lt;br /&gt;
			addCategory(cfg.tracking.duplicate, duplicate_cat)&lt;br /&gt;
		end&lt;br /&gt;
	elseif not yesno(args.vital) and class~=&amp;#039;&amp;#039; then -- if no projects and not vital and assessed then add class super category&lt;br /&gt;
		if class == &amp;#039;NA&amp;#039; then&lt;br /&gt;
			addCategory(&amp;#039;NA-Class pages&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			addCategory(class .. &amp;#039;-Class articles&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local header = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;assess&amp;#039;)&lt;br /&gt;
			:wikitext(icon)&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;banner-shell-header&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;font-weight&amp;#039;, &amp;#039;normal&amp;#039;)&lt;br /&gt;
			:wikitext(table.concat(text))&lt;br /&gt;
			:done()&lt;br /&gt;
	table.insert(&lt;br /&gt;
		out,&lt;br /&gt;
		shell(frame, header, args[1], yesno(args.collapsed), &amp;#039;wpbs&amp;#039;)&lt;br /&gt;
	)&lt;br /&gt;
	if args.listas then&lt;br /&gt;
		table.insert(out, frame:preprocess(&amp;#039;{{DEFAULTSORT:&amp;#039; .. args.listas .. &amp;#039;}}&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
	if not demo then&lt;br /&gt;
		local tracking = require(&amp;#039;Module:Check for unknown parameters&amp;#039;)._check({&lt;br /&gt;
			unknown = cfg.tracking.unknown,&lt;br /&gt;
			preview = cfg.tracking.preview,&lt;br /&gt;
			&amp;#039;1&amp;#039;, &amp;#039;blp&amp;#039;, &amp;#039;category&amp;#039;, &amp;#039;class&amp;#039;, &amp;#039;collapsed&amp;#039;, &amp;#039;demo_page&amp;#039;, &amp;#039;listas&amp;#039;, &amp;#039;vital&amp;#039;&lt;br /&gt;
		}, frame:getParent().args)&lt;br /&gt;
		table.insert(out, tracking)&lt;br /&gt;
		if args.category and yesno(args.category)~=false then -- category should not be &amp;quot;yes&amp;quot;&lt;br /&gt;
			addCategory(cfg.tracking.invalid, &amp;#039;category&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if args.collapsed and yesno(args.collapsed)~=true then -- collapsed should not be &amp;quot;no&amp;quot;&lt;br /&gt;
			addCategory(cfg.tracking.invalid, &amp;#039;collapsed&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if yesno(blp)==nil and blp~=nil and blp~=&amp;#039;other&amp;#039; and blp~=&amp;#039;activepol&amp;#039; then&lt;br /&gt;
			addCategory(cfg.tracking.invalid, &amp;#039;blp&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if pagetype==&amp;#039;article&amp;#039; and args.class and class==&amp;#039;&amp;#039; then -- find pages with invalid class parameter&lt;br /&gt;
			addCategory(cfg.tracking.invalid, &amp;#039;Zclass&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(out)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;Aidan9382</name></author>
	</entry>
</feed>