跳转到内容

模組:沙盒/Lopullinen

维基百科,自由的百科全书

这是本页的一个历史版本,由Lopullinen留言 | 贡献2022年12月9日 (五) 18:53编辑。这可能和当前版本存在着巨大的差异。

require('Module:Log globals')

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local wd = function(id)
	return require('Module:WikidataIB')._getValue{id, fetchwikidata='ALL'}
end

local function has_content(arg)
	if arg == nil or arg == '' then return false end
	return true
end


local p = {}

local infobox_styles = {
	captionstyle = 'text-align: center;' ,
	subheaderstyle = 'text-align: center; vetical-align: middle; font-weight: normal;',
	labelstyle = 'white-space: nowrap;',
}

local headers = function(args)
	local result = {}
	local all_parameters = { 'title', 'orgignal', 'japanese', 'english', 'english2' }

	-- 主标题
	if has_content(args.title) then
		result.above = args.title 
	else
		result.above = mw.title.getCurrentTitle().rootText
	end
	
	-- 外文标题
	local foreign_titles = {}
	if has_content(args.original) then
		local str = args.original
		if mw.ustring.find(str, ':') then
			str = mw.ustring.gsub(str, '^([^:]-):(.+)$', '-{<span lang="%1" xml:lang="%1">%2</span>}-')
		end
		table.insert(foreign_titles, str)
	end
	if has_content(args.japanese) then
		local str = '-{<span lang="ja" xml:lang="ja">' .. args.japanese .. '</span>}-'
		table.insert(foreign_titles, str)
	end
	if has_content(args.english) then
		local str = '-{<span lang="en" xml:lang="en">\'\'' .. args.english .. '\'\'</span>}-'
		table.insert(foreign_titles, str)
	end
	if has_content(args.english2) then
		local str = '-{<span lang="en" xml:lang="en">\'\'' .. args.english2 .. '\'\'</span>}-'
		table.insert(foreign_titles, str)
	end
	
	if table.maxn(foreign_titles) > 0 then
		local str = require('Module:List').unbulleted(foreign_titles)
		result.subheader1 = str
	end

	-- Done
	return result, all_parameters
end

local images = function(args)
	local varieties = {'', '-hans', '-hant', '-cn', '-hk', '-mo', '-my', '-sg', '-tw'}
	local result, all_parameters = {}, {}
	
	local infobox_image_params = {}
	for _, v in ipairs(varieties) do
		local para = ''
		para = 'image' .. v
		table.insert(all_parameters, para)
		infobox_image_params[v] = args[v]
		para = 'alt' .. v
		table.insert(all_parameters, para)
		infobox_image_params[v] = args[v]
	end
	
	-- image size
	local image_size_paras = {'image_size', 'image size', 'imagesize'}
	for _, v in ipairs(image_size_paras) do
		if has_content(args[v]) then
			infobox_image_params.size = args[v]
			break
		end
	end
	for _, v in ipairs(image_size_paras) do
		table.insert(all_parameters, v)
	end
	
	-- frameless
	infobox_image_params.sizedefault = 'frameless'
	
	result.image = require('Module:InfoboxImageVariant2')._main(infobox_image_params)
	
	result.caption = args.caption
	table.insert(all_parameters, 'caption')
	
	-- Done
	return result, all_parameters
end

