Module:Compact list
File:Full-protection-shackle.svg | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
Usage
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}}
Examples
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
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