Module:List

-- This module outputs different kinds of lists. At the moment, bulleted,-- unbulleted, horizontal, ordered, and horizontal ordered lists are supported.locallibUtil=require('libraryUtil')localcheckType=libUtil.checkTypelocalmTableTools=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={}-- Classesdata.classes={}iflistType=='horizontal'orlistType=='horizontal_ordered'thentable.insert(data.classes,'hlist')elseiflistType=='unbulleted'thentable.insert(data.classes,'plainlist')endtable.insert(data.classes,args.class)-- Main div styledata.style=args.style-- Indent for horizontal listsiflistType=='horizontal'orlistType=='horizontal_ordered'thenlocalindent=tonumber(args.indent)indent=indentandindent*1.6or0ifindent>0thendata.marginLeft=indent..'em'endend-- 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'thendata.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.typeandnotdata.listStyleTypeandnottostring(data.type):find('^%s*[1AaIi]%s*$')thendata.listStyleType=data.typedata.type=nilendend-- List tag typeiflistType=='ordered'orlistType=='horizontal_ordered'thendata.listTag='ol'elsedata.listTag='ul'end-- Start number for ordered listsdata.start=args.startiflistType=='horizontal_ordered'then-- Apply fix to get start numbers working with horizontal ordered lists.localstartNum=tonumber(data.start)ifstartNumthendata.counterReset='listitem '..tostring(startNum-1)endend-- 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_styledata.items={}fori,numinipairs(mTableTools.numKeys(args))dolocalitem={}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)endreturndataendfunctionp.renderList(data)-- Renders the list HTML.-- Return the blank string if there are no list items.iftype(data.items)~='table'or#data.items<1thenreturn''end-- Render the main div tag.localroot=mw.html.create('div')fori,classinipairs(data.classesor{})doroot:addClass(class)endroot:css{['margin-left']=data.marginLeft}ifdata.stylethenroot: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.listStylethenlist:cssText(data.listStyle)end-- Render the list itemsfori,tinipairs(data.itemsor{})dolocalitem=list:tag('li')ifdata.itemStylethenitem:cssText(data.itemStyle)endift.stylethenitem:cssText(t.style)enditem:attr{value=t.value}:wikitext(t.content)endreturntostring(root)endfunctionp.renderTrackingCategories(args)localisDeprecated=false-- Tracks deprecated parameters.fork,vinpairs(args)dok=tostring(k)ifk:find('^item_style%d+$')ork:find('^item_value%d+$')thenisDeprecated=truebreakendendlocalret=''ifisDeprecatedthenret=ret..'[[Category:List templates with deprecated parameters]]'endreturnretendfunctionp.makeList(listType,args)ifnotlistTypeornotlistTypes[listType]thenerror(string.format("bad argument #1 to 'makeList' ('%s' is not a valid list type)",tostring(listType)),2)endcheckType('makeList',2,args,'table')localdata=p.makeListData(listType,args)locallist=p.renderList(data)localtrackingCategories=p.renderTrackingCategories(args)returnlist..trackingCategoriesendforlistTypeinpairs(listTypes)dop[listType]=function(frame)localmArguments=require('Module:Arguments')localorigArgs=mArguments.getArgs(frame)-- Copy all the arguments to a new table, for faster indexing.localargs={}fork,vinpairs(origArgs)doargs[k]=vendreturnp.makeList(listType,args)endendreturnp