Module:Filter
来自滚动的天空Wiki
本模块用于筛除错误模板参数,避免内容无法显示。
基本用法[编辑源代码]
在模板中加入{{#invoke:filter|main|一些参数|...|view=<noinclude>1</noinclude>}}
。
可选参数[编辑源代码]
- mode
- 若有值,则切换为黑名单模式,对该模块输入的
一些参数
在嵌入模板时不被允许使用。否则一些参数
将会被视为白名单,对于具名参数,只有白名单中参数可以使用。 - numbersallowed
- 允许的位次参数,用空格隔开。该参数的效果不受
mode
影响。 - nonumber
- 若为真,则不允许位次参数。不可以和
numbersallowed
一起使用。 - nostring
- 若为真,则不允许具名参数。不可以和
一些参数
一起使用。 - view
- 若为真,则会展示筛选规则,而不是调用筛选。推荐以
|view=<noinclude>1</noinclude>
的方式使用。 - raiseError
- 若为真,则当出现错误参数时会报错,而不仅仅是列入Category:有参数错误的页面中。
- regexp
- 若为真,则
一些参数
会被当做正则表达式去筛选参数。使用wholeword
进行全字匹配。
注意[编辑源代码]
本模块会对自己的参数过滤。该过滤过程中raiseError
是默认启用的。
-- 本模块需要完善文档及其注释。
local p = {}
local trim = mw.text.trim
local function raise(paras,k)
mw.log(paras.template)
return paras.raiseError and error("参数错误") or string.format("[[Category:有参数错误的页面|%s]]%s",paras.template,
tostring(mw.html.create("span"):wikitext("!"):attr("title",k):css("color","red")))
end
function p.filt(args,paras)
local mistake
local function add(k)
mistake = mistake or {}
mistake[#mistake + 1] = k
end
local function whole(pat)
if paras.wholeword then
return "^" .. pat .. "$"
else
return pat
end
end
local mode = paras.mode or 0
mw.logObject(paras)
if paras.nostring then
for k in pairs(args) do
if type(k) == "string" then
add(k)
end
end
end
if paras.nonumber then
for k in pairs(args) do
if type(k) == "number" then
add(k)
end
end
elseif paras.numbersallowed then
local allow = {}
for each in mw.text.gsplit(paras.numbersallowed," ") do
allow[tonumber(each)] = true
end
for k in pairs(args) do
if type(k) == "number" and not allow[k] then
add(k)
end
end
end
local set = {}
for k, v in pairs(paras) do
if type(k) == "number" then
set[v] = true
end
end
mw.logObject {paras,set,args}
if mode == 0 then -- 白名单
for k in pairs(args) do
if type(k) == "string" then
if not paras.regexp and not set[k] then
add(k)
elseif paras.regexp then
local found = false
for each in pairs(set) do
if k:match(whole(each)) then
found = true
break
end
end
if not found then
add(k)
end
end
end
end
else
for k in pairs(args) do
if not paras.regexp and set[k] then
add(k)
elseif paras.regexp then
for each in pairs(set) do
if k:match(whole(each)) then
add(k)
break
end
end
end
end
end
if mistake then
return raise(paras,table.concat(mistake,";"))
end
end
local function yesno(b,x,y)
return b and (x or "是") or (y or "否")
end
function p.view(paras)
local root = mw.html.create("div")
root:tag "div"
:css({
["text-align"] = "center",
["font-weight"] = "bold",
["font-size"] = "big"
})
:wikitext "关于本模板的参数"
local list = root:tag "ul"
local function add(t)
list:tag "li"
:wikitext(t)
end
add("模式:" .. (paras.mode and "黑" or "白") .. "名单")
add("是否报错:" .. yesno(paras.raiseError))
add("禁止具名参数:" .. yesno(paras.nostring))
add("禁止位次参数:" .. yesno(paras.nonumber))
add("使用正则表达式:" .. yesno(paras.regexp)
.. yesno(paras.wholeword,",全字匹配",",不自动全字匹配"))
if paras.nonumber and paras.numbersallowed then
error("参数错误:numbersallowed")
elseif paras.numbersallowed then
local numbers = {}
local set = {}
for each in mw.text.gsplit(paras.numbersallowed," ") do
if not tonumber(each) or set[each] then error("参数错误") end
numbers[#numbers + 1] = each
set[each] = true
end
add("允许的位次参数:" .. table.concat(numbers,","))
end
local len,alen = 0,0
for each in pairs(paras) do
if type(each)=="number" then
len = len + 1
end
end
for each in ipairs(paras) do
alen = alen + 1
end
if len ~= alen then
error("参数错误:不允许断参")
end
if paras.nostring and len > 0 then
error("参数错误:具名参数已经被禁")
elseif len then
add("名单:" .. table.concat(paras,", "))
end
return root
end
function p.main(frame)
local paras = {}
local parent = frame:getParent()
paras.template = parent:getTitle()
local pargs = parent.args
local args = frame.args
for k, v in pairs(args) do
if trim(v) ~= "" then
paras[k] = v
end
end
p.filt(paras,{"view","nostring","nonumber","numbersallowed","raiseError",
"regexp","wholeword","template",
nofilt=true,raiseError = true})
if paras.view then
return p.view(paras)
end
return p.filt(pargs,paras)
end
return p