<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/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://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AWikiProjectBanner%2FBanner"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:WikiProjectBanner/Banner&amp;action=history"/>
	<updated>2026-06-19T03:16:24Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:WikiProjectBanner/Banner&amp;diff=480025&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:WikiProjectBanner/Banner&amp;diff=480025&amp;oldid=prev"/>
		<updated>2021-07-16T07:58:17Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&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('Module:Yesno')&lt;br /&gt;
local mShared = require('Module:WikiProjectBanner/shared')&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 = 'Module:WikiProjectBanner/AssessmentRow',&lt;br /&gt;
	importance = 'Module:WikiProjectBanner/AssessmentRow',&lt;br /&gt;
	taskForces = 'Module:WikiProjectBanner/TaskForce',&lt;br /&gt;
	requests = 'Module:WikiProjectBanner/Note',&lt;br /&gt;
	notices = 'Module:WikiProjectBanner/Note'&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;
		'Module:WikiProjectBanner/banners/' .. data.bannerName&lt;br /&gt;
	)&lt;br /&gt;
	if not bannerCfg then&lt;br /&gt;
		error(&lt;br /&gt;
			'banner data page [[Module:WikiProjectBanner/banners/' ..&lt;br /&gt;
			bannerName ..&lt;br /&gt;
			']] does not exist',&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('the banner config is read-only', 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 .. ':' .. data.bannerName&lt;br /&gt;
		if currentPage == template&lt;br /&gt;
			or currentPage == template .. '/sandbox'&lt;br /&gt;
		then&lt;br /&gt;
			data.isDemo = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data.pageType = require('Module:Pagetype')._main{}&lt;br /&gt;
	data.project = bannerCfg.project or bannerName:gsub('^WikiProject ', '')&lt;br /&gt;
	data.projectLink = bannerCfg.projectLink&lt;br /&gt;
		or 'Wikipedia:WikiProject ' .. data.project&lt;br /&gt;
	data.projectName = bannerCfg.projectName&lt;br /&gt;
		or 'WikiProject ' .. data.project&lt;br /&gt;
	data.projectScope = bannerCfg.projectScope or '[[' .. data.project .. ']]'&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 .. '/Assessment'&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;
			'headerName',&lt;br /&gt;
			'headerRating',&lt;br /&gt;
			'blurbImageLeft',&lt;br /&gt;
			'blurbText',&lt;br /&gt;
			'blurbImageRight',&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'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;'%s' 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'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'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('Module:WikiProjectBanner/Grade')&lt;br /&gt;
		local gradeCfg = {}&lt;br /&gt;
		local gradeObj = Grade.new(&lt;br /&gt;
			'quality',&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('quality', 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('Module:WikiProjectBanner/Grade')&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;
			'importance',&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 ~= 'NA' then&lt;br /&gt;
			self:addRow('importance', 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{'taskForces', 'requests', 'notices'} 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) == 'function' 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('Left')&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('Right')&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['image' .. position]&lt;br /&gt;
	if filename then&lt;br /&gt;
		local size = self.data.isSmall&lt;br /&gt;
			and (self.bannerCfg['image' .. position .. 'Small'] or &amp;quot;40px&amp;quot;)&lt;br /&gt;
			or (self.bannerCfg['image' .. position .. 'Large'] or &amp;quot;80px&amp;quot;)&lt;br /&gt;
		local fileLink = string.format('[[File:%s|%s]]', filename, size)&lt;br /&gt;
		self.html['blurbImage' .. 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('blurb') 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 '''[[$2|$1]]''', 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 '''[[$2|$1]]''', 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;
					'[[%s:%s|%s]]',&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;
					'[[%s:%s]]',&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('preWrapper'))&lt;br /&gt;
		:tag('table')&lt;br /&gt;
			:addClass('tmbox tmbox-notice collapsible innercollapse wpb')&lt;br /&gt;
			:addClass(self.data.isSmall and 'mbox-small' or nil)&lt;br /&gt;
&lt;br /&gt;
	wrapper&lt;br /&gt;
		:tag('tr')&lt;br /&gt;
			:addClass('wpb-header')&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:css('text-align', 'right')&lt;br /&gt;
				:css('padding', '0.3em 1em 0.3em 0.3em')&lt;br /&gt;
				:css('width', '50%')&lt;br /&gt;
				:css('font-weight', 'bold')&lt;br /&gt;
				:node(self:callHook('headerName'))&lt;br /&gt;
				:done()&lt;br /&gt;
			:tag('th')&lt;br /&gt;
				:css('text-align', 'left')&lt;br /&gt;
				:css('width', '50%')&lt;br /&gt;
				:css('padding', '0.3em 0.3em 0.3em 0')&lt;br /&gt;
				:node(self:callHook('headerRating'))&lt;br /&gt;
&lt;br /&gt;
	local content = wrapper&lt;br /&gt;
		:tag('tr')&lt;br /&gt;
			:tag('td')&lt;br /&gt;
				:addClass('mbox-text')&lt;br /&gt;
				:css('padding', '3px 0 3px 5px')&lt;br /&gt;
				:attr('colspan', '2')&lt;br /&gt;
				:tag('table')&lt;br /&gt;
					:css('background', 'transparent')&lt;br /&gt;
					:css('border', 'none')&lt;br /&gt;
					:css('padding', '0')&lt;br /&gt;
					:css('width', '100%')&lt;br /&gt;
					:attr('cellspacing', '0')&lt;br /&gt;
&lt;br /&gt;
	content&lt;br /&gt;
		:node(self:callHook('preBlurb'))&lt;br /&gt;
&lt;br /&gt;
	local blurbRow = content:tag('tr')&lt;br /&gt;
&lt;br /&gt;
	-- blurb image left&lt;br /&gt;
	if self.bannerCfg.imageLeft then&lt;br /&gt;
		blurbRow:tag('td')&lt;br /&gt;
			:addClass('mbox-image')&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('td')&lt;br /&gt;
			:addClass('mbox-text')&lt;br /&gt;
			:attr('colspan', 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('td')&lt;br /&gt;
			:addClass('mbox-imageright')&lt;br /&gt;
			:node(html.blurbImageRight)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	content&lt;br /&gt;
		:node(self:callHook('postBlurb'))&lt;br /&gt;
		:node(self:getRowHtml('quality'))&lt;br /&gt;
		:node(self:callHook('postQuality'))&lt;br /&gt;
		:node(self:getRowHtml('importance'))&lt;br /&gt;
		:node(self:callHook('postImportance'))&lt;br /&gt;
		:node(self:getRowHtml('taskForces'))&lt;br /&gt;
		:node(self:callHook('postTaskForces'))&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('tr')&lt;br /&gt;
				:tag('td')&lt;br /&gt;
					:attr('colspan', '3')&lt;br /&gt;
					:css('padding', '0')&lt;br /&gt;
					:tag('table')&lt;br /&gt;
						:addClass('collapsible collapsed')&lt;br /&gt;
						:css('width', '100%')&lt;br /&gt;
						:css('background', 'transparent')&lt;br /&gt;
						:tag('tr')&lt;br /&gt;
							:tag('th')&lt;br /&gt;
								:attr('colspan', '3')&lt;br /&gt;
								:css('text-align', 'left')&lt;br /&gt;
								:css('padding', '0.2em 2px 0.2em 0')&lt;br /&gt;
								:wikitext(&lt;br /&gt;
									self.bannerCfg.moreHeader&lt;br /&gt;
										or 'More information'&lt;br /&gt;
								)&lt;br /&gt;
								:done()&lt;br /&gt;
							:done()&lt;br /&gt;
						:node(self:callHook('preCollapsedContent'))&lt;br /&gt;
						:node(self:getRowHtml('requests'))&lt;br /&gt;
						:node(self:callHook('postRequests'))&lt;br /&gt;
						:node(self:getRowHtml('notices'))&lt;br /&gt;
						:node(self:callHook('postNotices'))&lt;br /&gt;
	else&lt;br /&gt;
		-- We aren'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('requests'))&lt;br /&gt;
			:node(self:callHook('postRequests'))&lt;br /&gt;
			:node(self:getRowHtml('notices'))&lt;br /&gt;
			:node(self:callHook('postNotices'))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	content&lt;br /&gt;
		:node(self:callHook('postContent'))&lt;br /&gt;
&lt;br /&gt;
	root&lt;br /&gt;
		:wikitext(self:renderCategories())&lt;br /&gt;
		:node(self:callHook('postWrapper'))&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>Zoran</name></author>
	</entry>
</feed>