The wiki has moved!

Visit the new wiki at stationeers-wiki.com The old wiki here at legacy.stationeers-wiki.com will sunset eventually.

Edits made after the 7th of March 6PM EST were NOT carried over to the new server as previously announced right here in this box.

 Actions

Module

Difference between revisions of "List"

From Unofficial Stationeers Wiki

m (Protected Module:List: High-risk Lua module: ~1,100 transclusions ([Edit=Allow only autoconfirmed users] (indefinite) [Move=Allow only autoconfirmed users] (indefinite)))
(add fix to make the start parameter work with horizontal ordered lists, and switch to Module:Arguments for argument processing)
Line 4: Line 4:
 
local p = {}
 
local p = {}
  
 +
local getArgs = require('Module:Arguments').getArgs
 
local htmlBuilder = require('Module:HtmlBuilder')
 
local htmlBuilder = require('Module:HtmlBuilder')
  
Line 22: Line 23:
  
 
local function getArgNums(args)
 
local function getArgNums(args)
-- Returns an array containing the keys of all positional arguments
+
-- Returns an array containing the keys of all positional arguments that contain data (i.e. non-whitespace values).
-- that contain data (i.e. non-whitespace values).
 
 
local nums = {}
 
local nums = {}
 
for k, v in pairs(args) do
 
for k, v in pairs(args) do
Line 84: Line 84:
 
-- Build the list tags and list items.
 
-- Build the list tags and list items.
 
local list = root.tag((listType == 'ordered' or listType == 'horizontal_ordered') and 'ol' or 'ul')
 
local list = root.tag((listType == 'ordered' or listType == 'horizontal_ordered') and 'ol' or 'ul')
 +
local start = args.start
 +
list
 +
.attr('start', start)
 +
if listType == 'horizontal_ordered' then
 +
-- Apply fix to get start numbers working with horizontal ordered lists.
 +
local startNum = tonumber(start)
 +
if startNum then
 +
list.css('counter-reset', 'listitem ' .. tostring(startNum - 1))
 +
end
 +
end
 
list
 
list
.attr('start', args.start)
 
 
.attr('type', typeAttr)
 
.attr('type', typeAttr)
 
.css('list-style-type', listStyleType)
 
.css('list-style-type', listStyleType)
Line 95: Line 104:
 
local function makeWrapper(listType)
 
local function makeWrapper(listType)
 
return function(frame)
 
return function(frame)
local origArgs
+
local args = getArgs(frame, {
if frame == mw.getCurrentFrame() then
+
valueFunc = function (key, value)
origArgs = frame:getParent().args
+
if type(key) == 'number' or value ~= '' then
for k, v in pairs(frame.args) do
+
return value
origArgs = frame.args
+
end
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
end
+
})
 
return p.makeList(listType, args)
 
return p.makeList(listType, args)
 
end
 
end

Revision as of 22:15, 6 January 2014

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 getArgs = require('Module:Arguments').getArgs
local htmlBuilder = require('Module:HtmlBuilder')

local function getListItem(data, style, itemStyle, itemValue)
	if not data then
		return c
	end
	local item = htmlBuilder.create('li')
	item
		.cssText(style)
		.cssText(itemStyle)
		.wikitext(data)
	if(itemValue) then
		item.attr('value',itemValue)
	end
	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)],
			args['item_value' .. tostring(num)]
		)
		table.insert(listItems, item)
	end
	if #listItems == 0 then
		return ''
	end
	-- Build the opening div tag.
	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
	-- If we are outputting an ordered list or an ordered horizontal list, get the type and list-style-type.
	-- Horizontal ordered lists aren't supported yet, but including them anyway in case support is ever added to the CSS backend.
	local listStyleType, typeAttr
	if listType == 'ordered' or listType == 'horizontal_ordered' then 
		listStyleType = args.list_style_type or args['list-style-type']
		typeAttr = args['type']
	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.
	if typeAttr and not typeAttr:match('^%s*[1AaIi]%s*$') then
		if not listStyleType then
			listStyleType = typeAttr
			typeAttr = nil
		end
	end
	root.cssText(args.style)
	-- Build the list tags and list items.
	local list = root.tag((listType == 'ordered' or listType == 'horizontal_ordered') and 'ol' or 'ul')
	local start = args.start
	list
		.attr('start', start)
	if listType == 'horizontal_ordered' then
		-- Apply fix to get start numbers working with horizontal ordered lists.
		local startNum = tonumber(start)
		if startNum then
			list.css('counter-reset', 'listitem ' .. tostring(startNum - 1))
		end
	end
	list
		.attr('type', typeAttr)
		.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)
end

local function makeWrapper(listType)
	return function(frame)
		local args = getArgs(frame, {
			valueFunc = function (key, value)
				if type(key) == 'number' or value ~= '' then
					return value
				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