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

(first attempt to add support for list-style-type, but broken for now)
(convert to Module:HtmlBuilder and fix list-style-type support)
Line 3: Line 3:
  
 
local p = {}
 
local p = {}
 +
 +
local htmlBuilder = require('Module:HtmlBuilder')
  
 
local function getListItem(data, style, itemStyle)
 
local function getListItem(data, style, itemStyle)
Line 8: Line 10:
 
return nil
 
return nil
 
end
 
end
if style or itemStyle then
+
local item = htmlBuilder.create('li')
style = style or ''
+
item
itemStyle = itemStyle or ''
+
.cssText(style)
return mw.ustring.format(
+
.cssText(itemStyle)
'<li style="%s%s">%s</li>',
+
.wikitext(data)
style, itemStyle, data
+
return tostring(item)
)
 
else
 
return mw.ustring.format(
 
'<li>%s</li>',
 
data
 
)
 
end
 
 
end
 
end
  
Line 37: Line 32:
 
table.sort(nums)
 
table.sort(nums)
 
return nums
 
return nums
end
 
 
local function getClass(listType, args)
 
local classes = {}
 
if listType == 'horizontal' or listType == 'horizontal_ordered' then
 
table.insert(classes, 'hlist')
 
elseif listType == 'unbulleted' then
 
table.insert(classes, 'plainlist')
 
end
 
table.insert(classes, args.class)
 
local ret
 
if #classes == 0 then
 
return nil
 
end
 
return mw.ustring.format(' class="%s"', table.concat(classes, ' '))
 
end
 
 
local function getStyle(listType, args)
 
local styles = {}
 
if listType == 'horizontal' or listType == 'horizontal_ordered' then
 
local indent = args.indent and tonumber(indent)
 
indent = tostring((indent and indent * 1.6) or 0)
 
table.insert(styles, 'margin-left: ' .. indent .. 'em;')
 
end
 
local listStyleType = args['list-style-type']
 
if listStyleType then
 
table.insert(styles, 'list-style-type: ' .. listStyleType .. ';')
 
end
 
table.insert(styles, args.style)
 
if #styles == 0 then
 
return nil
 
end
 
return mw.ustring.format(' style="%s"', table.concat(styles, ' '))
 
 
end
 
end
  
Line 88: Line 50:
 
return ''
 
return ''
 
end
 
end
-- Check if we need a ul tag or an ol tag, and get the start and type attributes for ordered lists.
+
-- Build the list html.
local listTag = 'ul'
+
local root = htmlBuilder.create('div')
local startAttr, typeAttr
+
if listType == 'horizontal' or listType == 'horizontal_ordered' then
if listType == 'ordered' or listType == 'horizontal_ordered' then
+
root.addClass('hlist')
listTag = 'ol'
+
elseif listType == 'unbulleted' then
startAttr = args.start
+
root.addClass('plainlist')
if startAttr then
+
end
startAttr = ' start="' .. startAttr .. '"'
+
root.addClass(args.class)
end
+
if listType == 'horizontal' or listType == 'horizontal_ordered' then
typeAttr = args.type
+
local indent = args.indent and tonumber(indent)
if typeAttr then
+
indent = tostring((indent and indent * 1.6) or 0)
typeAttr = ' type="' .. typeAttr .. '"'
+
root.css('margin-left', indent .. 'em')
end
 
 
end
 
end
startAttr = startAttr or ''
+
root.cssText(args.style)
typeAttr = typeAttr or ''
+
local list = root.tag((listType == 'ordered' or listType == 'horizontal_ordered') and 'ol' or 'ul')
-- Get the classes and styles and output the list.
+
list
local class = getClass(listType, args) or ''
+
.attr('start', args.start)
local style = getStyle(listType, args) or ''
+
.attr('type', args.type)
local list_style = 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.
+
.css('list-style-type', args['list-style-type'])
list_style = list_style and (' style="' .. list_style .. '"') or ''
+
.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.
return mw.ustring.format(
+
.wikitext(table.concat(listItems))
'<div%s%s><%s%s%s%s>%s</%s></div>',
+
return tostring(root)
class, style, listTag, startAttr, typeAttr, list_style, table.concat(listItems), listTag
 
)
 
 
end
 
end
  

Revision as of 02:00, 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 = args.indent and tonumber(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'])
		.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