Editing List
Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save 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 nil | |
− | |||
− | |||
− | |||
− | 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 | ||
− | + | if args['type'] and not args['type']:match('[1AaIi]') then | |
− | + | if not args['list_style_type'] and not args['list-style-type'] then | |
− | + | args['list_style_type'] = args['type'] | |
− | + | args['type'] = '' | |
− | if | ||
− | |||
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', args.type) | ||
+ | .css('list-style-type', args.list_style_type or args['list-style-type']) | ||
+ | .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 |