Module:Prop list

require "table"

local p = {}

-- Create a method which is a simple concatenation of function applications -- makeExpand(frame) => expand(x) function expandingMethod(makeExpand) return function(frame) local args = frame.args local list = args.list if list == "" then return "" end local expand = makeExpand(frame) local link = (args.link == "yes") if args.link == 'yes' then local oldx = expand expand = function(x, i) return  .. oldx(x, i) ..  end end local name = args.name local out = "" local i = 1 for x in mw.text.gsplit(list, args.sep) do out = out .. expand(x, i)			mw.smw.set{name, x}			i = i + 1 end return out end end

-- Apply a template to each item in the list p.apply = expandingMethod(function(frame)	local tpl = frame.args.tpl	return function(x)		return frame:expandTemplate{title=tpl, args={x}}	end end)

p.wikilist = expandingMethod(function(frame)	local args = frame.args	local tpl = args.tpl	local prefix = args.prefix	if tpl and tpl ~= "" then		return function(x)			return prefix .. frame:expandTemplate{title=tpl, args={x}} .. '\n'		end	else		return function(x)			return prefix .. x .. '\n'		end	end end)

function listingMethod(makeExpand) return function(frame) local args = frame.args local list = args.list if list == "" then return "" end local expand = makeExpand(frame) if args.link == 'yes' then local oldx = expand expand = function(x, i) return  .. oldx(x, i) ..  end end local join = args.join local final = args.final local xtpl = expand expand = function(x, i)			if i == 1 then return xtpl(x) elseif i == #args then return final .. xtpl(x) else return join .. xtpl(x) end end local name = args.name local out = "" local i = 1 for x in mw.text.gsplit(list, args.sep) do out = out .. expand(x, i)			mw.smw.set{name, x}			i = i + 1 end return out end end

p.list = listingMethod(function(frame)	local tpl = frame.args.tpl	if tpl and tpl ~= "" then		return function(x)			return frame:expandTemplate{title=tpl, args={x}}		end	else		return function(x)			return x		end	end end)

-- x p.prefix = listingMethod(function(frame)	local tpl = frame.args.tpl	return function(x)		return frame:expandTemplate{title="pair", args = {			frame:expandTemplate{title=tpl, args={x}}, x		}}	end end)

-- x p.suffix = listingMethod(function(frame)	local tpl = frame.args.tpl	return function(x)		return frame:expandTemplate{title="pair", args = {			x, frame:expandTemplate{title=tpl, args={x}}		}}	end end)

-- Output just the first item function p.first(frame) local args = frame.args local list = args.list if list == "" then return "" end local name = args.name list = mw.text.split(list, args.sep) local out = list[1] table.remove(list, 1) mw.smw.set{name, out} for i, x in ipairs(list) do		mw.smw.set{name, x}	end return out end

-- Output just the last item function p.last(frame) local args = frame.args local list = args.list if list == "" then return "" end local name = args.name local out for x in mw.text.gsplit(list, args.sep) do		out = x		mw.smw.set{name, x}	end return out end

return p