Difference between revisions of "Module:List"
Jump to navigation
Jump to search
Create modified version of Module:Bulleted list. The code is by myself and User:Frietjes.
>Raylton P. Sousa |
meta>Mr. Stradivarius (Create modified version of Module:Bulleted list. The code is by myself and User:Frietjes.) |
||
Line 1: | Line 1: | ||
-- | -- This module outputs different kinds of lists. At the moment, bulleted, unbulleted, horizontal, and numbered lists are supported. | ||
-- | |||
-- | local p = {} | ||
- | |||
local function getListItem(data, style, itemStyle) | |||
if not data then | |||
return nil | |||
end | |||
if style or itemStyle then | |||
style = style or '' | |||
return | itemStyle = itemStyle or '' | ||
return mw.ustring.format( | |||
'<li style="%s%s">%s</li>', | |||
style, itemStyle, data | |||
) | |||
else | |||
return mw.ustring.format( | |||
'<li>%s</li>', | |||
data | |||
) | |||
end | |||
end | |||
local function getArgNums(args) | |||
-- 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 | |||
table.sort(nums) | |||
return nums | |||
end | |||
local function getClass(listType, class) | |||
local classes = {} | |||
if listType == 'horizontal' then | |||
table.insert(classes, 'hlist') | |||
elseif listType == 'unbulleted' then | |||
table.insert(classes, 'plainlist') | |||
end | |||
table.insert(classes, class) | |||
local ret | |||
if #classes == 0 then | |||
return nil | |||
end | |||
return mw.ustring.format(' class="%s"', table.concat(classes, ' ')) | |||
end | end | ||
local function getStyle(listType, indent, style) | |||
function | local styles = {} | ||
local | if listType == 'horizontal' then | ||
if | 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, ' ')) | |||
end | 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)] | |||
) | |||
table.insert(listItems, item) | |||
end | |||
if #listItems == 0 then | |||
return '' | |||
end | |||
-- Check if we need a ul tag or an ol tag. | |||
local listTag = 'ul' | |||
if listType == 'numbered' then | |||
listTag = 'ol' | |||
end | |||
-- Get the classes and styles and output the list. | |||
local class = getClass(listType, args.class) or '' | |||
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></div>', | |||
class, style, listTag, list_style, table.concat(listItems), listTag | |||
) | |||
end | |||
local function makeWrapper(listType) | |||
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 | |||
local args = {} | |||
for k, v in pairs(origArgs) do | |||
if type(k) == 'number' or v ~= '' then | |||
args[k] = v | |||
end | |||
end | |||
return p.makeList(listType, args) | |||
end | |||
end | |||
local funcNames = {'bulleted', 'unbulleted', 'horizontal', 'numbered'} | |||
for _, funcName in ipairs(funcNames) do | |||
p[funcName] = makeWrapper(funcName) | |||
end | |||
return p |