Difference between revisions of "Module:List"
From BESA® Wiki
m (1 revision) |
(Create modified version of Module:Bulleted list. The code is by myself and User:Frietjes.) |
||
(26 intermediate revisions by 2 users not shown) | |||
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, and numbered lists are supported. |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
local p = {} | local p = {} | ||
− | local | + | local function getListItem(data, style, itemStyle) |
− | + | if not data then | |
− | + | return nil | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | function | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | if | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | + | if style or itemStyle then | |
− | + | style = style or '' | |
− | if | + | itemStyle = itemStyle or '' |
− | + | return mw.ustring.format( | |
+ | '<li style="%s%s">%s</li>', | ||
+ | style, itemStyle, 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 | + | 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' then | |
− | + | table.insert(classes, 'hlist') | |
− | + | elseif listType == 'unbulleted' then | |
− | + | table.insert(classes, 'plainlist') | |
end | end | ||
− | + | table.insert(classes, class) | |
− | + | local ret | |
− | local | + | if #classes == 0 then |
− | + | return nil | |
− | + | ||
end | end | ||
− | + | return mw.ustring.format(' class="%s"', table.concat(classes, ' ')) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | function | + | local function getStyle(listType, indent, style) |
− | local | + | 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 | + | if #styles == 0 then |
− | + | return nil | |
end | end | ||
− | return | + | return mw.ustring.format(' style="%s"', table.concat(styles, ' ')) |
end | end | ||
function p.makeList(listType, args) | 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 | end | ||
− | + | if #listItems == 0 then | |
− | + | return '' | |
− | local | + | end |
− | local | + | -- Check if we need a ul tag or an ol tag. |
− | return | + | 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 | 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 | ||
+ | else | ||
+ | origArgs = frame | ||
+ | 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'} | ||
+ | |||
+ | for _, funcName in ipairs(funcNames) do | ||
+ | p[funcName] = makeWrapper(funcName) | ||
end | end | ||
return p | return p |
Revision as of 11:41, 13 November 2013
Documentation for this module may be created at Module:List/doc
Script error: Lua error: Internal error: Error reading from pipe.
-- 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 '' 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 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 table.insert(styles, style) if #styles == 0 then return nil end return mw.ustring.format(' style="%s"', table.concat(styles, ' ')) 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