Module:Lua banner: Difference between revisions

From Workers & Resources: Soviet Republic Official Wiki
Fix `wish` parameter
 
Use local modules instead of the Fandom Dev: modules, which do not exist here and threw a script error on every page using the Lua banner
 
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
-- This module implements the {{lua}} template.
-- <pre>
--------------------------------------------------------------------------------
-- This module implements the {{Lua}} template.
--
-- Adapted from the Fandom original, which required the shared Dev: modules
-- (Arguments, Config, I18n, List, Message box, TableTools, Yesno). Those exist
-- only on Fandom, so this version uses the equivalent local modules, reads
-- Module:Lua banner/config directly, and carries its English strings inline.
--
-- @attribution [[mw:Module:Lua banner|Module:Lua banner]] (MediaWiki)
-- @attribution [[wikipedia:Module:Lua banner|Module:Lua banner]] (Wikipedia)
-- @see [[Template:Lua]]
--------------------------------------------------------------------------------


local yesno = require('Module:Yesno')
local libraryUtil = require("libraryUtil");
local mList = require('Module:List')
local checkType = libraryUtil.checkType;
local mTableTools = require('Module:TableTools')
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg;
local mMessageBox = require('Module:Message box')
local TNT = require('Module:TNT')


local p = {}
local getArgs = require("Module:Arguments").getArgs;
local list = require("Module:List");
local messageBox = require("Module:Message box");
local tableTools = require("Module:TableTools");
local yesno = require("Module:Yesno");


local function format(msg)
local cfg = mw.loadData("Module:Lua banner/config");
return TNT.format('I18n/Lua banner', msg)
 
-- Target for the "Lua" link in the banner text.
local luaLink = "mw:Lua";
 
local i18n = {
["error"] = "Error: no modules specified",
["wishtext"] = "This template should use [[$1|Lua]].",
["header"] = "This template uses [[$1|Lua]]:",
["header-module"] = "This module uses [[$1|Lua]]:",
["header-user"] = "This user page uses [[$1|Lua]]:",
};
 
local function msg(key, ...)
return mw.message.newRawMessage(i18n[key], ...):plain();
end
end


local function getConfig()
local function noEmptyString(value)
return mw.loadData('Module:Lua banner/config')
if (type(value) == "string" and value == "") then
return nil;
end
return value;
end
end


function p.main(frame)
local p = {};
local origArgs = frame:getParent().args
 
local args = {}
function p.main(frame, ...)
for k, v in pairs(origArgs) do
return p._main(getArgs(frame), ...);
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
end


function p._main(args, cfg)
function p._main(args, title)
local modules = mTableTools.compressSparseArray(args)
checkType('main', 1, args, 'table');
local box = p.renderBox(modules, cfg, args)
checkType('main', 2, title, 'table', true);
local trackingCategories = p.renderTrackingCategories(args, modules, nil, cfg)
 
return box .. trackingCategories
title = title or mw.title.getCurrentTitle();
local modules = tableTools.compressSparseArray(args);
 
local box = p.renderBox(modules, title);
local trackingCategories = p.renderTrackingCategories(args, modules, title);
 
return box .. trackingCategories;
end
end


function p.renderBox(modules, cfg, args)
function p.renderBox(modules, title)
local boxArgs = {}
checkType('renderBox', 1, modules, 'table');
if #modules < 1 then
checkType('renderBox', 2, title, 'table', true);
cfg = cfg or getConfig()
 
if cfg['allow_wishes'] or yesno(args and args.wish) then
title = title or mw.title.getCurrentTitle();
boxArgs.text = format('wishtext')
if (title.subpageText == "doc") then
title = title.basePageTitle;
end
 
local boxArgs = {};
 
