<?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%2FK</id>
	<title>Module:WikiProjectBanner/K - 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%2FK"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:WikiProjectBanner/K&amp;action=history"/>
	<updated>2026-06-19T02:14:41Z</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/K&amp;diff=480030&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/K&amp;diff=480030&amp;oldid=prev"/>
		<updated>2021-07-16T07:58:31Z</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;local export = {}&lt;br /&gt;
&lt;br /&gt;
-- TODO: a submodule for categorisation may be needed&lt;br /&gt;
-- these also need to be checked for existence by the documentation page&lt;br /&gt;
&lt;br /&gt;
local m_common_data = require('Module:WikiProjectBanner/common data')&lt;br /&gt;
&lt;br /&gt;
local&lt;br /&gt;
	importance_grades,&lt;br /&gt;
	quality_grades,&lt;br /&gt;
	importance_scales,&lt;br /&gt;
	quality_scales,&lt;br /&gt;
	stock_notices&lt;br /&gt;
	=&lt;br /&gt;
	m_common_data.importance_grades,&lt;br /&gt;
	m_common_data.quality_grades,&lt;br /&gt;
	m_common_data.importance_scales,&lt;br /&gt;
	m_common_data.quality_scales,&lt;br /&gt;
	m_common_data.stock_notices&lt;br /&gt;
&lt;br /&gt;
-- creates a wrapper object which tracks unused template arguments&lt;br /&gt;
local function track_usage(args)&lt;br /&gt;
	local tracker = {}&lt;br /&gt;
	&lt;br /&gt;
	for key in pairs(args) do&lt;br /&gt;
		tracker[key] = true&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return setmetatable({}, {&lt;br /&gt;
		__index = function (self, key)&lt;br /&gt;
			local value = args[key]&lt;br /&gt;
			tracker[key] = nil&lt;br /&gt;
			self[key] = value&lt;br /&gt;
			return value&lt;br /&gt;
		end&lt;br /&gt;
	}), tracker&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- resolves a quality or importance assessment grade; returns a grade data table and status&lt;br /&gt;
local function resolve_grade(scale_config, scales, grades, args, grade_param, title)&lt;br /&gt;
	if args == true then&lt;br /&gt;
		return grades.na, 'demo'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(scale_config) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		scale_config = scales[scale_config]&lt;br /&gt;
	elseif not scale_config then&lt;br /&gt;
		scale_config = scales.standard&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ns&lt;br /&gt;
	ns = mw.site.namespaces[title.namespace].subject&lt;br /&gt;
	if ns.id == 0 then&lt;br /&gt;
		ns = &amp;quot;_MAIN&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		ns = ns.canonicalName&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if title.isRedirect and scale_config._REDIRECT then&lt;br /&gt;
		local redir_grade = scale_config._REDIRECT[ns] or scale_config._REDIRECT._OTHER&lt;br /&gt;
		if redir_grade then&lt;br /&gt;
			return grades[redir_grade], 'redirect'&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	scale_config = scale_config[ns] or scale_config._OTHER&lt;br /&gt;
	if not scale_config then&lt;br /&gt;
		return nil	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if type(scale_config) == &amp;quot;string&amp;quot; then&lt;br /&gt;
		return grades[scale_config]	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local resolver = {}&lt;br /&gt;
	for _, item in ipairs(scale_config) do&lt;br /&gt;
		local grade = grades[item]&lt;br /&gt;
		resolver[item] = grade&lt;br /&gt;
		if grade.aliases then&lt;br /&gt;
			for _, item in ipairs(grade.aliases) do&lt;br /&gt;
				resolver[item] = grade	&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local grade = args[grade_param]&lt;br /&gt;
	if grade then&lt;br /&gt;
		grade = tostring(grade):lower()&lt;br /&gt;
		if resolver[grade] then&lt;br /&gt;
			return resolver[grade], 'valid'&lt;br /&gt;
		else&lt;br /&gt;
			return resolver[scale_config[1]], 'invalid'&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return resolver[scale_config[1]], 'default'&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- constructs banner markup and the category list. for internal use only (which includes unit tests).&lt;br /&gt;
function export.build_banner(banner_config, banner_hooks, title, banner_args, out, categories)&lt;br /&gt;
	local yesno = require('Module:yesno')&lt;br /&gt;