local fields = function(args)
	-- 待办:
	-- 处理抓取Wikidata数据


	-- 参数配置
	local subgroup_header = { '街机参数' }
	local params = {
		official = { '[[官方译名]]', alias = {} },
		common = { '常用译名', alias = {} },
		genre = { '[[电子游戏类型|类型]]', alias = {}, wd = 'P136' },
		platforms = { '[[系统平台|平台]]', alias = {'platform'}, wd = 'P400' },
		developer = { '[[游戏开发者|开发商]]', alias = {}, wd = 'P178' },
		publisher = { '[[電子遊戲發行商|发行商]]', alias = {}, wd = 'P123' },
		director = { '总监', alias = {}, wd = 'P57' },
		producer = { '[[電子遊戲製作人|制作人]]', alias = {}, wd = 'P162' },
		designer = { '[[电子游戏设计|设计师]]' , alias = {}, wd = 'P287' },
		writer = { '编剧' , alias = {}, wd = 'P50' },
		programmer = { '[[游戏程序师|-{zh-cn:程序; zh-tw:程式;}-]]', alias = {}, wd = 'P943' },
		artist = { '[[游戏美工|美术]]' , alias = {}, wd = 'P3080' },
		composer = { '音乐', alias = {}, wd = 'P86' },
		series = { '系列', alias = {}, wd = 'P179' },
		engine = { '[[游戏引擎|引擎]]', alias = {}, wd = 'P408' },
		modes = { '模式', alias = {}, wd = 'P404' },
		released = { '发行日', alias = {'release'}, wd = 'P577' },
		shutdown = { '停运日', alias = {} },
		cabinet = { '框体', alias = {}, wd = 'P2670', subgroup = 1},
		arcade_system = { '[[街机主板|主板]]', alias = {}, subgroup = 1 },
		cpu = { '[[中央处理器|CPU]]', alias = {}, subgroup = 1 },
		sound = { '音效', alias = {}, subgroup = 1 },
		display = { '显示', alias = {}, subgroup = 1 },
	}
	local param_order = {
		'official', 'common', 'genre', 'platforms', 'developer', 'publisher',
		'director', 'producer', 'designer', 'writer', 'programmer', 'artist', 'composer',
		'series', 'engine', 'modes', 'released', 'shutdown',
		'cabinet', 'arcade_system', 'cpu', 'sound', 'display',
	}
	if yesno(args.onlinegame, false) then  -- 启用网络游戏参数时的修正
		params.publisher[1] = '-{zh-cn:运营; zh-tw:營運;}-商'
		params.released[1] = '-{zh-cn:运营; zh-tw:營運;}-日'
	end
	
	-- 将使用空格分隔的字段名作为别名
	for _, v in ipairs(param_order) do
		local alias_temp = params[v].alias
		table.insert(alias_temp, 1, v)
		
		local alias = {}
		for _, w in ipairs(alias_temp) do
			table.insert(alias, w)
			if mw.ustring.find(w, '_') then
				local str = mw.ustring.gsub(w, '_', ' ')
				table.insert(alias, str)
			end
		end
		params[v].alias = alias
	end
	
	-- 根据参数名读取标签和资料
	local function get_label_and_data(param)
		local info = params[param]
		
		local label, data, subgroup = info[1], nil, (info.subgroup or 0)
		for _, v in ipairs(info.alias) do
			data = args[v]
			if data ~= nil then break end
		end
		
		if data == '' then
			return
		end
		if data ~= nil then 
			return label, data, subgroup
		end
		if info.wd then
			data = wd(info.wd)
			if data == nil then return end 
			return label, data, subgroup
		end
	end
	
	-- 返回给Infobox的字段信息
	local result, num, previous_subgroup = {}, 0, 0
	for _, v in ipairs(param_order) do
		local label, data, subgroup = get_label_and_data(v)
		if label ~= nil then
			if subgroup > previous_subgroup then  -- 处理header
				num = num + 1
				result['header' .. tostring(num)] = subgroup_header[subgroup]
				previous_subgroup = subgroup
			end
			num = num + 1
			result['label' .. tostring(num)] = label
			result['data' .. tostring(num)] = data
		end
	end
	
	-- 返回给Check for unknown parameters的合法参数名称
	local all_parameters = {}
	for _, v in ipairs(param_order) do
		for _, w in ipairs(params[v].alias) do
			table.insert(all_parameters, w)
		end
	end
	
	-- Bye
	return result, all_parameters
end

function p.main(frame)
	local args = getArgs(frame,{
		removeBlanks = false
	})
	return p._main(args)
end

function p._main(args)
	local params, params_temp = {}, nil

	-- 模板式样
	for k, v in pairs(infobox_styles) do
		params[k] = v
	end
	
	-- 标题参数
	params_temp = headers(args)
	for k, v in pairs(params_temp) do
		params[k] = v
	end
	
	-- 图片参数
	params_temp = images(args)
	for k, v in pairs(params_temp) do
		params[k] = v
	end

	-- 常规参数
	params_temp = fields(args)
	for k, v in pairs(params_temp) do
		params[k] = v
	end
	
	return require('Module:Infobox').infobox(params)
end

return p