Module:WikiProjectBanner
| Pre-alpha | This module is rated as pre-alpha. It is unfinished, and may or may not be in active development. It should not be used from article namespace pages. Modules remain pre-alpha until the original editor (or someone who takes one over if it is abandoned for some time) is satisfied with the basic structure. | 
This module is intended to be a replacement for {{WPBannerMeta}}.
Usage edit source
Place the following on the template page:
{{safesubst:<includeonly/>#invoke:WikiProjectBanner|render_banner}}<noinclude>
{{#invoke:WikiProjectBanner|render_docs}}
After saving (or while previewing) the page, follow the link in the documentation box to configure it. Consider adding a pointer to the banner's configuration module inside an HTML-style comment: Template:Code
Technical details edit source
This module uses the following pages:
- Module:WikiProjectBanner/config
- Module:WikiProjectBanner/shared
- Module:WikiProjectBanner/AssessmentRow
- Module:WikiProjectBanner/Banner
- Module:WikiProjectBanner/Context
- Module:WikiProjectBanner/Documentation
- Module:WikiProjectBanner/Grade
- Module:WikiProjectBanner/Note
- Module:WikiProjectBanner/Row
- Module:WikiProjectBanner/TaskForce
All subpages of this module:
-------------------------------------------------------------------------------
--                               WikiProjectBanner                           --
--                                                                           --
-- This module produces templates used by WikiProjects to track pages that   --
-- are within their scope.                                                   --
-------------------------------------------------------------------------------
-- Load necessary modules.
require('strict')
local Banner = require('Module:WikiProjectBanner/Banner')
local p = {}
function p._main(bannerName, args, cfg)
	-- Entry point from Lua.
	cfg = cfg or mw.loadData('Module:WikiProjectBanner/config')
	-- Set a metatable allowing us to track unused arguments.
	local unusedArgs, argsProxy = {}, {}
	for k, v in pairs(args) do
		unusedArgs[k] = true
	end
	setmetatable(argsProxy, {
		__index = function (t, key)
			unusedArgs[key] = nil
			local val = args[key]
			t[key] = val
			return val
		end,
		__pairs = function (t)
			for key, val in pairs(args) do
				unusedArgs[key] = nil
				t[key] = val
			end
			return next, t
		end,
		__ipairs = function (t)
			for i, val in ipairs(args) do
				unusedArgs[i] = nil
				t[i] = val
			end
			return function (t, i)
				i = i + 1
				local val = t[i]
				if val then
					return i, val
				end
			end, t, 0
		end
	})
	local success, bannerObj = pcall(Banner.new, bannerName, argsProxy, cfg)
	if not success then
		return string.format(
			'<strong class="error">Error: %s</strong>',
			bannerObj -- This is the error message.
		)
	end
	local ret = tostring(bannerObj)
	if next(unusedArgs) then
		ret = ret .. '[[Category:WikiProject banners with unused arguments]]'
	end
	return ret
end
function p.main(frame)
	-- Entry point from wikitext.
	-- Get the banner name.
	local parent = frame:getParent()
	local bannerName, isTemplate = parent:getTitle():gsub('^Template:', '')
	bannerName = bannerName:gsub('/sandbox$', '')
	isTemplate = isTemplate > 0
	-- Get the arguments.
	local args = {}
	for k, v in pairs(parent.args) do
		v = v:match('^%s*(.-)%s*$') -- Trim whitespace.
		if v ~= '' then
			args[k] = v
		end
	end
	-- Subst check.
	-- This must be done before any errors can be produced, otherwise the red
	-- "script error" text will be substituted instead of the template code.
	if mw.isSubsting() then
		local ret = {}
		ret[#ret + 1] = bannerName
		for k, v in pairs(args) do
			ret[#ret + 1] = k .. '=' .. v
		end
		return '{{' .. table.concat(ret, '|') .. '}}'
	end
	-- Check we are being invoked from a template.
	if not isTemplate then
		error('this module must be invoked from within a template')
	end
	return p._main(bannerName, args)
end
return p
