<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.zombiepanicsource.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACard_List</id>
	<title>Module:Card List - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.zombiepanicsource.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ACard_List"/>
	<link rel="alternate" type="text/html" href="https://wiki.zombiepanicsource.com/index.php?title=Module:Card_List&amp;action=history"/>
	<updated>2026-05-14T14:58:46Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.zombiepanicsource.com/index.php?title=Module:Card_List&amp;diff=420&amp;oldid=prev</id>
		<title>Wuffesan: Created page with &quot;local p = {} local lib = require(&#039;Module:Feature&#039;) local Card = require(&#039;Module:Card&#039;)._main  function p.main(frame) 	local args = require(&#039;Module:Arguments&#039;).getArgs(frame, { 		parentFirst = true, 		removeBlanks = false, 		wrapper = { &#039;Template:Card List&#039; } 	}) 	return p._main(args) end  function p.splitNote(entry, notePattern) 	if notePattern then 		item, note = entry:match(notePattern) 		if item == nil then -- will be nil if note is not present 			return entry 		end...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.zombiepanicsource.com/index.php?title=Module:Card_List&amp;diff=420&amp;oldid=prev"/>
		<updated>2025-06-11T19:48:10Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {} local lib = require(&amp;#039;Module:Feature&amp;#039;) local Card = require(&amp;#039;Module:Card&amp;#039;)._main  function p.main(frame) 	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, { 		parentFirst = true, 		removeBlanks = false, 		wrapper = { &amp;#039;Template:Card List&amp;#039; } 	}) 	return p._main(args) end  function p.splitNote(entry, notePattern) 	if notePattern then 		item, note = entry:match(notePattern) 		if item == nil then -- will be nil if note is not present 			return entry 		end...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
local lib = require(&amp;#039;Module:Feature&amp;#039;)&lt;br /&gt;
local Card = require(&amp;#039;Module:Card&amp;#039;)._main&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		parentFirst = true,&lt;br /&gt;
		removeBlanks = false,&lt;br /&gt;
		wrapper = { &amp;#039;Template:Card List&amp;#039; }&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitNote(entry, notePattern)&lt;br /&gt;
	if notePattern then&lt;br /&gt;
		item, note = entry:match(notePattern)&lt;br /&gt;
		if item == nil then -- will be nil if note is not present&lt;br /&gt;
			return entry&lt;br /&gt;
		end&lt;br /&gt;
		return item, note&lt;br /&gt;
	end&lt;br /&gt;
	return entry&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.splitParams(entry, paramDelim)&lt;br /&gt;
	local returns = {}&lt;br /&gt;
	if entry:find(&amp;#039;{.-}&amp;#039;) then&lt;br /&gt;
		local params = string.match(entry, &amp;#039;{(.-)}&amp;#039;)&lt;br /&gt;
		entry = entry:gsub(&amp;#039;{.-}&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		params = lib.split(params, paramDelim)&lt;br /&gt;
		for i, param in ipairs(params) do&lt;br /&gt;
			local name, val = string.match(param, &amp;#039;^%s*(.-)%s*[=:]%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
			if name ~= nil and name ~= &amp;#039;&amp;#039; and val ~= nil then --named params&lt;br /&gt;
				returns[name] = val&lt;br /&gt;
			elseif param ~= nil and param ~= &amp;#039;&amp;#039; then --unnamed params&lt;br /&gt;
				table.insert(returns, param)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return entry, returns&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- all the non-boolean params except note_delim&lt;br /&gt;
local PARAMS_NOT_SUPPORTING_BLANKS = {&amp;quot;caption&amp;quot;, &amp;quot;text&amp;quot;, &amp;quot;amount&amp;quot;, &amp;quot;delim&amp;quot;, &amp;quot;amount_delim&amp;quot;, &amp;quot;type&amp;quot;, &amp;quot;caption_width&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local input = args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local itemDelim = args.delim or &amp;#039;;&amp;#039;&lt;br /&gt;
	local countDelim = args.amount_delim or &amp;#039;*&amp;#039;&lt;br /&gt;
	local noteDelim = args.note_delim or &amp;#039;/&amp;#039;&lt;br /&gt;
	local paramDelim = args.param_delim or &amp;#039;$&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	--= handle blanks for non-boolean params&lt;br /&gt;
	for _, paramName in ipairs(PARAMS_NOT_SUPPORTING_BLANKS) do&lt;br /&gt;
		local value = args[paramName]&lt;br /&gt;
		if value == &amp;quot;&amp;quot; then&lt;br /&gt;
			args[paramName] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- put all text after the first noteDelim into the second capture&lt;br /&gt;
	local notePattern&lt;br /&gt;
	if lib.isNotEmpty(noteDelim) then&lt;br /&gt;
		notePattern = &amp;quot;^(.-)&amp;quot; .. noteDelim .. &amp;quot;(.*)$&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local containerClass = &amp;quot;card-list-container &amp;quot;&lt;br /&gt;
	if args.mobile_list then&lt;br /&gt;
		containerClass = containerClass .. &amp;quot;card-mobile-list &amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if lib.isNotEmpty(args.class) then&lt;br /&gt;
		containerClass = containerClass .. args.class&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = mw.html.create():tag(&amp;quot;span&amp;quot;):addClass(containerClass)&lt;br /&gt;
	local categories = mw.html.create()&lt;br /&gt;
	local splitSett = {&lt;br /&gt;
		noTrim      = args.trim and false or true,&lt;br /&gt;
		removeEmpty = args.removeEmpty and true or false&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	for entry in lib.gsplit(input, itemDelim, splitSett) do&lt;br /&gt;
		if not lib.isEmpty(entry) then&lt;br /&gt;
			local entry, cardArgs = p.splitParams(entry, paramDelim) --check for entry-specific params&lt;br /&gt;
			&lt;br /&gt;
			local item, note = p.splitNote(entry, notePattern) --check for entry-specific note&lt;br /&gt;
			&lt;br /&gt;
			local item_parts = lib.split(item, countDelim) --check for entry-specific amount&lt;br /&gt;
			local name = item_parts[1]&lt;br /&gt;
			local amount = item_parts[2]&lt;br /&gt;
			if args.ts and tonumber(amount) ~= nil then amount = lib.thousandsSeparator(amount) end&lt;br /&gt;
			&lt;br /&gt;
			--set card arguments without replacing those set by entry-specific params&lt;br /&gt;
			cardArgs = p.assignArgs(cardArgs, args, name, amount, note)&lt;br /&gt;
			-- mw.logObject(cardArgs)&lt;br /&gt;
			&lt;br /&gt;
			result:node(Card(cardArgs))&lt;br /&gt;
	&lt;br /&gt;
			if (args.category ~= nil) then&lt;br /&gt;
				if type(args.category) ~= &amp;#039;table&amp;#039; then args.category = {args.category} end&lt;br /&gt;
				for _, catForm in ipairs(args.category) do&lt;br /&gt;
					categories:wikitext(&amp;#039;[[Category:&amp;#039;, catForm:gsub(&amp;#039;{item}&amp;#039;, cardArgs.name), &amp;#039;]]&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if (args.category ~= nil) then&lt;br /&gt;
		result:node(require(&amp;#039;Module:Namespace detect&amp;#039;)._main({ main = categories }))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.list(args)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	&lt;br /&gt;
	--= handle blanks for non-boolean params&lt;br /&gt;
	for _, paramName in ipairs(PARAMS_NOT_SUPPORTING_BLANKS) do&lt;br /&gt;
		local value = args[paramName]&lt;br /&gt;
		if value == &amp;quot;&amp;quot; then&lt;br /&gt;
			args[paramName] = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local containerClass = &amp;quot;card-list-container&amp;quot;&lt;br /&gt;
	if args.mobile_list then&lt;br /&gt;
		containerClass = containerClass .. &amp;quot; card-mobile-list&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = mw.html.create():tag(&amp;quot;span&amp;quot;):addClass(containerClass)&lt;br /&gt;
	local categories = mw.html.create()&lt;br /&gt;
	&lt;br /&gt;
	for i, cardArgs in ipairs(args) do&lt;br /&gt;
		if not lib.isEmpty(cardArgs) then&lt;br /&gt;
			if type(cardArgs) == &amp;#039;string&amp;#039; then cardArgs = {cardArgs} end&lt;br /&gt;
			cardArgs = p.assignArgs(cardArgs, args)&lt;br /&gt;
			&lt;br /&gt;
			if (args.category ~= nil) then&lt;br /&gt;
				if type(args.category) ~= &amp;#039;table&amp;#039; then args.category = {args.category} end&lt;br /&gt;
				for _, catForm in ipairs(args.category) do&lt;br /&gt;
					categories:wikitext(&amp;#039;[[Category:&amp;#039;, catForm:gsub(&amp;#039;{item}&amp;#039;, cardArgs.name), &amp;#039;]]&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			result:node(Card(cardArgs))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if (args.category ~= nil) then&lt;br /&gt;
		result:node(require(&amp;#039;Module:Namespace detect&amp;#039;)._main({ main = categories }))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.assignArgs(cardArgs, args, name, amount, note)&lt;br /&gt;
	local finalArgs = cardArgs or {}&lt;br /&gt;
	local assignVals = { -- 1 = cardArgs; 2 = args; 0 = param name&lt;br /&gt;
		[&amp;#039;name&amp;#039;]						= { {1, &amp;#039;1&amp;#039;}, name },&lt;br /&gt;
		[&amp;#039;text&amp;#039;]						= { {1, &amp;#039;2&amp;#039;}, amount, {2, 0}, {2, &amp;#039;amount&amp;#039;} },&lt;br /&gt;
		[&amp;#039;show_text&amp;#039;]					= { {2, 0} },&lt;br /&gt;
		[&amp;#039;caption&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		[&amp;#039;show_caption&amp;#039;]				= { {2, 0} },&lt;br /&gt;
		[&amp;#039;caption_width&amp;#039;]				= { {2, 0} },&lt;br /&gt;
		[&amp;#039;note&amp;#039;]						= { note },&lt;br /&gt;
		[&amp;#039;stars&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		[&amp;#039;type&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		[&amp;#039;suffix&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		[&amp;#039;set&amp;#039;]							= { {2, 0} },&lt;br /&gt;
		[&amp;#039;mini&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		[&amp;#039;mobile_list&amp;#039;]					= { {2, 0} },&lt;br /&gt;
		[&amp;#039;link&amp;#039;]						= { pref = args.link_prefix, suff = args.link_suffix },&lt;br /&gt;
		[&amp;#039;notice&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		&lt;br /&gt;
		--icon&lt;br /&gt;
		[&amp;#039;icon&amp;#039;]						= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_type&amp;#039;]					= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_size&amp;#039;]					= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_suffix&amp;#039;]					= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_link&amp;#039;]					= { pref = args.icon_link_prefix, suff = args.icon_link_suffix },&lt;br /&gt;
		&lt;br /&gt;
		--icon_right&lt;br /&gt;
		[&amp;#039;icon_right&amp;#039;]					= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_right_type&amp;#039;]				= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_right_size&amp;#039;]				= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_right_suffix&amp;#039;]			= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_right_link&amp;#039;]				= { pref = args.icon_right_link_prefix, suff = args.icon_right_link_suffix },&lt;br /&gt;
		&lt;br /&gt;
		--icon_bottom_left&lt;br /&gt;
		[&amp;#039;icon_bottom_left&amp;#039;]			= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_left_type&amp;#039;]		= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_left_size&amp;#039;]		= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_left_suffix&amp;#039;]		= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_left_link&amp;#039;]		= { pref = args.icon_bottom_left_link_prefix, suff = args.icon_bottom_left_link_suffix },&lt;br /&gt;
		&lt;br /&gt;
		--icon_bottom_right&lt;br /&gt;
		[&amp;#039;icon_bottom_right&amp;#039;]			= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_right_type&amp;#039;]		= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_right_size&amp;#039;]		= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_right_suffix&amp;#039;]	= { {2, 0} },&lt;br /&gt;
		[&amp;#039;icon_bottom_right_link&amp;#039;]		= { pref = args.icon_bottom_right_link_prefix, suff = args.icon_bottom_right_link_suffix },&lt;br /&gt;
	}&lt;br /&gt;
	local st = {cardArgs, args}&lt;br /&gt;
	&lt;br /&gt;
	for param, list in pairs(assignVals) do&lt;br /&gt;
		if lib.isNotEmpty(list) and type(list) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			local paramF&lt;br /&gt;
			if lib.isNotEmpty(cardArgs[param]) then&lt;br /&gt;
				paramF = cardArgs[param]&lt;br /&gt;
			elseif #list &amp;gt; 0 then&lt;br /&gt;
				local i = 0&lt;br /&gt;
				while i &amp;lt; #list do&lt;br /&gt;
					i = i+1&lt;br /&gt;
					local val = list[i]&lt;br /&gt;
					if type(val) == &amp;#039;string&amp;#039; and lib.isNotEmpty(val) then&lt;br /&gt;
						paramF = val&lt;br /&gt;
						break&lt;br /&gt;
					elseif type(val) == &amp;#039;table&amp;#039; and lib.isNotEmpty(st[val[1]][(val[2]==0 and param or val[2])]) then&lt;br /&gt;
						paramF = st[val[1]][(val[2]==0 and param or val[2])]&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if paramF then&lt;br /&gt;
				finalArgs[param] = table.concat({&lt;br /&gt;
					lib.ternary(lib.isNotEmpty(list.pref) and type(list.pref) == &amp;#039;string&amp;#039;, list.pref, &amp;#039;&amp;#039;),&lt;br /&gt;
					paramF,&lt;br /&gt;
					lib.ternary(lib.isNotEmpty(list.suff) and type(list.suff) == &amp;#039;string&amp;#039;, list.suff, &amp;#039;&amp;#039;)&lt;br /&gt;
				}, &amp;#039;&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return finalArgs&lt;br /&gt;
end	&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wuffesan</name></author>
	</entry>
</feed>