-- This module implements .  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  	end 	return end  local function getListItem( data )     if not type( data ) == 'string' then         return      end     return mw.ustring.format( '%s', 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 'তালিকা'     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 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