Module:Array

来自Minecraft基岩版开发Wiki

此模块可将一个Lua table或一个字符串按给定的分隔符输出语言自然的列表。

local p = {}
local f = mw.getCurrentFrame()

local function getTagExtension(tag, style)
	if tag ~= '' then
		if style ~= '' then
			local args = { style = style }
			return function (value)
				return f:extensionTag(tag, value, args)
			end
		end
		return function (value)
				return f:extensionTag(tag, value)
		end
	end
	return function (value)
		return value
	end
end

local function stringToArray(str, separator, wrapTag, wrapTagStyle, keepBlank)
	local arr = {}
	local i = 1
	local extension = getTagExtension(wrapTag, wrapTagStyle)
	for v in mw.text.gsplit(str, separator) do
		if v ~= '' or keepBlank then
			arr[i] = extension(v)
		end
		i = i + 1
	end
	return arr
end

local function tableToArray(tbl, wrapTag, wrapTagStyle, keepBlank, sort)
	local arr = {}
	local extension = getTagExtension(wrapTag, wrapTagStyle)
	for k, v in pairs(tbl) do
		if type(k) == 'number' and (v ~= '' or keepBlank) then
			arr[k] = extension(v)
		end
	end
	if sort then
		table.sort(arr)
	end
	return arr
end

function p.main()
	local args = require('Module:ProcessArgs').merge(true)
	return p.array(args)
end
	
function p.array(args)
	local wrapTag = args.wrap or ''
	local wrapTagStyle = args.style or ''
	local sort = require('Module:Yesno')(args.sort)
	local delimiter = args.delimiter or args.d or ''
	local keepBlank = args.keepblank
	local arr
	if args.mode == 'single' then
		arr = stringToArray(args[1], args.sep or ',', wrapTag, wrapTagStyle, keepBlank)
	else
		arr = tableToArray(args, wrapTag, wrapTagStyle, keepBlank, sort)
	end
	
	if delimiter == 'pretty' or delimiter == 'pretty-and' then
		return mw.text.listToText(arr)
	elseif delimiter == 'pretty-or' then
		return mw.text.listToText(arr, '、', '或')
	elseif delimiter == 'newline' or delimiter == 'br' then
		return table.concat(arr, '<br>')
	elseif delimiter == 'list' or delimiter == 'list-newline'
		or delimiter == 'bullet' or delimiter == '*' then
			local listLevel = args['list-level'] or '**'
			return table.concat(arr, '\n' .. listLevel)
	else
		return table.concat(arr, delimiter)
	end
end

return p