Module:Unbulleted list

From Sudo Room
Jump to navigation Jump to search

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}}.

Usage

Unbulleted list

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}}

Horizontal list

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}}

Parameters

  • 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.

Examples

Unbulleted lists
Code Result
{{#invoke:unbulleted list|unbulleted|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted
{{#invoke:unbulleted list|unbulleted|Winner|Runner-up|Third place|li_style=color:blue;}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted
{{#invoke:unbulleted list|unbulleted|Winner|Runner-up|Third place|li_style1=background-color:yellow;|li_style2=background-color:silver;}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted
Horizontal lists
Code Result
{{#invoke:unbulleted list|hlist|entry1|entry2|entry3|entry4|entry5|entry6|entry7|entry8|entry9}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted
{{#invoke:unbulleted list|hlist|Winner|Runner-up|Third place|li_style=color:blue;}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted
{{#invoke:unbulleted list|hlist|Winner|Runner-up|Third place|li_style=color:blue;|indent=2}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted
{{#invoke:unbulleted list|hlist|Winner|Runner-up|Third place|li_style1=background-color:yellow;|li_style2=background-color:silver;}} Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted

Script error: Lua error: Cannot create process: proc_open(/dev/null): failed to open stream: Operation not permitted

-- 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' )
}