模組:Compact list
![]() | 此模块已评为alpha版,可接受第三方输入,并可用于少量页面以检查是否存在问题,但需要受到检查。欢迎提供新功能或修改其输入输出机制的建议。 |
使用方式
[编辑]Lua code for inside of another template (e.g., an infobox). Creates a compact list out of a set of named arguments. For example, if the argument to this module is "foo", it searches for all arguments named "foo" followed by an optional underscore followed by one or more digits. It then assembles all of the named argument into a "pretty printed" list, in numerical order. If the list is short (<= 4 long), the module uses {{enum}} to print in the "A, B, C or D" format. If it is long, it will use {{collapsible list}}. The threshold can be set with |_limit=
.
Typical usage in a parent template, which gathers all arguments named "foo":
{{#invoke:Compact list|main|foo|_limit=4}}
范例
[编辑]Note: these examples have the named arguments passed to the module directly. In practice, these named arguments would be passed to the template that invokes the module.
{{#invoke:Compact list|main|ook|ook=A|spud=1234}}
→ A
{{#invoke:Compact list|main|ook|ook1=A|ook_2=B}}
→ A and B
{{#invoke:Compact list|main|ook|ook=A|ook1=B|ook2=C|ook3=D}}
→ A, B, C and D
{{#invoke:Compact list|main|ook|ook1=A|ook5=B|ook20=C|ook3000=D|ook342345=E|foofoofoo=234}}
→ - A
- B
- C
- D
- E
{{#invoke:Compact list|main|ook|ook1=A|ook5=B|ook20=C|ook3000=D|ook342345=E|foofoofoo=234|_limit=5}}
→ A, B, C, D and E
{{#invoke:Compact list|main|ook|ook=A|ook1=B|ook2=C|ook3=D|ook4=E|ook5=F|ook6=G}}
→ - A
- B
- C
- D
- E
- F
- G
上述文档嵌入自Module:Compact list/doc。 (编辑 | 历史) 编者可以在本模块的沙盒 (创建 | 镜像)和测试样例 (创建)页面进行实验。 本模块的子页面。 |
local getArgs = require('Module:Arguments').getArgs
local clist = require('Module:Collapsible list').main
local compressSparseArray = require('Module:TableTools').compressSparseArray
local p = {}
--[[
Combine named-and-numbered arguments into a pretty list.
"Named-and-numbered" means foo, foo0, foo_1, foo234: anything that matches foo_?%d+
Arguments:
args[1] = name to search arguments
rest of args = arguments to search
Returns:
Pretty list, in order of argument number.
"foo" comes first, then "foo0", "foo1", ... "fooN"
The argument numbering does not have to be sequential
If number of args that match <= args[_limit] (4 default),
returns text list of the form "A, B, C and D"
otherwise returns collapsible list ({{clist}})
--]]
function p._main(args)
local pattern = "^"..args[1].."_?(%d+)$" -- pattern to match
local values = {}
for k, v in pairs(args) do --- loop through all arguments
if k == args[1] then --- if argument is just "foo", put it first
values[1] = v
else
ord = tonumber(mw.ustring.match(k,pattern)) --- if "foo_?%d+", extract number
if ord then
values[ord+2] = v --- put value into list at number+2 (to keep "foo" first, even for foo0)
end
end
end
values = compressSparseArray(values) --- squeeze out gaps/nils in values, keep ordering
local limit = tonumber(args._limit) or 4
if #values > limit then
return clist(values) --- if longer than limit, call Module:Collapsible list
end
return mw.text.listToText(values) --- otherwise just print out pretty text list
end
function p.main(frame)
local args = getArgs(frame)
return p._main(args)
end
return p