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 function getListItem( data )
    if not type( data ) == 'string' then
        return ''
    end
    return mw.ustring.format( '<li style="line-height: inherit; margin: 0">%s</li>', data )
end

-- Returns an array containing the keys of all positional arguments
-- that contain data (i.e. non-whitespace values).
local function getArgNums( args )
    local nums = {}
    for k, v in pairs( args ) 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 )
    return nums
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 = getArgNums( attributes )
    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 = {}
    local argNums = getArgNums( args )
    if (isEnabled(args, 'listamoodi')) then
    	-- ul, li
	    for i, num in ipairs( argNums ) do
	        table.insert( listItems, getListItem( args[ num ] ) )
	    end
	else
		-- old br-style
	    for i, num in ipairs( argNums ) do
	    	if (i == 0) then
		        table.insert( listItems, args[ num ] )
		    else
		        table.insert( listItems, mw.ustring.format( '<br />%s', args[ num ] ) )
		    end
	    end
	end
    if #listItems == 0 then
        return ''
    end
    listItems = table.concat( listItems )
    
    -- 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, listItems)
	else
	    contentList = 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
    
    local args = {}
    for k, v in pairs( origArgs ) do
        if type( k ) == 'number' or v ~= '' then
            args[ k ] = v
        end
    end
    return buildList( args )
end

return p