模块:Var-array

来自维阿百科
霓虹灯鱼讨论 | 贡献2022年7月8日 (五) 21:15的版本 (导入1个版本)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

简介

该模块用于在Lua中生成或解析由{{array}}模板构造的数据。

方法

new

array.new(name, data)

其中,data为一个表(table),内部所有数据必须为数字索引。

返回值:返回传入的name

get

array.get(name)

返回值:由array模板构造的数据所组成的表(table)。当名为name的变量组无效时,返回false;若name为nil,则返回nil。


local module = {}

function module.new(name, array)
	local frame = mw.getCurrentFrame()
	local idCount = frame:callParserFunction( '#var', 'array.idCount', 0)
	function foo(name, array)
		name = '@array-innerArrayIdentifier:'..name
		frame:callParserFunction( '#vardefine', name, name)
		for i, v in ipairs(array) do
			if type(v) == 'table' then
				idCount = idCount + 1
				local innerArrayName = name..'___'..idCount..'___'
				foo(innerArrayName, v)
				v = '@array-innerArrayIdentifier:'..innerArrayName
			end
			frame:callParserFunction( '#vardefine', name..i, v)		
		end
		frame:callParserFunction( '#vardefine', name..'.count', #array)
	end
	foo(name, array)
	
	frame:callParserFunction( '#vardefine', 'array.idCount', idCount)
	return name
end

function module.get(name)
	local frame = mw.getCurrentFrame()
	if type(name) == 'nil' then return nil end
	local time = 0
	function foo(name)
		local array = {}
		
		time = time + 1
		if time == 1 then
			name = '@array-innerArrayIdentifier:'..name
		end
		
		local count = frame:callParserFunction( '#var', name..'.count')		
		if count == '' then return false end
		for i=1, count do
			local val = frame:callParserFunction('#var', name..i)
			if string.find(val, '^@array%-innerArrayIdentifier:') then
				array[i] = foo(val)
			else
				array[i] = val
			end
		end
		return array
	end
	
	return foo(name)
end

return module