| 此模块已评为通行版,稳定可靠,可各处使用无误。已可在帮助页面和其他维基百科资源中提及,以帮助新用户学习。为降低服务器负载和错误输出,改善本模块前应进行沙盒测试,而不是重复的试错性编辑。 |
This module outputs an unbulleted list. It has two functions: unbulleted
, for a normal unbulleted list, and hlist
, for a horizontal list using the hlist
class (see WP:HLIST). It supersedes the templates {{unbulleted list}} and {{hlist}}.
- Quick usage
{{#invoke:unbulleted list|unbulleted|first item|second item|third item|...}}
- All parameters
{{#invoke:unbulleted list|unbulleted
|first item|second item|third item|...
|class = class
|style = style
|ul_style = style for ul tag
|li_style = style for all li tags
|li_style1 = style for first li tag |li_style2 = style for second li tag |...
}}
- Arguments passed from parent template
{{#invoke:unbulleted list|unbulleted}}
- Quick usage
{{#invoke:unbulleted list|hlist|first item|second item|third item|...}}
- All parameters
{{#invoke:unbulleted list|hlist
|first item|second item|third item|...
|class = class
|style = style
|ul_style = style for ul tag
|li_style = style for all li tags
|li_style1 = style for first li tag |li_style2 = style for second li tag |...
|indent = indent for the list
}}
- Arguments passed from parent template
{{#invoke:unbulleted list|hlist}}
- Positional parameters (
1
, 2
, 3
...) - these are the list items. If no list items are present, the module will output nothing.
class
- a custom class for the <div>...</div>
tags surrounding the list, e.g. plainlinks
.
style
- a custom css style for the <div>...</div>
tags surrounding the list, e.g. font-size: 90%;
.
ul_style
- a custom css style for the <ul>...</ul>
tags around the list. The format is the same as for the |style=
parameter.
li_style
- a custom css style for all of the list items (the <li>...</li>
tags). The format is the same as for the |style=
parameter.
li_style1
, li_style2
, li_style3
... - custom css styles for each of the list items. The format is the same as for the |style=
parameter.
indent
- for horizontal lists only, this parameter indents the list. The value must be a number, e.g. 2
. The indent is calculated in em, and is 1.6 times the value specified. If no indent is specified, the default is zero.
- Unbulleted lists
Code |
Result
|
{{#invoke:unbulleted list|unbulleted|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}}
|
- entry1
- entry2
- entry3
- entry4
- entry5
- entry6
- entry7
- entry8
- entry9
|
{{#invoke:unbulleted list|unbulleted|Winner|Runner-up|Third place|li_style=color:blue;}}
|
- Winner
- Runner-up
- Third place
|
{{#invoke:unbulleted list|unbulleted|Winner|Runner-up|Third place|li_style1=background-color:yellow;|li_style2=background-color:silver;}}
|
- Winner
- Runner-up
- Third place
|
- Horizontal lists
Code |
Result
|
{{#invoke:unbulleted list|hlist|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}}
|
- entry1
- entry2
- entry3
- entry4
- entry5
- entry6
- entry7
- entry8
- entry9
|
{{#invoke:unbulleted list|hlist|Winner|Runner-up|Third place|li_style=color:blue;}}
|
- Winner
- Runner-up
- Third place
|
{{#invoke:unbulleted list|hlist|Winner|Runner-up|Third place|li_style=color:blue;|indent=2}}
|
- Winner
- Runner-up
- Third place
|
{{#invoke:unbulleted list|hlist|Winner|Runner-up|Third place|li_style1=background-color:yellow;|li_style2=background-color:silver;}}
|
- Winner
- Runner-up
- Third place
|
-- This module implements {{unbulleted list}} and {{hlist}}.
local function getListItem( data, style, itemStyle )
if not data then
return nil
end
if style or itemStyle then
style = style or ''
itemStyle = itemStyle or ''
return mw.ustring.format(
'<li style="%s%s">%s</li>',
style, itemStyle, data
)
else
return mw.ustring.format(
'<li>%s</li>',
data
)
end
end
local function getArgNums( args )
-- Returns an array containing the keys of all positional arguments
-- that contain data (i.e. non-whitespace values).
local nums = {}
for k, v in pairs( args ) do
if type( k ) == 'number' and
k >= 1 and
math.floor( k ) == k and
mw.ustring.match( v, '%S' ) then
table.insert( nums, k )
end
end
table.sort( nums )
return nums
end
local function getClass( listType, class )
local classes = {}
if listType == 'hlist' then
table.insert( classes, 'hlist' )
else
table.insert( classes, 'plainlist' )
end
table.insert( classes, class )
local ret
if #classes == 0 then
return nil
end
return mw.ustring.format( ' class="%s"', table.concat( classes, ' ' ) )
end
local function getStyle( listType, indent, style )
local styles = {}
if listType == 'hlist' then
indent = indent and tonumber( indent )
indent = tostring( ( indent and indent * 1.6 ) or 0 )
table.insert( styles, 'margin-left: ' .. indent .. 'em;' )
end
table.insert( styles, style )
if #styles == 0 then
return nil
end
return mw.ustring.format( ' style="%s"', table.concat( styles, ' ' ) )
end
local function buildList( args, listType )
local listItems = {}
local argNums = getArgNums( args )
for i, num in ipairs( argNums ) do
local item = getListItem(
args[ num ],
args.li_style,
args[ 'li_style' .. tostring( num ) ]
)
table.insert( listItems, item )
end
if #listItems == 0 then
return ''
end
local class = getClass( listType, args.class ) or ''
local style = getStyle( listType, args.indent, args.style ) or ''
local ulStyle = ( args.ul_style and ( ' style="' .. args.ul_style .. '"' ) ) or ''
return mw.ustring.format(
'<div%s%s><ul%s>%s</ul></div>',
class, style, ulStyle, table.concat( listItems )
)
end
local function makeWrapper( listType )
return function( frame )
local origArgs
if frame == mw.getCurrentFrame() then
origArgs = frame:getParent().args
for k, v in pairs( frame.args ) do
origArgs = frame.args
break
end
else
origArgs = frame
end
local args = {}
for k, v in pairs( origArgs ) do
if type( k ) == 'number' or v ~= '' then
args[ k ] = v
end
end
return buildList( args, listType )
end
end
return {
hlist = makeWrapper( 'hlist' ),
unbulleted = makeWrapper( 'unbulleted' )
}