پودمان:Collapsible list

    از ویکی‌نور

    توضیحات این پودمان می‌تواند در پودمان:Collapsible list/توضیحات قرار گیرد.

    -- This module implements {{collapsible list}}.
    
    local p = {}
    
    local function gettitlestyletracking( ts )
    	if not ts then return '' end
    	ts = mw.ustring.gsub(mw.ustring.lower(ts), '%s', '')
    	local tsvals = mw.text.split(ts, ';')
    	table.sort(tsvals)
    	local skey = table.concat(tsvals,';')
    	skey = mw.ustring.gsub(skey, '^;', '')
    	skey = mw.text.encode(mw.text.encode(skey),'%c%[%]=')
    	if (mw.ustring.match(';' .. ts, ';background:') or mw.ustring.match(';' .. ts, ';background%-color:')) 
    		and mw.ustring.match(';' .. ts, ';text%-align:') then 
    		return '[[Category:Pages using collapsible list with both background and text-align in titlestyle|' .. skey .. ' ]]'
    	end
    	return '[[Category:Pages using collapsible list without both background and text-align in titlestyle|' .. skey .. ' ]]'
    end
    
    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
    
    -- 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 )
        for i, num in ipairs( argNums ) do
            table.insert( listItems, getListItem( args[ num ] ) )
        end
        if #listItems == 0 then
            return ''
        end
        listItems = table.concat( listItems )
    
    	-- hack around mw-collapsible show/hide jumpiness by looking for text-alignment
    	-- by setting a margin if centered
    	local textAlignmentCentered = 'text%-align%s*:%s*center'
    	local centeredTitle = (args.title_style and args.title_style:lower():match(textAlignmentCentered)
    		or args.titlestyle and args.titlestyle:lower():match(textAlignmentCentered))
    	local centeredTitleSpacing
    	if centeredTitle then
    		centeredTitleSpacing = 'margin: 0 4em'
    	else
    		centeredTitleSpacing = ''
    	end
    
        -- Get class, style and title data.
        local collapsibleContainerClass = formatAttributes(
        	'class',
        	'mw-collapsible', not args.expand and 'mw-collapsed'
        )
        local collapsibleContainerStyle = formatAttributes(
            'style',
            'text-align: center; font-size: 95%;',
            args.frame_style,
            args.framestyle
        )
        local collapsibleTitleStyle = formatAttributes(
            'style',
            'line-height: 1.6em; font-weight: bold; font-size: 100%; text-align: left;',
            args.title_style,
            args.titlestyle
        )
        local jumpyTitleStyle = formatAttributes(
            'style',
            centeredTitleSpacing
        )
        local title = args.title or 'List'
        local ulclass = formatAttributes( 'class', 'mw-collapsible-content', args.hlist and 'hlist' )
        local ulstyle = formatAttributes( 
            'style',
            'font-size: 105%; margin-top: 0; margin-bottom: 0; line-height: inherit; text-align: left;',
            not args.bullets and 'list-style: none; margin-left: 0;',
            args.list_style,
            args.liststyle
        )
        
        -- Build the list.
        return mw.ustring.format( 
            '<div%s%s>\n<div%s><div%s>%s</div></div>\n<ul%s%s>%s</ul>\n</div>',
            collapsibleContainerClass, collapsibleContainerStyle,
            collapsibleTitleStyle, jumpyTitleStyle, title, ulclass, ulstyle, listItems
        ) .. gettitlestyletracking(args.title_style or args.titlestyle)
    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