Editing Module:List
Jump to navigation
Jump to search
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
-- This module outputs different kinds of lists. At the moment, bulleted, | -- This module outputs different kinds of lists. At the moment, bulleted, unbulleted, | ||
-- | -- horizontal, numbered, and horizontal numbered lists are supported. | ||
local p = {} | local p = {} | ||
local | local function getListItem(data, style, itemStyle) | ||
if not data then | |||
return nil | |||
function | |||
data | |||
end | end | ||
if style or itemStyle then | |||
style = style or '' | |||
itemStyle = itemStyle or '' | |||
return mw.ustring.format( | |||
'<li style="%s%s">%s</li>', | |||
style, itemStyle, data | |||
) | |||
data | |||
else | else | ||
return mw.ustring.format( | |||
'<li>%s</li>', | |||
data | |||
) | |||
end | end | ||
end | |||
-- | local function getArgNums(args) | ||
data. | -- Returns an array containing the keys of all positional arguments | ||
-- that contain data (i.e. non-whitespace values). | |||
local nums = {} | |||
for k, v in pairs(args) do | |||
if type(k) == 'number' and | |||
k >= 1 and | |||
math.floor(k) == k and | |||
mw.ustring.match(v, '%S') then | |||
table.insert(nums, k) | |||
end | end | ||
end | end | ||
table.sort(nums) | |||
return nums | |||
return | |||
end | end | ||
function | local function getClass(listType, class) | ||
local classes = {} | |||
if listType == 'horizontal' or listType == 'horizontal_numbered' then | |||
table.insert(classes, 'hlist') | |||
elseif listType == 'unbulleted' then | |||
table.insert(classes, 'plainlist') | |||
end | end | ||
table.insert(classes, class) | |||
local ret | |||
if #classes == 0 then | |||
return nil | |||
end | end | ||
return mw.ustring.format(' class="%s"', table.concat(classes, ' ')) | |||
end | |||
local function getStyle(listType, indent, style) | |||
local styles = {} | |||
if listType == 'horizontal' then | |||
indent = indent and tonumber(indent) | |||
indent = tostring((indent and indent * 1.6) or 0) | |||
table.insert(styles, 'margin-left: ' .. indent .. 'em;') | |||
end | end | ||
table.insert(styles, style) | |||
if #styles == 0 then | |||
return nil | |||
end | end | ||
return mw.ustring.format(' style="%s"', table.concat(styles, ' ')) | |||
return | |||
end | end | ||
function p. | function p.makeList(listType, args) | ||
-- This is the main function to be called from other Lua modules. | |||
for | -- First, get the list items. | ||
local listItems = {} | |||
local argNums = getArgNums(args) | |||
for i, num in ipairs(argNums) do | |||
local item = getListItem( | |||
args[num], | |||
args.item_style or args.li_style, -- li_style is included for backwards compatibility. item_style was included to be easier to understand for non-coders. | |||
args['item_style' .. tostring(num)] or args['li_style' .. tostring(num)] | |||
) | |||
table.insert(listItems, item) | |||
end | end | ||
if #listItems == 0 then | |||
return '' | |||
end | end | ||
-- Check if we need a ul tag or an ol tag, and get the start and type attributes for ordered lists. | |||
local listTag = 'ul' | |||
local startAttr, typeAttr | |||
if listType == 'numbered' or listType == 'horizontal_numbered' then | |||
if | listTag = 'ol' | ||
startAttr = args.start | |||
" | if startAttr then | ||
startAttr = ' start="' .. startAttr .. '"' | |||
end | |||
typeAttr = args.type | |||
if typeAttr then | |||
typeAttr = ' type="' .. typeAttr .. '"' | |||
end | |||
end | end | ||
startAttr = startAttr or '' | |||
local | typeAttr = typeAttr or '' | ||
local | -- Get the classes and styles and output the list. | ||
local | local class = getClass(listType, args.class) or '' | ||
return | local style = getStyle(listType, args.indent, args.style) or '' | ||
local list_style = args.list_style or args.ul_style -- ul_style is included for backwards compatibility, and will work even with ordered lists. | |||
list_style = list_style and (' style="' .. list_style .. '"') or '' | |||
return mw.ustring.format( | |||
'<div%s%s><%s%s%s%s>%s</%s></div>', | |||
class, style, listTag, startAttr, typeAttr, list_style, table.concat(listItems), listTag | |||
) | |||
end | end | ||
local function makeWrapper(listType) | |||
return function(frame) | |||
local | local origArgs | ||
if frame == mw.getCurrentFrame() then | |||
origArgs = frame:getParent().args | |||
for k, v in pairs(frame.args) do | |||
origArgs = frame.args | |||
break | |||
end | end | ||
else | |||
origArgs = frame | |||
end | end | ||
local args = {} | local args = {} | ||
for k, v in pairs(origArgs) do | for k, v in pairs(origArgs) do | ||
args[k] = v | if type(k) == 'number' or v ~= '' then | ||
args[k] = v | |||
end | |||
end | end | ||
return p.makeList(listType, args) | return p.makeList(listType, args) | ||
end | end | ||
end | |||
local funcNames = {'bulleted', 'unbulleted', 'horizontal', 'numbered', 'horizontal_numbered'} | |||
for _, funcName in ipairs(funcNames) do | |||
p[funcName] = makeWrapper(funcName) | |||
end | end | ||
return p | return p |