Editing Module:List
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, ordered, and horizontal ordered lists are supported. | ||
local p = {} | local p = {} | ||
local | local htmlBuilder = require('Module:HtmlBuilder') | ||
function | local function getListItem(data, style, itemStyle, itemValue) | ||
if not data then | |||
return c | |||
if | |||
end | end | ||
local item = htmlBuilder.create('li') | |||
item | |||
.cssText(style) | |||
.cssText(itemStyle) | |||
.wikitext(data) | |||
if(itemValue) then | |||
item.attr('value',itemValue) | |||
end | end | ||
return tostring(item) | |||
end | |||
local function getArgNums(args) | |||
-- Returns an array containing the keys of all positional arguments | |||
if | -- that contain data (i.e. non-whitespace values). | ||
and | 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 | |||
end | |||
-- | function p.makeList(listType, args) | ||
-- This is the main function to be called from other Lua modules. | |||
-- 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)], | |||
args['item_value' .. tostring(num)] | |||
) | |||
table.insert(listItems, item) | |||
end | end | ||
if #listItems == 0 then | |||
return '' | return '' | ||
end | end | ||
-- Build the list html. | |||
-- | local root = htmlBuilder.create('div') | ||
local root = | if listType == 'horizontal' or listType == 'horizontal_ordered' then | ||
root.addClass('hlist') | |||
root | elseif listType == 'unbulleted' then | ||
root.addClass('plainlist') | |||
end | end | ||
root | root.addClass(args.class) | ||
if | if listType == 'horizontal' or listType == 'horizontal_ordered' then | ||
local indent = tonumber(args.indent) | |||
indent = tostring((indent and indent * 1.6) or 0) | |||
root.css('margin-left', indent .. 'em') | |||
end | end | ||
-- Detect if the type attribute specified by args.type is using an invalid value, and if so try passing it as a list-style-type CSS property. | |||
-- | local listStyleType = args.list_style_type or args['list-style-type'] | ||
local listType = args['type'] | |||
if listType and not listType:match('^%s*[1AaIi]%s*$') then | |||
if | if not listStyleType then | ||
listStyleType = listType | |||
listType = nil | |||
end | end | ||
end | end | ||
root.cssText(args.style) | |||
local list = root.tag((listType == 'ordered' or listType == 'horizontal_ordered') and 'ol' or 'ul') | |||
list | |||
.attr('start', args.start) | |||
.attr('type', listType) | |||
.css('list-style-type', listStyleType) | |||
.cssText(args.list_style or args.ul_style or args.ol_style) -- ul_style and ol_style are included for backwards compatibility. No distinction is made for ordered or unordered lists. | |||
.wikitext(table.concat(listItems)) | |||
return tostring(root) | return tostring(root) | ||
end | end | ||
function | local function makeWrapper(listType) | ||
local | return function(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 | 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', 'ordered', 'horizontal_ordered'} | |||
for _, funcName in ipairs(funcNames) do | |||
p[funcName] = makeWrapper(funcName) | |||
end | end | ||
return p | return p |