Actions

Module

Difference between revisions of "List"

From Unofficial Stationeers Wiki

(change the "type" parameter to the slightly less generic "marker")
(Undid revision 581617993 by Mr. Stradivarius (talk) actually, this is no longer necessary due to changes in Module:Random)
Line 67: Line 67:
 
list
 
list
 
.attr('start', args.start)
 
.attr('start', args.start)
.attr('type', args.marker)
+
.attr('type', args.type)
 
.css('list-style-type', args.list_style_type or args['list-style-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.
 
.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.

Revision as of 08:23, 14 November 2013

Documentation for this module may be created at Module:List/doc

-- This module outputs different kinds of lists. At the moment, bulleted, unbulleted,
-- horizontal, ordered, and horizontal ordered lists are supported.

local p = {}

local htmlBuilder = require('Module:HtmlBuilder')

local function getListItem(data, style, itemStyle)
	if not data then
		return nil
	end
	local item = htmlBuilder.create('li')
	item
		.cssText(style)
		.cssText(itemStyle)
		.wikitext(data)
	return tostring(item)
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

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
	-- Build the list html.
	local root = htmlBuilder.create('div')
	if listType == 'horizontal' or listType == 'horizontal_ordered' then
		root.addClass('hlist')
	elseif listType == 'unbulleted' then
		root.addClass('plainlist')
	end
	root.addClass(args.class)
	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
	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)
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', 'ordered', 'horizontal_ordered'}

for _, funcName in ipairs(funcNames) do
	p[funcName] = makeWrapper(funcName)
end

return p