Jump to content

Module:List

Permanently protected module
From Wikipedia, the free encyclopedia

locallibUtil=require('libraryUtil')
localcheckType=libUtil.checkType
localmTableTools=require('Module:TableTools')

localp={}

locallistTypes={
['bulleted']=true,
['unbulleted']=true,
['horizontal']=true,
['ordered']=true,
['horizontal_ordered']=true
}

functionp.makeListData(listType,args)
-- Constructs a data table to be passed to p.renderList.
localdata={}

-- Classes and TemplateStyles
data.classes={}
data.templatestyles=''
iflistType=='horizontal'orlistType=='horizontal_ordered'then
table.insert(data.classes,'hlist')
data.templatestyles=mw.getCurrentFrame():extensionTag{
name='templatestyles',args={src='Hlist/styles.css'}
}
elseiflistType=='unbulleted'then
table.insert(data.classes,'plainlist')
data.templatestyles=mw.getCurrentFrame():extensionTag{
name='templatestyles',args={src='Plainlist/styles.css'}
}
end
table.insert(data.classes,args.class)

-- Main div style
data.style=args.style

-- Indent for horizontal lists
iflistType=='horizontal'orlistType=='horizontal_ordered'then
localindent=tonumber(args.indent)
indent=indentandindent*1.6or0
ifindent>0then
data.marginLeft=indent..'em'
end
end

-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
iflistType=='ordered'orlistType=='horizontal_ordered'then
data.listStyleType=args.list_style_typeorargs['list-style-type']
data.type=args['type']

-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
ifdata.type
andnotdata.listStyleType
andnottostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType=data.type
data.type=nil
end
end

-- List tag type
iflistType=='ordered'orlistType=='horizontal_ordered'then
data.listTag='ol'
else
data.listTag='ul'
end

-- Start number for ordered lists
data.start=args.start
iflistType=='horizontal_ordered'then
-- Apply fix to get start numbers working with horizontal ordered lists.
localstartNum=tonumber(data.start)
ifstartNumthen
data.counterReset='listitem '..tostring(startNum-1)
end
end

-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle=args.list_style

-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle=args.item_styleorargs.li_style
data.items={}
for_,numinipairs(mTableTools.numKeys(args))do
localitem={}
item.content=args[num]
item.style=args['item'..tostring(num)..'_style']
orargs['item_style'..tostring(num)]
item.value=args['item'..tostring(num)..'_value']
orargs['item_value'..tostring(num)]
table.insert(data.items,item)
end

returndata
end

functionp.renderList(data)
-- Renders the list HTML.

-- Return the blank string if there are no list items.
iftype(data.items)~='table'or#data.items<1then
return''
end

-- Render the main div tag.
localroot=mw.html.create('div')
for_,classinipairs(data.classesor{})do
root:addClass(class)
end
root:css{['margin-left']=data.marginLeft}
ifdata.stylethen
root:cssText(data.style)
end

-- Render the list tag.
locallist=root:tag(data.listTagor'ul')
list
:attr{start=data.start,type=data.type}
:css{
['counter-reset']=data.counterReset,
['list-style-type']=data.listStyleType
}
ifdata.listStylethen
list:cssText(data.listStyle)
end

-- Render the list items
for_,tinipairs(data.itemsor{})do
localitem=list:tag('li')
ifdata.itemStylethen
item:cssText(data.itemStyle)
end
ift.stylethen
item:cssText(t.style)
end
item
:attr{value=t.value}
:wikitext(t.content)
end

returndata.templatestyles..tostring(root)
end

functionp.renderTrackingCategories(args)
localisDeprecated=false-- Tracks deprecated parameters.
fork,vinpairs(args)do
k=tostring(k)
ifk:find('^item_style%d+$')ork:find('^item_value%d+$')then
isDeprecated=true
break
end
end
localret=''
ifisDeprecatedthen
ret=ret..'[[Category:List templates with deprecated parameters]]'
end
returnret
end

functionp.makeList(listType,args)
ifnotlistTypeornotlistTypes[listType]then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
),2)
end
checkType('makeList',2,args,'table')
localdata=p.makeListData(listType,args)
locallist=p.renderList(data)
localtrackingCategories=p.renderTrackingCategories(args)
returnlist..trackingCategories
end

forlistTypeinpairs(listTypes)do
p[listType]=function(frame)
localmArguments=require('Module:Arguments')
localorigArgs=mArguments.getArgs(frame,{
frameOnly=((frameandframe.argsandframe.args.frameonlyor'')~=''),
valueFunc=function(key,value)
ifnotvalueornotmw.ustring.find(value,'%S')thenreturnnilend
ifmw.ustring.find(value,'^%s*[%*#;:]')then
returnvalue
else
returnvalue:match('^%s*(.-)%s*$')
end
returnnil
end
})
-- Copy all the arguments to a new table, for faster indexing.
localargs={}
fork,vinpairs(origArgs)do
args[k]=v
end
returnp.makeList(listType,args)
end
end

returnp