Modul:Loops
Loncat ke navigasi
Loncat ke pencarian
| Alpha | Modul ini dinilai sebagai modul alpha. Modul ini sudah siap untuk input dari pihak ketiga, dan bisa digunakan dalam beberapa halaman untuk melihat apakah ada masalah yang timbul, namun harus terus diawasi. Saran untuk fitur baru atau perubahan dalam mekanisme input dan output dipersilahkan.Loops |
| Modul ini menggunakan Lua: |
Lua module implementing features similar to
- REDIRECT Template:Localized link.
Usage[sunting sumber]
{{#invoke:Loops|function_name}}
See also[sunting sumber]
[[Category:Modules{{#translation:}}]]
-- <nowiki>
--------------------------------------------------------------------------------
-- Lua module implementing features similar to [[mw:Extension:Loops]].
--
-- @module lööps
-- @alias loops
-- @author [[User:ExE Boss]]
-- @require [[Module:TableTools]]
--------------------------------------------------------------------------------
local libraryUtil = require("libraryUtil");
local tableTools = require("Module:TableTools");
local checkType = libraryUtil.checkType;
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg;
local ustring = mw.ustring;
local loops = {};
local function userError(message)
return '<strong class="error">' .. message .. '</strong>';
end
local function escapePattern(pattern)
return ustring.gsub(pattern, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1")
end
local function isFrame(frame)
return type(frame) == "table"
and type(frame.args) == "table"
and type(frame.getParent) == "function";
end
--------------------------------------------------------------------------------
-- Preprocesses text escaped using the [[mw:Extension:DynamicPageList3]] method.
--
-- @function loops._preprocess
-- @param {Frame} frame
-- @param {string} msg
-- @return {string}
--------------------------------------------------------------------------------
local function preprocess(frame, msg)
msg = ustring.gsub(msg, "«", "<");
msg = ustring.gsub(msg, "»", ">");
msg = ustring.gsub(msg, "¦", "|");
msg = ustring.gsub(msg, "²{", "{{");
msg = ustring.gsub(msg, "}²", "}}");
return frame:preprocess(msg);
end
loops._preprocess = preprocess;
--------------------------------------------------------------------------------
-- @param {Frame|table} args
-- @return {number}
-- @usage {{#invoke:Loops|numArgs}}
--------------------------------------------------------------------------------
function loops.numArgs(frame)
checkType("numArgs", 1, frame, "table");
local args;
if (isFrame(frame)) then
args = (frame:getParent() or frame).args;
else
args = frame;
end
return tableTools.length(args);
end
--------------------------------------------------------------------------------
-- @param {Frame} args
-- @return {string}
--
-- @usage {{#invoke:Loops|forNumArgs|template string}}
-- @usage {{#invoke:Loops|forNumArgs|value pattern|template string}}
-- @usage {{#invoke:Loops|forNumArgs|key pattern|value pattern|template string}}
-- @usage
-- {{#invoke:Loops|forNumArgs
-- | template = template string
-- }}
-- @usage
-- {{#invoke:Loops|forNumArgs
-- | value = value pattern
-- | template = template string
-- }}
-- @usage
-- {{#invoke:Loops|forNumArgs
-- | key = key pattern
-- | template = template string
-- }}
-- @usage
-- {{#invoke:Loops|forNumArgs
-- | key = key pattern
-- | value = value pattern
-- | template = template string
-- }}
--------------------------------------------------------------------------------
function loops.forNumArgs(frame)
local frameArgs, parentArgs;
checkType("numArgs", 1, frame, "table");
if (isFrame(frame)) then
frameArgs = frame.args;
parentArgs = frame:getParent().args;
else
return error("forNumArgs only supports invocation");
end
local kPattern, vPattern, template;
local frameNumArgs = tableTools.length(frameArgs);
if (frameNumArgs >= 3) then
kPattern = frameArgs[1];
vPattern = frameArgs[2];
template = frameArgs[3];
elseif (frameNumArgs >= 2) then
vPattern = frameArgs[1];
template = frameArgs[2];
else
template = frameArgs[1];
end
kPattern = frameArgs.key or kPattern;
vPattern = frameArgs.value or vPattern;
template = frameArgs.template or template;
checkTypeForNamedArg("forNumArgs", "key", kPattern, "string", true);
checkTypeForNamedArg("forNumArgs", "value", vPattern, "string", true);
checkTypeForNamedArg("forNumArgs", "template", template, "string", true);
if (template == nil) then
return userError("Must supply template parameter to forNumArgs");
end
vPattern = vPattern or "$1";
if (kPattern ~= nil) then
if (#kPattern > 0) then
if (kPattern == vPattern) then
return userError("key pattern must be different from value pattern");
end
kPattern = escapePattern(kPattern);
else
kPattern = nil;
end
elseif (vPattern ~= "$2") then
kPattern = "%$2";
end
if (#vPattern == 0) then
vPattern = nil;
else
vPattern = escapePattern(vPattern);
end
local result = {};
local v, msg;
for k = 1, tableTools.length(parentArgs) do
v = parentArgs[k];
if (v ~= nil) then
msg = template;
if (kPattern) then
msg = ustring.gsub(msg, kPattern, (ustring.gsub(tostring(k), "%%", "%%%%")));
end
if (vPattern) then
msg = ustring.gsub(msg, vPattern, (ustring.gsub(tostring(v), "%%", "%%%%")));
end
result[#result + 1] = preprocess(frame, msg);
end
end
return table.concat(result);
end
return loops;