if (#modules < 1) then
if (cfg["allow_wishes"] == true and title.contentModel ~= "Scribunto") then
boxArgs.text = msg("wishtext", luaLink);
else
else
boxArgs.text = string.format('<strong class="error">%s</strong>', format('error_emptylist'))
boxArgs.text = tostring(
mw.html.create("strong")
:addClass("error")
:wikitext(msg("error"))
);
end
end
else
else
local moduleLinks = {}
local moduleLinks = {};
for i, module in ipairs(modules) do
for i, module in ipairs(modules) do
moduleLinks[i] = string.format('[[:%s]]', module)
moduleLinks[i] = string.format("[[:Module:%s]]", module);
end
end
local moduleList = mList.makeList('bulleted', moduleLinks)
 
boxArgs.text = format('header') .. '\n' .. moduleList
local moduleList = list.makeList("bulleted", moduleLinks);
 
local header;
if (title.contentModel == "Scribunto") then
header = "header-module";
elseif (title.namespace == 2) then
header = "header-user";
else
header = "header";
end
 
boxArgs.text = msg(header, luaLink) .. "\n" .. moduleList;
end
end
boxArgs.type = 'notice'
 
boxArgs.small = true
boxArgs.type = "notice";
boxArgs.image = string.format(
boxArgs.small = true;
'[[File:Lua-logo-nolabel.svg|30px|alt=%s|link=%s]]',
-- No icon: File:Lua logo.svg has never been uploaded to this wiki.
format('logo_alt'),
boxArgs.image = "none";
format('logo_link')
boxArgs.class = 'msgbox';
)
 
return mMessageBox.main('mbox', boxArgs)
return messageBox.main("mbox", boxArgs);
end
end


function p.renderTrackingCategories(args, modules, titleObj, cfg)
function p.renderTrackingCategories(args, modules, title)
checkType('renderTrackingCategories', 1, args, 'table');
checkType('renderTrackingCategories', 2, modules, 'table');
checkType('renderTrackingCategories', 3, title, 'table', true);
 
title = title or mw.title.getCurrentTitle();
 
local category = args.category;
checkTypeForNamedArg('renderTrackingCategories', 'category', category, 'string', true);
 
if yesno(args.nocat) then
if yesno(args.nocat) then
return ''
return '';
end
end
 
cfg = cfg or getConfig()
local allowWishes = cfg["allow_wishes"];
local cats = {};
local cats = {}
 
-- Error category
-- Error category
if #modules < 1 and not (cfg['allow_wishes'] or yesno(args.wish)) and cfg['error_category'] then
local errorCategory = noEmptyString(cfg["error_category"]);
cats[#cats + 1] = cfg['error_category']
if (
#modules < 1
and errorCategory
and (
not allowWishes
or (title.subpageText == "doc" and title.basePageTitle or title).contentModel == "Scribunto"
)
) then
cats[#cats + 1] = errorCategory;
end
end
 
-- Lua templates category
-- Lua templates category
titleObj = titleObj or mw.title.getCurrentTitle()
local subpageBlacklist = cfg["subpage_blacklist"];
if titleObj.namespace == 10  
if (title.namespace == 10 and not subpageBlacklist[title.subpageText]) then
and not cfg['subpage_blacklist'][titleObj.subpageText]
if (not category) then
then
local moduleCategories = cfg["module_categories"];
local category = args.category
local pagename = modules[1] and mw.title.new(modules[1]);
if not category then
category = pagename and moduleCategories[pagename.text];
local pagename = modules[1] and mw.title.new(modules[1])
 
category = pagename and cfg['module_categories'][pagename.text]
if (not category) then
if not category then
category = noEmptyString(
if (cfg['allow_wishes'] or yesno(args.wish)) and #modules < 1 then
cfg[
category = cfg['wish_category']
(allowWishes and #modules < 1)
else
and "wish_category"
category = cfg['default_category']
or "default_category"
end
]
);
end
end
end
end
if category then
 
cats[#cats + 1] = category
if (category) then
cats[#cats + 1] = category;
end
end
end
end
 
for i, cat in ipairs(cats) do
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
cats[i] = string.format('[[Category:%s]]', cat);
end
end
return table.concat(cats)
 
return table.concat(cats);
end
end


return p
return p;
-- </pre>

Latest revision as of 02:12, 8 August 2026

Documentation for this module may be created at Module:Lua banner/doc

-- <pre>
--------------------------------------------------------------------------------
-- This module implements the {{Lua}} template.
--
-- Adapted from the Fandom original, which required the shared Dev: modules
-- (Arguments, Config, I18n, List, Message box, TableTools, Yesno). Those exist
-- only on Fandom, so this version uses the equivalent local modules, reads
-- Module:Lua banner/config directly, and carries its English strings inline.
--
-- @attribution [[mw:Module:Lua banner|Module:Lua banner]] (MediaWiki)
-- @attribution [[wikipedia:Module:Lua banner|Module:Lua banner]] (Wikipedia)
-- @see [[Template:Lua]]
--------------------------------------------------------------------------------

local libraryUtil = require("libraryUtil");
local checkType = libraryUtil.checkType;
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg;

local getArgs = require("Module:Arguments").getArgs;
local list = require("Module:List");
local messageBox = require("Module:Message box");
local tableTools = require("Module:TableTools");
local yesno = require("Module:Yesno");

local cfg = mw.loadData("Module:Lua banner/config");

-- Target for the "Lua" link in the banner text.
local luaLink = "mw:Lua";

local i18n = {
	["error"] = "Error: no modules specified",
	["wishtext"] = "This template should use [[$1|Lua]].",
	["header"] = "This template uses [[$1|Lua]]:",
	["header-module"] = "This module uses [[$1|Lua]]:",
	["header-user"] = "This user page uses [[$1|Lua]]:",
};

local function msg(key, ...)
	return mw.message.newRawMessage(i18n[key], ...):plain();
end

local function noEmptyString(value)
	if (type(value) == "string" and value == "") then
		return nil;
	end
	return value;
end

local p = {};

function p.main(frame, ...)
	return p._main(getArgs(frame), ...);
end

function p._main(args, title)
	checkType('main', 1, args, 'table');
	checkType('main', 2, title, 'table', true);

	title = title or mw.title.getCurrentTitle();
	local modules = tableTools.compressSparseArray(args);

	local box = p.renderBox(modules, title);
	local trackingCategories = p.renderTrackingCategories(args, modules, title);

	return box .. trackingCategories;
end

function p.renderBox(modules, title)
	checkType('renderBox', 1, modules, 'table');
	checkType('renderBox', 2, title, 'table', true);

	title = title or mw.title.getCurrentTitle();
	if (title.subpageText == "doc") then
		title = title.basePageTitle;
	end

	local boxArgs = {};

	if (#modules < 1) then
		if (cfg["allow_wishes"] == true and title.contentModel ~= "Scribunto") then
			boxArgs.text = msg("wishtext", luaLink);
		else
			boxArgs.text = tostring(
				mw.html.create("strong")
					:addClass("error")
					:wikitext(msg("error"))
			);
		end
	else
		local moduleLinks = {};
		for i, module in ipairs(modules) do
			moduleLinks[i] = string.format("[[:Module:%s]]", module);
		end

		local moduleList = list.makeList("bulleted", moduleLinks);

		local header;
		if (title.contentModel == "Scribunto") then
			header = "header-module";
		elseif (title.namespace == 2) then
			header = "header-user";
		else
			header = "header";
		end

		boxArgs.text = msg(header, luaLink) .. "\n" .. moduleList;
	end

	boxArgs.type = "notice";
	boxArgs.small = true;
	-- No icon: File:Lua logo.svg has never been uploaded to this wiki.
	boxArgs.image = "none";
	boxArgs.class = 'msgbox';

	return messageBox.main("mbox", boxArgs);
end

function p.renderTrackingCategories(args, modules, title)
	checkType('renderTrackingCategories', 1, args, 'table');
	checkType('renderTrackingCategories', 2, modules, 'table');
	checkType('renderTrackingCategories', 3, title, 'table', true);

	title = title or mw.title.getCurrentTitle();

	local category = args.category;
	checkTypeForNamedArg('renderTrackingCategories', 'category', category, 'string', true);

	if yesno(args.nocat) then
		return '';
	end

	local allowWishes = cfg["allow_wishes"];
	local cats = {};

	-- Error category
	local errorCategory = noEmptyString(cfg["error_category"]);
	if (
		#modules < 1
		and errorCategory
		and (
			not allowWishes
			or (title.subpageText == "doc" and title.basePageTitle or title).contentModel == "Scribunto"
		)
	) then
		cats[#cats + 1] = errorCategory;
	end

	-- Lua templates category
	local subpageBlacklist = cfg["subpage_blacklist"];
	if (title.namespace == 10 and not subpageBlacklist[title.subpageText]) then
		if (not category) then
			local moduleCategories = cfg["module_categories"];
			local pagename = modules[1] and mw.title.new(modules[1]);
			category = pagename and moduleCategories[pagename.text];

			if (not category) then
				category = noEmptyString(
					cfg[
						(allowWishes and #modules < 1)
							and "wish_category"
							or "default_category"
					]
				);
			end
		end

		if (category) then
			cats[#cats + 1] = category;
		end
	end

	for i, cat in ipairs(cats) do
		cats[i] = string.format('[[Category:%s]]', cat);
	end

	return table.concat(cats);
end

return p;
-- </pre>