&lt;br /&gt;
	out.root = mw.html.create('')&lt;br /&gt;
	local state = {} -- for use by hooks only&lt;br /&gt;
	&lt;br /&gt;
	local function call_hook(hookfunc, ...)&lt;br /&gt;
		if not hookfunc then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
		return hookfunc(--[[ not yet determined ]])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- basic skeleton&lt;br /&gt;
	out.wrapper =&lt;br /&gt;
		out.root:tag('table')&lt;br /&gt;
			:addClass('tmbox tmbox-notice collapsible innercollapse wpb')&lt;br /&gt;
	&lt;br /&gt;
	out.header_row =&lt;br /&gt;
		out.wrapper:tag('tr')&lt;br /&gt;
			:addClass('wpb-header')&lt;br /&gt;
	out.header_name =&lt;br /&gt;
		out.header_row: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;
	out.header_rating =&lt;br /&gt;
		out.header_row: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;
&lt;br /&gt;
	out.content =&lt;br /&gt;
		out.wrapper: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;
	out.has_more = false&lt;br /&gt;
	out.content_more =&lt;br /&gt;
		mw.html.create('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(banner_config.more_header or &amp;quot;More information&amp;quot;)&lt;br /&gt;
				:done()&lt;br /&gt;
			:done()&lt;br /&gt;
&lt;br /&gt;
	-- does anyone still use this?&lt;br /&gt;
	local is_small = (banner_args ~= true) and yesno(banner_args.small)&lt;br /&gt;
	if is_small then&lt;br /&gt;
		out.wrapper:addClass(&amp;quot;mbox-small&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- the blurb&lt;br /&gt;
	local page_type = require('Module:pagetype')._main { page = title.fullText }&lt;br /&gt;
	&lt;br /&gt;
	local blurb_row = out.content:tag('tr')&lt;br /&gt;
	if banner_config.image_left then&lt;br /&gt;
		out.blurb_image_left = blurb_row:tag('td'):addClass('mbox-image')&lt;br /&gt;
	end&lt;br /&gt;
	out.blurb_text = blurb_row:tag('td'):addClass('mbox-text')&lt;br /&gt;
	if banner_config.image_right then&lt;br /&gt;
		out.blurb_image_right = blurb_row:tag('td'):addClass('mbox-imageright')&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if banner_config.image_left then&lt;br /&gt;
		out.blurb_image_left:wikitext(('[[File:%s|%s]]'):format(&lt;br /&gt;
			banner_config.image_left,&lt;br /&gt;
			is_small&lt;br /&gt;
			and (banner_config.image_left_size_small or &amp;quot;40px&amp;quot;)&lt;br /&gt;
			or (banner_config.image_left_size_big or &amp;quot;80px&amp;quot;)&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if banner_config.image_right then&lt;br /&gt;
		out.blurb_image_right:wikitext(('[[File:%s|%s]]'):format(&lt;br /&gt;
			banner_config.image_right,&lt;br /&gt;
			is_small&lt;br /&gt;
			and (banner_config.image_right_size_small or &amp;quot;40px&amp;quot;)&lt;br /&gt;
			or (banner_config.image_right_size_big or &amp;quot;80px&amp;quot;)&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	out.blurb_text:attr('colspan',&lt;br /&gt;
		(banner_config.image_left and 1 or 0) +&lt;br /&gt;
		(banner_config.image_right and 1 or 0) + &lt;br /&gt;
		1&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	if banner_config.portal then&lt;br /&gt;
		local m_portal = require(&amp;quot;Module:Portal&amp;quot;)&lt;br /&gt;
		out.blurb_text:wikitext(m_portal._portal({ banner_config.portal }, {}))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local project_link = banner_config.project_link or (&amp;quot;Wikipedia:WikiProject &amp;quot; .. banner_config.project)&lt;br /&gt;
	local project_name = banner_config.project_name or (&amp;quot;WikiProject &amp;quot; .. banner_config.project)&lt;br /&gt;
	if banner_config.blurb then&lt;br /&gt;
		out.blurb_text:wikitext(banner_config.blurb)&lt;br /&gt;
	else&lt;br /&gt;
		local project_scope = banner_config.project_scope or (&amp;quot;[[&amp;quot; .. banner_config.project .. &amp;quot;]]&amp;quot;)&lt;br /&gt;
		local project_link_talk = project_link:gsub(&amp;quot;^Wikipedia:&amp;quot;, &amp;quot;Wikipedia talk:&amp;quot;) -- XXX: avoiding title objects because they are &amp;quot;expensive&amp;quot; to create&lt;br /&gt;
		&lt;br /&gt;
		out.blurb_text:wikitext((&lt;br /&gt;
			&amp;quot;This %s is within the scope of '''[[%s|%s]]''', a collaborative effort &amp;quot; ..&lt;br /&gt;
			&amp;quot;to improve the coverage of %s 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 [[%s|discussion]] and &amp;quot; ..&lt;br /&gt;
			&amp;quot;see a list of open tasks.&amp;quot;&lt;br /&gt;
		):format(&lt;br /&gt;
			page_type, project_link, project_name,&lt;br /&gt;
			project_scope, project_link_talk&lt;br /&gt;
		))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	out.header_name:wikitext((&amp;quot;[[%s|%s]]&amp;quot;):format(project_link, project_name))&lt;br /&gt;
&lt;br /&gt;
	function out.row_pair(in_more)&lt;br /&gt;
		local parent = out.content&lt;br /&gt;
		if in_more then&lt;br /&gt;
			out.has_more = true&lt;br /&gt;
			parent = out.content_more&lt;br /&gt;
		end&lt;br /&gt;
		local row = parent:tag('tr')&lt;br /&gt;
		local cell_img, cell_text&lt;br /&gt;
		&lt;br /&gt;
		cell_img = row:tag('td')&lt;br /&gt;
		cell_text = row:tag('td')&lt;br /&gt;
			:attr('colspan', '2')&lt;br /&gt;
			:addClass('mbox-text')&lt;br /&gt;
		&lt;br /&gt;
		return cell_img, cell_text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- normalise parameters&lt;br /&gt;
	local quality_grade, quality_grade_status = resolve_grade(&lt;br /&gt;
		banner_config.quality_scale,&lt;br /&gt;
		quality_scales,&lt;br /&gt;
		quality_grades,&lt;br /&gt;
		banner_args, 'class',&lt;br /&gt;
		title&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	if quality_grade_status == 'invalid' then&lt;br /&gt;
		-- TODO: add a category&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local imp_grade, imp_grade_status&lt;br /&gt;
	if quality_grade and quality_grade.force_imp then&lt;br /&gt;
		imp_grade, imp_grade_status = quality_grade.force_imp, 'forced'&lt;br /&gt;
	else&lt;br /&gt;
		imp_grade, imp_grade_status = resolve_grade(&lt;br /&gt;
			banner_config.importance_scale,&lt;br /&gt;
			importance_scales,&lt;br /&gt;
			importance_grades,&lt;br /&gt;
			banner_args, banner_config.importance_param or 'importance',&lt;br /&gt;
			title&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if imp_grade_status == 'invalid' then&lt;br /&gt;
		-- TODO: add a category&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if quality_grade then&lt;br /&gt;
		out.qual_label, out.qual_text = out.row_pair()&lt;br /&gt;
		out.qual_label&lt;br /&gt;
			:addClass('assess')&lt;br /&gt;
			:css('text-align', 'center')&lt;br /&gt;
			:css('white-space', 'nowrap')&lt;br /&gt;
			:css('font-weight', 'bold')&lt;br /&gt;
			:css('background', quality_grade.color)&lt;br /&gt;
&lt;br /&gt;
		if quality_grade.icon then&lt;br /&gt;
			out.qual_label&lt;br /&gt;
				:wikitext('[[File:' .. quality_grade.icon .. '|16px]] ')&lt;br /&gt;
		end&lt;br /&gt;
		out.qual_label:wikitext(quality_grade.short)&lt;br /&gt;
		out.qual_text:wikitext((&amp;quot;This %s %s on the project's [[%s|quality scale]].&amp;quot;):format(&lt;br /&gt;
			page_type, quality_grade.rated_text or&lt;br /&gt;
			&amp;quot;has been rated as '''&amp;quot; .. quality_grade.full .. &amp;quot;'''&amp;quot;,&lt;br /&gt;
			banner_config.quality_scale_link or&lt;br /&gt;
			(project_link .. &amp;quot;/Assessment#Quality scale&amp;quot;)&lt;br /&gt;
		))&lt;br /&gt;
	&lt;br /&gt;
		-- TODO: add a category&lt;br /&gt;
		-- TODO: assessment checklists&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if imp_grade then&lt;br /&gt;
		out.imp_label, out.imp_text = out.row_pair()&lt;br /&gt;
		out.imp_label&lt;br /&gt;
			:addClass('import')	&lt;br /&gt;
			:css('text-align', 'center')&lt;br /&gt;
			:css('white-space', 'nowrap')&lt;br /&gt;
			:css('font-weight', 'bold')&lt;br /&gt;
			:css('background', imp_grade.color)&lt;br /&gt;
		out.imp_label:wikitext(imp_grade.name)&lt;br /&gt;
		out.imp_text:wikitext((&amp;quot;This %s %s on the project's [[%s|importance scale]].&amp;quot;):format(&lt;br /&gt;
			page_type, quality_grade.rated_text or&lt;br /&gt;
			&amp;quot;has been rated as '''&amp;quot; .. imp_grade.name .. &amp;quot;-importance'''&amp;quot;,&lt;br /&gt;
			banner_config.importance_scale_link or&lt;br /&gt;
			(project_link .. &amp;quot;/Assessment#Importance scale&amp;quot;)&lt;br /&gt;
		))&lt;br /&gt;
&lt;br /&gt;
		-- TODO: add a category&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- rating text for banner headers inside {{WikiProjectBannerShell}}&lt;br /&gt;
	if quality_grade or imp_grade then&lt;br /&gt;
		out.header_rating:wikitext(&amp;quot;(Rated &amp;quot;)&lt;br /&gt;
		if quality_grade then&lt;br /&gt;
			out.header_rating:wikitext(quality_grade.short)&lt;br /&gt;
			if imp_grade then&lt;br /&gt;
				out.header_rating:wikitext(&amp;quot;, &amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if imp_grade then&lt;br /&gt;
			out.header_rating:wikitext(imp_grade.name .. &amp;quot;-importance&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		out.header_rating:wikitext(&amp;quot;)&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- field, like in {{WikiProject Systems}} or {{Maths rating}}&lt;br /&gt;
	if banner_config.field then&lt;br /&gt;
		local field_config = banner_config.field&lt;br /&gt;
		local field&lt;br /&gt;
&lt;br /&gt;
		if banner_args ~= true then&lt;br /&gt;
			field = false&lt;br /&gt;
			local field_id = banner_args[field_config.arg_name or 'field']&lt;br /&gt;
			&lt;br /&gt;
			if field_id then&lt;br /&gt;
				field = field_config.fields[field_id]&lt;br /&gt;
				if type(field) == 'string' then&lt;br /&gt;
					field = field_config.fields[field]&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		out.field_icon, out.field_text = out.row_pair()&lt;br /&gt;
		if field then&lt;br /&gt;
			out.field_icon:wikitext((&amp;quot;[[File:%s|link=%s]]&amp;quot;):format(&lt;br /&gt;
				field.icon, field.link&lt;br /&gt;
			))&lt;br /&gt;
			out.field_text:wikitext((&amp;quot;This %s is within the field of [[%s|%s]].&amp;quot;):format(&lt;br /&gt;
				page_type, field.link, field.name&lt;br /&gt;
			))&lt;br /&gt;
		else&lt;br /&gt;
			out.field_icon:wikitext((&amp;quot;[[File:Purple question mark.svg|link=%s]]&amp;quot;):format(&lt;br /&gt;
				field_config.unassessed_link&lt;br /&gt;
			))&lt;br /&gt;
			out.field_text:wikitext((&amp;quot;This %s is [[%s|not associated with a particular field]].&amp;quot;):format(&lt;br /&gt;
				page_type, field_config.unassessed_link&lt;br /&gt;
			))&lt;br /&gt;
&lt;br /&gt;
			if field == false then&lt;br /&gt;
				-- TODO: add a category because an invalid field has been specified&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- task forces&lt;br /&gt;
	for _, tf_info in ipairs(banner_config.task_forces or {}) do&lt;br /&gt;
		-- TODO: is this row needed?&lt;br /&gt;
		local needed = (banner_args == true) or banner_args[tf_info.param]&lt;br /&gt;
		if tf_info.force then -- {{WikiProject Software}} forces WikiProject Computing's banner for example&lt;br /&gt;
			needed = true&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if needed then&lt;br /&gt;
			local short_name = tf_info.short_name or tf_info.name&lt;br /&gt;
			if tf_info.link then&lt;br /&gt;
				out.header_name:wikitext((&amp;quot; / [[%s|%s]]&amp;quot;):format(tf_info.link, short_name))&lt;br /&gt;
			else&lt;br /&gt;
				out.header_name:wikitext((&amp;quot; / %s&amp;quot;):format(short_name))&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			local node_icon, node_text = out.row_pair()&lt;br /&gt;
			&lt;br /&gt;
			if tf_info.icon then&lt;br /&gt;
				node_icon:wikitext(('[[File:%s|x25px|link=%s]]'):format(tf_info.icon, tf_info.link or ''))&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- TODO: node_text:wikitext(&amp;quot;This %s is supported by %s.&amp;quot;)&lt;br /&gt;
			-- TODO: add categories&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- requests and other notices (photograph, maps, attention, etc.)&lt;br /&gt;
	for _, nt_info in ipairs(banner_config.notices or { stock_notices.auto, stock_notices.attention }) do&lt;br /&gt;
		if type(nt_info) == 'string' then&lt;br /&gt;
			nt_info = stock_notices[nt_info] or&lt;br /&gt;
				error(&amp;quot;Invalid stock notice '&amp;quot; .. nt_info .. &amp;quot;' specified in banner configuration&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local needed = (banner_args == true) or banner_args[nt_info.param]&lt;br /&gt;
&lt;br /&gt;
		if needed then&lt;br /&gt;
			local node_icon, node_text = out.row_pair()&lt;br /&gt;
&lt;br /&gt;
			if nt_info.icon then&lt;br /&gt;
				node_icon:wikitext(('[[File:%s|x25px|link=%s]]'):format(nt_info.icon, nt_info.link or ''))&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			-- TODO: fill node_text&lt;br /&gt;
			-- TODO: add categories&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if out.has_more then&lt;br /&gt;
		out.content:wikitext(tostring(out.content_more))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function export.render_banner(frame)&lt;br /&gt;
	local banner_name, is_templ = frame:getParent():getTitle():gsub(&amp;quot;^Template:&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
	banner_name = banner_name:match(&amp;quot;^(.*)/sandbox$&amp;quot;) or banner_name&lt;br /&gt;
	if is_templ == 0 then&lt;br /&gt;
		error(&amp;quot;This module must be invoked from within a template&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local demo = false&lt;br /&gt;
	if mw.isSubsting() then&lt;br /&gt;
		local result = { }&lt;br /&gt;
		for key, value in pairs(frame:getParent().args) do&lt;br /&gt;
			table.insert(result, &amp;quot;|&amp;quot; .. key .. &amp;quot;=&amp;quot; .. value)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		return &amp;quot;{{&amp;quot; .. banner_name .. table.concat(result) .. &amp;quot;}}&amp;quot;&lt;br /&gt;
	elseif mw.title.getCurrentTitle().fullText == frame:getParent():getTitle() then&lt;br /&gt;
		demo = true&lt;br /&gt;
	elseif mw.title.getCurrentTitle().namespace == mw.site.namespaces.Module.id then&lt;br /&gt;
		-- we are viewing it on the banner config page (?)&lt;br /&gt;
		demo = true	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local banner_args, unused_args&lt;br /&gt;
	if not demo then&lt;br /&gt;
		banner_args, unused_args = track_usage(frame:getParent().args)&lt;br /&gt;
	else&lt;br /&gt;
		banner_args, unused_args = frame:getParent().args, {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local success, banner_config, banner_data&lt;br /&gt;
&lt;br /&gt;
	success, banner_config = pcall(mw.loadData, &amp;quot;Module:WikiProjectBanner/config/&amp;quot; .. banner_name)&lt;br /&gt;
	if not success then&lt;br /&gt;
		error(&amp;quot;Banner data page [[Module:WikiProjectBanner/config/&amp;quot; .. banner_name .. &amp;quot;]] does not exist&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	success, banner_hooks = pcall(require, &amp;quot;Module:WikiProjectBanner/config/&amp;quot; .. banner_name .. &amp;quot;/hooks&amp;quot;) or {}&lt;br /&gt;
	if not success then&lt;br /&gt;
		banner_hooks = {}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local out, categories = {}, {}&lt;br /&gt;
&lt;br /&gt;
	export.build_banner(&lt;br /&gt;
		banner_config, banner_hooks,                      -- banner config&lt;br /&gt;
		mw.title.getCurrentTitle(), demo or banner_args,  -- current environment&lt;br /&gt;
		out, categories                                   -- output&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	if next(unused_args) then&lt;br /&gt;
		-- TODO: output a category for unused arguments&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- categories&lt;br /&gt;
	local sort_key = banner_args.listas or mw.title.getCurrentTitle().text&lt;br /&gt;
	if (#categories &amp;gt; 0) and yesno(banner_args.category, true) then&lt;br /&gt;
		categories = &amp;quot;[[Category:&amp;quot; .. table.concat(categories, &amp;quot;|&amp;quot; .. sort_key .. &amp;quot;]][[Category:&amp;quot;) .. &amp;quot;|&amp;quot; .. sort_key .. &amp;quot;]]&amp;quot;&lt;br /&gt;
	else&lt;br /&gt;
		categories = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(out.root) .. categories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return export&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>