跳转到内容

模組:Vgname

被永久保护的模块
维基百科,自由的百科全书

这是本页的一个历史版本,由Where was I last night?留言 | 贡献2016年5月1日 (日) 16:44编辑。这可能和当前版本存在着巨大的差异。

require('Module:No globals')

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local lc = require('Module:WikitextLC')
local labelList = mw.loadData('Module:Vgname/languages')
local areaList = {
	cnhk = '中国大陆和香港'; hkcn = '中国大陆和香港';
	cntw = '中国大陆和台灣'; twcn = '中国大陆和台灣';
	hktw = '台港'; twhk = '台港';
	cn = '中国大陆';
	hk = '香港';
	tw = '台灣';
	all = ''
}

local getArgs = require('Module:Arguments').getArgs
local p = {}

local function refSeparator(content)
	content = content or ''
	local pattern = '\127\'"`UNIQ%-%-ref%-%x+%-QINU`"\'\127'
	local s, _ = string.find(content, pattern)
	
	if s then
		return string.sub(content, 1, s-1), string.sub(content, s)
	end
	
	return content, ''
	
end

local function bold(args, content, markBegin, markEnd)

	local text, ref = refSeparator(content)
	markBegin = markBegin or ''
	markEnd = markEnd or ''
		
	if yesno(args['bold']) ~= false then
		return string.format('%s<b class="vgname-bold">%s</b>%s%s', markBegin, text, markEnd, ref)
	end

	return string.format('%s%s%s%s', markBegin, text, markEnd, ref)
	
end

local function italic(args, lcodeNum, content)
	
	if (yesno(args['italic']) ~= false) and (labelList[lcodeNum].italic == true) then
		local text, ref = refSeparator(content)
		return string.format('<i>%s</i>%s', text, ref)
	end	
	
	return content
	
end

local function origLabel(args, lcodeNum)
	
	if yesno(args.label) == false then
		return ''
	end
	
	if yesno(args.diff) or args.na or args.eu then
		return labelList[lcodeNum][3] .. ':'
	end
	
	return 	labelList[lcodeNum][2] .. ':'
	
end

local function origText(args, lcodeNum)
	local lcode, content
	
	lcode = (type(lcodeNum) == 'number') and labelList[lcodeNum][1] or lcodeNum
	content = args[lcode]
		
	local _, _, p1, p2 = string.find(content, '^(.-) *, *([%w%p ]+)$')
	if p1 then
		return string.format('<span lang="%s">-{%s}-</span>,<span lang="%s">-{%s}-</span>',
			lcode, italic(args, lcodeNum, p1),
			lcode, italic(args, lcodeNum, p2)
		) 
	end
	
	return string.format('<span lang="%s">-{%s}-</span>', lcode, italic(args, lcodeNum, content))
	
end

local function transLabel(args, area, content, as)
	local function converted(content)
		return lc.converted(content, {'zh-hans', 'zh-hant'})
	end

	if content == 'en' then
		return converted(areaList[area] .. '多用英文')
	end
	
	if content == 'orig' then
		return converted(areaList[area] .. '多用原文')
	end
	
	if as == nil then
		return converted(areaList[area] .. '译作' .. bold(args, content, '「', '」'))
	end

	local arr =	mw.text.split(content, '、')
	for i, v in ipairs(arr) do
		arr[i] = bold(args, v, '「', '」')
	end
	return converted(areaList[area] .. as .. table.concat(arr, '、'))
	
end

