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 {{ | -- <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 | local libraryUtil = require("libraryUtil"); | ||
local | local checkType = libraryUtil.checkType; | ||
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg; | |||
local | |||
local | 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 | local cfg = mw.loadData("Module:Lua banner/config"); | ||
return | |||
-- 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 | local function noEmptyString(value) | ||
if (type(value) == "string" and value == "") then | |||
return nil; | |||
end | |||
return value; | |||
end | end | ||
function p.main(frame | local p = {}; | ||
function p.main(frame, ...) | |||
return p._main(getArgs(frame), ...); | |||
return p._main( | |||
end | end | ||
function p._main(args, | function p._main(args, title) | ||
local modules = | checkType('main', 1, args, 'table'); | ||
local box = p.renderBox(modules, | checkType('main', 2, title, 'table', true); | ||
local trackingCategories = p.renderTrackingCategories(args, modules, | |||
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, | function p.renderBox(modules, title) | ||
local boxArgs = {} | checkType('renderBox', 1, modules, 'table'); | ||
if #modules < 1 then | checkType('renderBox', 2, title, 'table', true); | ||
title = title or mw.title.getCurrentTitle(); | |||
boxArgs.text = | 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 = | 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( | moduleLinks[i] = string.format("[[:Module:%s]]", module); | ||
end | end | ||
local moduleList = | |||
boxArgs.text = | 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 = | |||
boxArgs.small = true | 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 | return messageBox.main("mbox", boxArgs); | ||
end | end | ||
function p.renderTrackingCategories(args, modules, | 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 | ||
local allowWishes = cfg["allow_wishes"]; | |||
local cats = {}; | |||
local cats = {} | |||
-- Error category | -- Error category | ||
if #modules < 1 and not ( | local errorCategory = noEmptyString(cfg["error_category"]); | ||
cats[#cats + 1] = | 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 | ||
local subpageBlacklist = cfg["subpage_blacklist"]; | |||
if | 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]); | |||
if not category then | category = pagename and moduleCategories[pagename.text]; | ||
local pagename = modules[1] and mw.title.new(modules[1]) | |||
category = pagename and | if (not category) then | ||
if not category then | category = noEmptyString( | ||
cfg[ | |||
(allowWishes and #modules < 1) | |||
and "wish_category" | |||
or "default_category" | |||
] | |||
); | |||
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>


