<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProjectBanner%2FBanner</id>
	<title>Module:WikiProjectBanner/Banner - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProjectBanner%2FBanner"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:WikiProjectBanner/Banner&amp;action=history"/>
	<updated>2026-04-10T06:32:53Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:WikiProjectBanner/Banner&amp;diff=147656&amp;oldid=prev</id>
		<title>imported&gt;Mr. Stradivarius: store grades in the banner data, rather than directly in the banner object</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:WikiProjectBanner/Banner&amp;diff=147656&amp;oldid=prev"/>
		<updated>2014-09-08T06:17:50Z</updated>

		<summary type="html">&lt;p&gt;store grades in the banner data, rather than directly in the banner object&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-------------------------------------------------------------------------------&lt;br /&gt;
--                               Banner class                                --&lt;br /&gt;
-- This module contains the Banner class used in Module:WikiProjectBanner.   --&lt;br /&gt;
-- It is used to generate the banner HTML and categories.                    --&lt;br /&gt;
-------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules.&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local mShared = require(&amp;#039;Module:WikiProjectBanner/shared&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily load modules we might not need.&lt;br /&gt;
local Grade&lt;br /&gt;
&lt;br /&gt;
local Banner = {}&lt;br /&gt;
Banner.__index = Banner&lt;br /&gt;
&lt;br /&gt;
Banner.rowModules = {&lt;br /&gt;
	quality = &amp;#039;Module:WikiProjectBanner/AssessmentRow&amp;#039;,&lt;br /&gt;
	importance = &amp;#039;Module:WikiProjectBanner/AssessmentRow&amp;#039;,&lt;br /&gt;
	taskForces = &amp;#039;Module:WikiProjectBanner/TaskForce&amp;#039;,&lt;br /&gt;
	requests = &amp;#039;Module:WikiProjectBanner/Note&amp;#039;,&lt;br /&gt;
	notices = &amp;#039;Module:WikiProjectBanner/Note&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Define the classes table. This loads modules containing the row classes&lt;br /&gt;
-- on demand; if it is not indexed, the class is not loaded.&lt;br /&gt;
Banner.rowClasses = setmetatable({}, {&lt;br /&gt;
	__index = function (t, key)&lt;br /&gt;
		local module = Banner.rowModules[key]&lt;br /&gt;
		if module then&lt;br /&gt;
			module = require(module)&lt;br /&gt;
			Banner.rowClasses[key] = module&lt;br /&gt;
			return module&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
})&lt;br /&gt;
&lt;br /&gt;
function Banner.new(bannerName, args, cfg, bannerCfg)&lt;br /&gt;
	-- Set data we were passed.&lt;br /&gt;
	local obj, data = {}, {}&lt;br /&gt;
	data.bannerName = bannerName&lt;br /&gt;
	obj.args = args&lt;br /&gt;
	obj.cfg = cfg&lt;br /&gt;
&lt;br /&gt;
	-- Set title objects.&lt;br /&gt;
	data.currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
	data.subjectTitle = data.currentTitle.subjectPageTitle&lt;br /&gt;
&lt;br /&gt;
	-- Set banner config.&lt;br /&gt;
	-- We use a metatable to make it read-only, to try and limit hook&lt;br /&gt;
	-- interaction.&lt;br /&gt;
	bannerCfg = bannerCfg or mShared.maybeRequire(&lt;br /&gt;
		&amp;#039;Module:WikiProjectBanner/banners/&amp;#039; .. data.bannerName&lt;br /&gt;
	)&lt;br /&gt;
	if not bannerCfg then&lt;br /&gt;
		error(&lt;br /&gt;
			&amp;#039;banner data page [[Module:WikiProjectBanner/banners/&amp;#039; ..&lt;br /&gt;
			bannerName ..&lt;br /&gt;
			&amp;#039;]] does not exist&amp;#039;,&lt;br /&gt;
			0&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	bannerCfg.hooks = bannerCfg.hooks or {}&lt;br /&gt;
	obj.bannerCfg = setmetatable({}, {&lt;br /&gt;
		__index = bannerCfg,&lt;br /&gt;
		__newindex = function ()&lt;br /&gt;
			error(&amp;#039;the banner config is read-only&amp;#039;, 2)&lt;br /&gt;
		end,&lt;br /&gt;
		__pairs = function ()&lt;br /&gt;
			return pairs(bannerCfg)&lt;br /&gt;
		end,&lt;br /&gt;
		__ipairs = function ()&lt;br /&gt;
			return ipairs(bannerCfg)&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Set banner data.&lt;br /&gt;
	do&lt;br /&gt;
		-- Find if we are in demo mode.&lt;br /&gt;
		local currentPage = data.currentTitle.prefixedText&lt;br /&gt;
		local template = mw.site.namespaces[10].name .. &amp;#039;:&amp;#039; .. data.bannerName&lt;br /&gt;
		if currentPage == template&lt;br /&gt;
			or currentPage == template .. &amp;#039;/sandbox&amp;#039;&lt;br /&gt;
		then&lt;br /&gt;
			data.isDemo = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data.pageType = require(&amp;#039;Module:Pagetype&amp;#039;)._main{}&lt;br /&gt;
	data.project = bannerCfg.project or bannerName:gsub(&amp;#039;^WikiProject &amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	data.projectLink = bannerCfg.projectLink&lt;br /&gt;
		or &amp;#039;Wikipedia:WikiProject &amp;#039; .. data.project&lt;br /&gt;
	data.projectName = bannerCfg.projectName&lt;br /&gt;
		or &amp;#039;WikiProject &amp;#039; .. data.project&lt;br /&gt;
	data.projectScope = bannerCfg.projectScope or &amp;#039;[[&amp;#039; .. data.project .. &amp;#039;]]&amp;#039;&lt;br /&gt;
	data.projectLinkTalk = mw.title.new(data.projectLink).talkPageTitle.prefixedText&lt;br /&gt;
	data.isSmall = yesno(args.small)&lt;br /&gt;
&lt;br /&gt;
	-- Assessment link&lt;br /&gt;
	if bannerCfg.assessmentLink ~= nil then&lt;br /&gt;
		-- Custom link or false for no link&lt;br /&gt;
		data.assessmentLink = bannerCfg.assessmentLink&lt;br /&gt;
	else&lt;br /&gt;
		local assessmentPage = data.projectLink .. &amp;#039;/Assessment&amp;#039;&lt;br /&gt;
		local assessmentTitle = mw.title.new(assessmentPage)&lt;br /&gt;
		data.assessmentLink = assessmentTitle&lt;br /&gt;
			and assessmentTitle.exists&lt;br /&gt;
			and assessmentTitle.prefixedText&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the HTML fragments.&lt;br /&gt;
	do&lt;br /&gt;
		local fragmentKeys = {&lt;br /&gt;
			&amp;#039;headerName&amp;#039;,&lt;br /&gt;
			&amp;#039;headerRating&amp;#039;,&lt;br /&gt;
			&amp;#039;blurbImageLeft&amp;#039;,&lt;br /&gt;
			&amp;#039;blurbText&amp;#039;,&lt;br /&gt;
			&amp;#039;blurbImageRight&amp;#039;,&lt;br /&gt;
		}&lt;br /&gt;
		local html = {}&lt;br /&gt;
		local create = mw.html.create&lt;br /&gt;
		for _, key in ipairs(fragmentKeys) do&lt;br /&gt;
			html[key] = create()&lt;br /&gt;
		end&lt;br /&gt;
		obj.html = html&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define the rest of the object structure.&lt;br /&gt;
	data.grades = {}&lt;br /&gt;
	obj.data = data&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.rows = {&lt;br /&gt;
		quality = {},&lt;br /&gt;
		importance = {},&lt;br /&gt;
		taskForces = {},&lt;br /&gt;
		requests = {},&lt;br /&gt;
		notices = {}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, Banner)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:addRow(key, isActiveByDefault, rowCfg, ...)&lt;br /&gt;
	-- This function adds one row object to the banner object&amp;#039;s rows subtable.&lt;br /&gt;
	if not key or not Banner.rowModules[key] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;&amp;#039;%s&amp;#039; is not a valid key for Banner:addRow&amp;quot;,&lt;br /&gt;
			key&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	local isActive = isActiveByDefault or mShared.isActiveRow(&lt;br /&gt;
		self.args,&lt;br /&gt;
		self.data,&lt;br /&gt;
		self.cfg,&lt;br /&gt;
		rowCfg&lt;br /&gt;
	)&lt;br /&gt;
	if isActive then&lt;br /&gt;
		-- Create the object and add it to the banner&amp;#039;s rows table.&lt;br /&gt;
		local aClass = Banner.rowClasses[key]&lt;br /&gt;
		local obj = aClass.new(self.args, self.data, self.cfg, rowCfg, ...)&lt;br /&gt;
		table.insert(self.rows[key], obj)&lt;br /&gt;
&lt;br /&gt;
		-- Add the categories to the banner object&amp;#039;s categories table.&lt;br /&gt;
		for i, category in ipairs(obj:exportCategories()) do&lt;br /&gt;
			table.insert(self.categories, category)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:addRows()&lt;br /&gt;
	local bannerCfg = self.bannerCfg&lt;br /&gt;
&lt;br /&gt;
	-- Quality&lt;br /&gt;
	if bannerCfg.quality ~= false then&lt;br /&gt;
		Grade = Grade or require(&amp;#039;Module:WikiProjectBanner/Grade&amp;#039;)&lt;br /&gt;
		local gradeCfg = {}&lt;br /&gt;
		local gradeObj = Grade.new(&lt;br /&gt;
			&amp;#039;quality&amp;#039;,&lt;br /&gt;
			self.args,&lt;br /&gt;
			self.data,&lt;br /&gt;
			self.cfg,&lt;br /&gt;
			gradeCfg&lt;br /&gt;
		)&lt;br /&gt;
		for i, category in ipairs(gradeObj:exportCategories()) do&lt;br /&gt;
			table.insert(self.categories, category)&lt;br /&gt;
		end&lt;br /&gt;
		local rowCfg = bannerCfg.quality or {}&lt;br /&gt;
		self:addRow(&amp;#039;quality&amp;#039;, true, rowCfg, gradeObj)&lt;br /&gt;
		self.data.grades.quality = gradeObj&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Importance&lt;br /&gt;
	if bannerCfg.importance ~= false then&lt;br /&gt;
		Grade = Grade or require(&amp;#039;Module:WikiProjectBanner/Grade&amp;#039;)&lt;br /&gt;
		local gradeCfg = {}&lt;br /&gt;
		local qualityGrade = self.data.grades.quality&lt;br /&gt;
		if qualityGrade then&lt;br /&gt;
			gradeCfg.forceGrade = qualityGrade:exportData().forceImportance&lt;br /&gt;
		end&lt;br /&gt;
		local gradeObj = Grade.new(&lt;br /&gt;
			&amp;#039;importance&amp;#039;,&lt;br /&gt;
			self.args,&lt;br /&gt;
			self.data,&lt;br /&gt;
			self.cfg,&lt;br /&gt;
			gradeCfg&lt;br /&gt;
		)&lt;br /&gt;
		for i, category in ipairs(gradeObj:exportCategories()) do&lt;br /&gt;
			table.insert(self.categories, category)&lt;br /&gt;
		end&lt;br /&gt;
		local rowCfg = bannerCfg.importance or {}&lt;br /&gt;
		if gradeObj:exportData().short ~= &amp;#039;NA&amp;#039; then&lt;br /&gt;
			self:addRow(&amp;#039;importance&amp;#039;, true, rowCfg, gradeObj)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Task forces, requests, and notices&lt;br /&gt;
	for i, key in ipairs{&amp;#039;taskForces&amp;#039;, &amp;#039;requests&amp;#039;, &amp;#039;notices&amp;#039;} do&lt;br /&gt;
		for j, rowCfg in ipairs(bannerCfg[key] or {}) do&lt;br /&gt;
			self:addRow(key, false, rowCfg)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Count the requests and notices.&lt;br /&gt;
	local nNotes = #self.rows.requests + #self.rows.notices&lt;br /&gt;
	if nNotes &amp;gt; (bannerCfg.collapsed or self.cfg.collapsed or 3) then&lt;br /&gt;
		self.data.isCollapsed = true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:callHook(key)&lt;br /&gt;
	local hookFunc = self.bannerCfg.hooks[key]&lt;br /&gt;
	if type(hookFunc) == &amp;#039;function&amp;#039; then&lt;br /&gt;
		return hookFunc{&lt;br /&gt;
			categories = self.categories,&lt;br /&gt;
			data = self.data,&lt;br /&gt;
			args = self.args,&lt;br /&gt;
			cfg = self.cfg,&lt;br /&gt;
			bannerCfg = self.bannerCfg&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function Banner:renderBlurb()&lt;br /&gt;
	self:renderImage(&amp;#039;Left&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.bannerCfg.portal and not self.data.isSmall then&lt;br /&gt;
		local portal = mShared.makePortal(self.bannerCfg.portal)&lt;br /&gt;
		self.html.blurbText:wikitext(portal)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	self:renderBlurbText()&lt;br /&gt;
	self:renderImage(&amp;#039;Right&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:renderImage(position)&lt;br /&gt;
	-- Valid positions are &amp;quot;Left&amp;quot; and &amp;quot;Right&amp;quot;. They must be capitalised.&lt;br /&gt;
	local filename = self.bannerCfg[&amp;#039;image&amp;#039; .. position]&lt;br /&gt;
	if filename then&lt;br /&gt;
		local size = self.data.isSmall&lt;br /&gt;
			and (self.bannerCfg[&amp;#039;image&amp;#039; .. position .. &amp;#039;Small&amp;#039;] or &amp;quot;40px&amp;quot;)&lt;br /&gt;
			or (self.bannerCfg[&amp;#039;image&amp;#039; .. position .. &amp;#039;Large&amp;#039;] or &amp;quot;80px&amp;quot;)&lt;br /&gt;
		local fileLink = string.format(&amp;#039;[[File:%s|%s]]&amp;#039;, filename, size)&lt;br /&gt;
		self.html[&amp;#039;blurbImage&amp;#039; .. position]:wikitext(fileLink)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:renderBlurbText()&lt;br /&gt;
	local blurbText = self:callHook(&amp;#039;blurb&amp;#039;) or self.bannerCfg.blurb&lt;br /&gt;
	if blurbText then&lt;br /&gt;
		self.html.blurbText:wikitext(blurbText)&lt;br /&gt;
	else&lt;br /&gt;
		local data = self.data&lt;br /&gt;
		local msg&lt;br /&gt;
		if data.isSmall then&lt;br /&gt;
			msg = &amp;quot;This $5 is within the scope of &amp;#039;&amp;#039;&amp;#039;[[$2|$1]]&amp;#039;&amp;#039;&amp;#039;, a collaborative effort &amp;quot; ..&lt;br /&gt;
				&amp;quot;to improve the coverage of $3 on Wikipedia.&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			msg = &amp;quot;This $5 is within the scope of &amp;#039;&amp;#039;&amp;#039;[[$2|$1]]&amp;#039;&amp;#039;&amp;#039;, a collaborative effort &amp;quot; ..&lt;br /&gt;
				&amp;quot;to improve the coverage of $3 on Wikipedia. If you would like to participate, &amp;quot; ..&lt;br /&gt;
				&amp;quot;please visit the project page, where you can join the [[$4|discussion]] and &amp;quot; ..&lt;br /&gt;
				&amp;quot;see a list of open tasks.&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		msg = mShared.substituteParams(&lt;br /&gt;
			msg,&lt;br /&gt;
			data.projectName,&lt;br /&gt;
			data.projectLink,&lt;br /&gt;
			data.projectScope,&lt;br /&gt;
			data.projectLinkTalk,&lt;br /&gt;
			data.pageType&lt;br /&gt;
		)&lt;br /&gt;
		self.html.blurbText:wikitext(msg)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:getRowHtml(rowType)&lt;br /&gt;
	-- Render the rows.&lt;br /&gt;
	local rowHtml = mw.html.create()&lt;br /&gt;
	for i, obj in ipairs(self.rows[rowType] or {}) do&lt;br /&gt;
		rowHtml:node(obj:exportHtml())&lt;br /&gt;
	end&lt;br /&gt;
	return rowHtml&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:renderCategories()&lt;br /&gt;
	local sortKey = self.args.listas&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	if yesno(self.args.category) ~= false then&lt;br /&gt;
		local categoryNsText = mw.site.namespaces[14].name&lt;br /&gt;
		for _, category in ipairs(self.categories) do&lt;br /&gt;
			if sortKey then&lt;br /&gt;
				ret[#ret + 1] = string.format(&lt;br /&gt;
					&amp;#039;[[%s:%s|%s]]&amp;#039;,&lt;br /&gt;
					categoryNsText,&lt;br /&gt;
					category,&lt;br /&gt;
					sortKey&lt;br /&gt;
				)&lt;br /&gt;
			else&lt;br /&gt;
				ret[#ret + 1] = string.format(&lt;br /&gt;
					&amp;#039;[[%s:%s]]&amp;#039;,&lt;br /&gt;
					categoryNsText,&lt;br /&gt;
					category&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:bindHtmlFragments()&lt;br /&gt;
	local html = self.html&lt;br /&gt;
&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	local wrapper = root&lt;br /&gt;
		:node(self:callHook(&amp;#039;preWrapper&amp;#039;))&lt;br /&gt;
		:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;tmbox tmbox-notice collapsible innercollapse wpb&amp;#039;)&lt;br /&gt;
			:addClass(self.data.isSmall and &amp;#039;mbox-small&amp;#039; or nil)&lt;br /&gt;
&lt;br /&gt;
	wrapper&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;wpb-header&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;right&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding&amp;#039;, &amp;#039;0.3em 1em 0.3em 0.3em&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;50%&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;font-weight&amp;#039;, &amp;#039;bold&amp;#039;)&lt;br /&gt;
				:node(self:callHook(&amp;#039;headerName&amp;#039;))&lt;br /&gt;
				:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;50%&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding&amp;#039;, &amp;#039;0.3em 0.3em 0.3em 0&amp;#039;)&lt;br /&gt;
				:node(self:callHook(&amp;#039;headerRating&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
	local content = wrapper&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding&amp;#039;, &amp;#039;3px 0 3px 5px&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;background&amp;#039;, &amp;#039;transparent&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;border&amp;#039;, &amp;#039;none&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;padding&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
					:attr(&amp;#039;cellspacing&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	content&lt;br /&gt;
		:node(self:callHook(&amp;#039;preBlurb&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
	local blurbRow = content:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- blurb image left&lt;br /&gt;
	if self.bannerCfg.imageLeft then&lt;br /&gt;
		blurbRow:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-image&amp;#039;)&lt;br /&gt;
			:node(html.blurbImageLeft)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- blurb text&lt;br /&gt;
	do&lt;br /&gt;
		local colspan = (self.bannerCfg.imageLeft and 1 or 0) +&lt;br /&gt;
			(self.bannerCfg.imageRight and 1 or 0) + &lt;br /&gt;
			1&lt;br /&gt;
		colspan = colspan &amp;gt; 1 and colspan or nil&lt;br /&gt;
		blurbRow:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, colspan)&lt;br /&gt;
			:node(html.blurbText)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- blurb image right&lt;br /&gt;
	if self.bannerCfg.imageRight then&lt;br /&gt;
		blurbRow:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-imageright&amp;#039;)&lt;br /&gt;
			:node(html.blurbImageRight)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	content&lt;br /&gt;
		:node(self:callHook(&amp;#039;postBlurb&amp;#039;))&lt;br /&gt;
		:node(self:getRowHtml(&amp;#039;quality&amp;#039;))&lt;br /&gt;
		:node(self:callHook(&amp;#039;postQuality&amp;#039;))&lt;br /&gt;
		:node(self:getRowHtml(&amp;#039;importance&amp;#039;))&lt;br /&gt;
		:node(self:callHook(&amp;#039;postImportance&amp;#039;))&lt;br /&gt;
		:node(self:getRowHtml(&amp;#039;taskForces&amp;#039;))&lt;br /&gt;
		:node(self:callHook(&amp;#039;postTaskForces&amp;#039;))&lt;br /&gt;
	&lt;br /&gt;
	if self.data.isCollapsed then&lt;br /&gt;
		-- We are collapsing requests and notices, so define the collapsible&lt;br /&gt;
		-- table and add the requests and notices to it.&lt;br /&gt;
		content&lt;br /&gt;
			:tag(&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;3&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;padding&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
					:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
						:addClass(&amp;#039;collapsible collapsed&amp;#039;)&lt;br /&gt;
						:css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
						:css(&amp;#039;background&amp;#039;, &amp;#039;transparent&amp;#039;)&lt;br /&gt;
						:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
							:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
								:attr(&amp;#039;colspan&amp;#039;, &amp;#039;3&amp;#039;)&lt;br /&gt;
								:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
								:css(&amp;#039;padding&amp;#039;, &amp;#039;0.2em 2px 0.2em 0&amp;#039;)&lt;br /&gt;
								:wikitext(&lt;br /&gt;
									self.bannerCfg.moreHeader&lt;br /&gt;
										or &amp;#039;More information&amp;#039;&lt;br /&gt;
								)&lt;br /&gt;
								:done()&lt;br /&gt;
							:done()&lt;br /&gt;
						:node(self:callHook(&amp;#039;preCollapsedContent&amp;#039;))&lt;br /&gt;
						:node(self:getRowHtml(&amp;#039;requests&amp;#039;))&lt;br /&gt;
						:node(self:callHook(&amp;#039;postRequests&amp;#039;))&lt;br /&gt;
						:node(self:getRowHtml(&amp;#039;notices&amp;#039;))&lt;br /&gt;
						:node(self:callHook(&amp;#039;postNotices&amp;#039;))&lt;br /&gt;
	else&lt;br /&gt;
		-- We aren&amp;#039;t collapsing requests and notices, so add them to the normal&lt;br /&gt;
		-- content node.&lt;br /&gt;
		content&lt;br /&gt;
			:node(self:getRowHtml(&amp;#039;requests&amp;#039;))&lt;br /&gt;
			:node(self:callHook(&amp;#039;postRequests&amp;#039;))&lt;br /&gt;
			:node(self:getRowHtml(&amp;#039;notices&amp;#039;))&lt;br /&gt;
			:node(self:callHook(&amp;#039;postNotices&amp;#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	content&lt;br /&gt;
		:node(self:callHook(&amp;#039;postContent&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
	root&lt;br /&gt;
		:wikitext(self:renderCategories())&lt;br /&gt;
		:node(self:callHook(&amp;#039;postWrapper&amp;#039;))&lt;br /&gt;
&lt;br /&gt;
	html.root = root&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Banner:__tostring()&lt;br /&gt;
	self:addRows()&lt;br /&gt;
	self:callHook()&lt;br /&gt;
	self:renderBlurb()&lt;br /&gt;
	self:bindHtmlFragments()&lt;br /&gt;
	local root = self.html.root or mw.html.create()&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return Banner&lt;/div&gt;</summary>
		<author><name>imported&gt;Mr. Stradivarius</name></author>
	</entry>
</feed>