local function transArray(args)
	local cont = {}
	local lnc = {'zh', 'zh-hans', 'zh-hant', 'zh-sg'}
	
	if args.hk == 'tw' or args.hk == args.tw or args.hk == nil then
		local ltw = {'zh-hk', 'zh-mo', 'zh-tw'}
		
		for i, v in ipairs(lnc) do
			cont[v] = string.format('%s,%s', transLabel(args, 'cn', args.cn),  transLabel(args, 'hktw', args.tw))
		end
		for i, v in ipairs(ltw)	do
			cont[v] = transLabel(args, 'cn', args.cn)
		end
		cont['zh-cn'] = transLabel(args, 'hktw', args.tw)
		
		return cont
	end
	
	if args.hk == 'cn' then
		local lcn = {'zh-cn', 'zh-hk', 'zh-mo'}
		
		for i, v in ipairs(lnc) do
			cont[v] = string.format('%s,%s', transLabel(args, 'cnhk', args.cn),  transLabel(args, 'tw', args.tw))
		end
		for i, v in ipairs(lcn) do
			cont[v] = transLabel(args, 'tw', args.tw)
		end
		cont['zh-tw'] = transLabel(args, 'cnhk', args.cn)
		
		return cont
	end
	
	if args.cn == 'tw' or args.tw == 'cn' then
		local temp = (args.tw == 'cn') and args.cn or args.tw
		local lcn = {'zh-cn', 'zh-tw'}
		local lhk = {'zh-hk', 'zh-mo'}
		
		for i, v in ipairs(lnc) do
			cont[v] = string.format('%s,%s', transLabel(args, 'cntw', temp),  transLabel(args, 'hk', args.hk))
		end	
		for i, v in ipairs(lcn) do
			cont[v] = transLabel(args, 'hk', args.hk)
		end	
		for i, v in ipairs(lhk) do
			cont[v] = transLabel(args, 'cntw', temp)
		end	
		
		return cont
	end
		
	for i, v in ipairs(lnc) do
		cont[v] = string.format('%s,%s,%s', transLabel(args, 'cn', args.cn),  transLabel(args, 'hk', args.hk), transLabel(args, 'tw', args.tw))
	end
	cont['zh-cn'] = string.format('%s,%s', transLabel(args, 'hk', args.hk), transLabel(args, 'tw', args.tw))
	cont['zh-tw'] = string.format('%s,%s', transLabel(args, 'cn', args.cn),  transLabel(args, 'hk', args.hk)) 
	cont['zh-hk'] = string.format('%s,%s', transLabel(args, 'cn', args.cn),  transLabel(args, 'tw', args.tw))
	cont['zh-mo'] = string.format('%s,%s', transLabel(args, 'cn', args.cn),  transLabel(args, 'tw', args.tw))
	return cont
	
end

local function transOther(args, ascode, as)
	local ret = ''
	local temp = {'cnhk', 'hkcn', 'cntw', 'twcn', 'hktw', 'twhk', 'cn', 'cn', 'hk', 'hk', 'tw', 'tw'}
	
	if args[ascode] then
		ret = transLabel(args, 'all', args[ascode], as) .. ','
	end
	
	for i = 1, #temp, 2 do
		if args[ascode .. '-' .. temp[i]] then
			ret = ret .. transLabel(args, temp[i], args[ascode .. '-' .. temp[i]], as) .. ','
		elseif args[ascode .. '-' .. temp[i+1]] then
			ret = ret .. transLabel(args, temp[i], args[ascode .. '-' .. temp[i+1]], as) .. ','
		end
	end

	if ret == '' then
		return
	end
	
	return string.sub(ret, 1, -4)
end

local function head(args)
	local context = args[1] or tostring(mw.title.getCurrentTitle())

	if yesno(args.bracket) == true then
		return bold(args, context, '《', '》')
	end
	
	if yesno(args.bracket) == false then
		return bold(args, context)
	end

	if args.bracket == 'q' then
		return bold(args, context, '「', '」')
	end
	
	return bold(args, context, '《', '》')
	
end

local function orig(args)
	
	for i, v in ipairs(labelList) do
		if args[v[1]] then
			return origLabel(args, i) .. origText(args, i)
		end
	end

	return
end

local function eng(args)
	local ret
	
	if args.na then
		ret = origLabel(args, 'na') .. origText(args, 'na')
	end
	
	if args.eu then
		ret = ret and (ret .. ',') or ''
		ret = ret .. origLabel(args, 'eu') .. origText(args, 'eu')
	end
	
	if args.en and (ret == nil) then
		ret =  origLabel(args, 'en') .. origText(args, 'en')
	end
	
	return ret
end

local function trans(args)
	
	if args.cn and args.tw then
		return lc.selective(transArray(args))
	end
	
	return
end

function p.main(frame)
	local args = getArgs(frame)
	return p._main(args)
end

function p._main(args)
	-- Main module code goes here.
	local temp, ret = {}
	
	local _orig = orig(args)
	local _orig_note = args['orig_note']
	local _eng = eng(args)
	local _trans = trans(args)
	local _aka = transOther(args, 'aka', '又译')
	local _old = transOther(args, 'old', '旧译')
	local _note = args[2]
	
	if _orig == nil and _eng == nil then
		return '<span class="error"><code>{{Vgname}}</code>仅适用于原生非中文游戏,故必须指定游戏原文</span>'
	end
	
	if _orig then table.insert(temp, _orig)	end
	if _orig_note then table.insert(temp, _orig_note) end
	if _eng then table.insert(temp, _eng) end
	if _trans then table.insert(temp, _trans) end
	if _aka then table.insert(temp, _aka) end
	if _old then table.insert(temp, _old) end
	if _note then table.insert(temp, _note)	end	
	
	if #temp > 0 then 
		ret = table.concat(temp, ',')
		return head(args) .. '<span style="font-weight: normal;">(' .. ret .. ')</span>'
	end

end

return p