Модуль:Check for unknown parameters: различия между версиями
м (Changed protection settings for "Module:Check for unknown parameters": Highly visible template; requested at WP:RfPP ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))) |
м (1 версия импортирована: Импорт из Википедии) |
||
(не показаны 4 промежуточные версии 2 участников) | |||
Строка 9: | Строка 9: | ||
local function isnotempty(s) | local function isnotempty(s) | ||
− | return s and s | + | return s and trim(s) ~= '' |
end | end | ||
− | + | function p.check (frame) | |
− | + | local args = frame.args | |
− | + | local pargs = frame:getParent().args | |
− | local | + | local ignoreblank = isnotempty(frame.args['ignoreblank']) |
− | + | local showblankpos = isnotempty(frame.args['showblankpositional']) | |
− | + | local knownargs = {} | |
− | + | local unknown = frame.args['unknown'] or 'Found _VALUE_, ' | |
− | + | local preview = frame.args['preview'] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | local | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | local values = {} | |
− | + | local res = {} | |
− | + | local regexps = {} | |
− | |||
− | |||
-- create the list of known args, regular expressions, and the return string | -- create the list of known args, regular expressions, and the return string | ||
− | |||
− | |||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
if type(k) == 'number' then | if type(k) == 'number' then | ||
Строка 51: | Строка 33: | ||
table.insert(regexps, '^' .. v .. '$') | table.insert(regexps, '^' .. v .. '$') | ||
end | end | ||
+ | end | ||
+ | if isnotempty(preview) then | ||
+ | preview = '<div class="hatnote" style="color: var(--color-error, #d73333)"><strong>Предупреждение:</strong> ' | ||
+ | .. preview | ||
+ | .. ' (это сообщение видно только при предпросмотре страницы).</div>' | ||
+ | elseif preview == nil then | ||
+ | preview = unknown | ||
end | end | ||
-- loop over the parent args, and make sure they are on the list | -- loop over the parent args, and make sure they are on the list | ||
− | |||
− | |||
− | |||
for k, v in pairs(pargs) do | for k, v in pairs(pargs) do | ||
if type(k) == 'string' and knownargs[k] == nil then | if type(k) == 'string' and knownargs[k] == nil then | ||
local knownflag = false | local knownflag = false | ||
− | for | + | for i, regexp in ipairs(regexps) do |
if mw.ustring.match(k, regexp) then | if mw.ustring.match(k, regexp) then | ||
knownflag = true | knownflag = true | ||
Строка 67: | Строка 53: | ||
end | end | ||
if not knownflag and ( not ignoreblank or isnotempty(v) ) then | if not knownflag and ( not ignoreblank or isnotempty(v) ) then | ||
− | + | k = mw.ustring.gsub(k, '[^%w\-_ ]', '?') | |
− | + | table.insert(values, k) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | table.insert(values, k | ||
end | end | ||
+ | elseif type(k) == 'number' and | ||
+ | knownargs[tostring(k)] == nil and | ||
+ | ( showblankpos or isnotempty(v) ) | ||
+ | then | ||
+ | local vlen = mw.ustring.len(v) | ||
+ | v = mw.ustring.sub(v, 1, (vlen < 25) and vlen or 25) | ||
+ | v = mw.ustring.gsub(v, '[^%w\-_ ]', '?') | ||
+ | table.insert(values, k .. ' = ' .. v .. ((vlen >= 25) and ' ...' or '')) | ||
end | end | ||
end | end | ||
− | -- add | + | -- add resuls to the output tables |
− | |||
if #values > 0 then | if #values > 0 then | ||
− | + | if frame:preprocess( "{{REVISIONID}}" ) == "" then | |
− | + | unknown = preview | |
− | if | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | for | + | for k, v in pairs(values) do |
+ | if v == '' then | ||
-- Fix odd bug for | = which gets stripped to the empty string and | -- Fix odd bug for | = which gets stripped to the empty string and | ||
-- breaks category links | -- breaks category links | ||
− | + | v = ' ' | |
− | + | end | |
− | + | local r = unknown:gsub('_VALUE_', v) | |
− | local r = | ||
table.insert(res, r) | table.insert(res, r) | ||
end | end | ||
Строка 111: | Строка 86: | ||
end | end | ||
− | function p. | + | function p.generate (frame) |
− | local args = frame.args | + | local res = '{{#invoke:check for unknown parameters|check\n' .. |
− | local | + | '|unknown=' .. frame.args['unknown'] .. '\n' |
− | + | local checkerparams = {'ignoreblank', 'preview', 'showblankpositional'} | |
+ | for _, v in pairs(checkerparams) do | ||
+ | if frame.args[v] then | ||
+ | res = res .. '|' .. v .. '=' .. frame.args[v] .. '\n' | ||
+ | end | ||
+ | end | ||
+ | |||
+ | local templatenamespace = frame.args[1] | ||
+ | local templatetitle = frame.args[2] | ||
+ | local pagepointer = mw.title.new(templatetitle, templatenamespace) -- именно такой порядок! | ||
+ | local text = pagepointer.getContent(pagepointer) | ||
+ | local params = {} | ||
+ | for param in string.gmatch(text, '\{\{\{([^\|\}]*)') do | ||
+ | params[#params+1] = mw.text.trim(param) | ||
+ | end | ||
+ | table.sort(params) | ||
+ | for k, v in pairs(params) do | ||
+ | if k == 1 or v ~= params[k-1] then | ||
+ | res = res .. '|' .. v | ||
+ | end | ||
+ | end | ||
+ | res = res .. '}}' | ||
+ | |||
+ | return res | ||
end | end | ||
return p | return p |
Текущая версия от 00:44, 7 декабря 2024
Для документации этого модуля может быть создана страница Модуль:Check for unknown parameters/doc
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and trim(s) ~= ''
end
function p.check (frame)
local args = frame.args
local pargs = frame:getParent().args
local ignoreblank = isnotempty(frame.args['ignoreblank'])
local showblankpos = isnotempty(frame.args['showblankpositional'])
local knownargs = {}
local unknown = frame.args['unknown'] or 'Found _VALUE_, '
local preview = frame.args['preview']
local values = {}
local res = {}
local regexps = {}
-- create the list of known args, regular expressions, and the return string
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
if isnotempty(preview) then
preview = '<div class="hatnote" style="color: var(--color-error, #d73333)"><strong>Предупреждение:</strong> '
.. preview
.. ' (это сообщение видно только при предпросмотре страницы).</div>'
elseif preview == nil then
preview = unknown
end
-- loop over the parent args, and make sure they are on the list
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for i, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
table.insert(values, k)
end
elseif type(k) == 'number' and
knownargs[tostring(k)] == nil and
( showblankpos or isnotempty(v) )
then
local vlen = mw.ustring.len(v)
v = mw.ustring.sub(v, 1, (vlen < 25) and vlen or 25)
v = mw.ustring.gsub(v, '[^%w\-_ ]', '?')
table.insert(values, k .. ' = ' .. v .. ((vlen >= 25) and ' ...' or ''))
end
end
-- add resuls to the output tables
if #values > 0 then
if frame:preprocess( "{{REVISIONID}}" ) == "" then
unknown = preview
end
for k, v in pairs(values) do
if v == '' then
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
v = ' '
end
local r = unknown:gsub('_VALUE_', v)
table.insert(res, r)
end
end
return table.concat(res)
end
function p.generate (frame)
local res = '{{#invoke:check for unknown parameters|check\n' ..
'|unknown=' .. frame.args['unknown'] .. '\n'
local checkerparams = {'ignoreblank', 'preview', 'showblankpositional'}
for _, v in pairs(checkerparams) do
if frame.args[v] then
res = res .. '|' .. v .. '=' .. frame.args[v] .. '\n'
end
end
local templatenamespace = frame.args[1]
local templatetitle = frame.args[2]
local pagepointer = mw.title.new(templatetitle, templatenamespace) -- именно такой порядок!
local text = pagepointer.getContent(pagepointer)
local params = {}
for param in string.gmatch(text, '\{\{\{([^\|\}]*)') do
params[#params+1] = mw.text.trim(param)
end
table.sort(params)
for k, v in pairs(params) do
if k == 1 or v ~= params[k-1] then
res = res .. '|' .. v
end
end
res = res .. '}}'
return res
end
return p