Moduuli:Collapsible list

Wikipediasta
Siirry navigaatioon Siirry hakuun

Tämän moduulin ohjeistuksen voi tehdä sivulle Moduuli:Collapsible list/ohje

-- This module implements {{collapsible list}}.

local p = {}
local argList

local function formatListItem( data )
	-- nil and non-string (table?) checks
	if not data then
        return ''
	end
    if not type( data ) == 'string' then
        return ''
    end
    return mw.ustring.format( '<li style="line-height: inherit; margin: 0">%s</li>', data )
end

local function formatBreakItem( data )
	-- nil and non-string (table?) checks
	if not data then
        return ''
	end
    if not type( data ) == 'string' then
        return ''
    end
    return mw.ustring.format( '<br />%s', data )
end

-- helper for checking with mixed languages
local function isEnabled(args, feature)
	if args[feature] and 
           (args[feature] == 'yes' or args[feature] == 'kyllä') then
		return true
        end

        return false
end
local function isNotEnabled(args, feature)
	if args[feature] and 
           (args[feature] == 'no' or args[feature] == 'ei') then
		return true
        end

        return false
end

-- Formats a list of classes, styles or other attributes.
local function formatAttributes( attrType, ... )
    local attributes = { ... }
    local nums = {}
    -- this should not need so many loops and tables since attributes are primarily defined in callers..
    -- simplify at some point
    for k, v in pairs( attributes ) do
        if type( k ) == 'number' and
            k >= 1 and
            math.floor( k ) == k and
            type( v ) == 'string' and
            mw.ustring.match( v, '%S' ) then
                table.insert( nums, k )
        end
    end
    table.sort( nums )

    local t = {}
    for i, num in ipairs( nums ) do
        table.insert( t, attributes[ num ] )
    end
    if #t == 0 then
        return '' -- Return the blank string so concatenation will work.
    end
    return mw.ustring.format( ' %s="%s"', attrType, table.concat( t, ' ' ) )
end

local function buildList( args )
    -- Get the list items.
    local listItems = {}

    if (isEnabled(args, 'listamoodi')) then
    	-- ul, li
	    for i, val in ipairs( args ) do
	        table.insert( listItems, formatListItem( val ) )
	    end
	else
		-- old br-style
	    for i, val in ipairs( args ) do
	    	if (i == 0) then
		        table.insert( listItems, val )
		    else
		        table.insert( listItems, formatBreakItem( val ) )
		    end
	    end
	end
    if #listItems == 0 then
        return ''
    end

    -- Get class, style and title data.
    local isNotCollapsed = isNotEnabled(args, 'expand') or isNotEnabled(args, 'avattavuus') -- either way disabling default
    local div1class = formatAttributes( 'class', 'NavFrame', not (isNotCollapsed) and 'collapsed' )
    local div1style = formatAttributes(
        'style',
        args.frame_style,
        args.framestyle,
        not ( args.frame_style or args.framestyle ) and 'border: none; padding: 0;'
    )
    local div2class = formatAttributes( 'class', 'NavHead' )
    local div2style = formatAttributes(
        'style',
        'font-size: 105%;',
        args.title_style,
        args.titlestyle,
        not ( args.title_style or args.titlestyle ) and 'background: transparent; text-align: left;'
    )
    local title = args['otsikko'] or args['title'] or 'Otsikko'
    
    -- Build the list.
    local contentList
    if (isEnabled(args, 'listamoodi')) then
	    local ulclass = formatAttributes( 'class', 'NavContent', isEnabled(args, hlist) and 'hlist' )
	    local ulstyle = formatAttributes( 
	        'style',
	        not args.bullets and 'list-style: none none; margin-left: 0;',
	        args.list_style,
	        args.liststyle,
	        not ( args.list_style or args.liststyle ) and 'text-align: left;',
	        'font-size: 105%; margin-top: 0; margin-bottom: 0; line-height: inherit;'
	    )
   	
	    contentList = mw.ustring.format( 
	        '<ul%s%s>%s</ul>',
	        ulclass, ulstyle, table.concat( listItems ))
	else
		contentList = table.concat( listItems, '' )
	end
    return mw.ustring.format( 
        '<div%s%s>\n<div%s%s>%s</div>\n%s\n</div>',
        div1class, div1style, div2class, div2style, title, contentList
    ) 
end

function p.main( 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
    
    argList = {}
    for k, v in pairs( origArgs ) do
        if type( k ) == 'number' or v ~= '' then
            argList[ k ] = v
        end
    end
    return buildList( argList )    
end

return p