跳转到内容

模組:Vgname

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

这是本页的一个历史版本,由風中的刀劍留言 | 贡献2015年6月25日 (四) 02:43编辑。这可能和当前版本存在着巨大的差异。

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')

local languageList = mw.loadData('Module:Vgname/languages')

--------------------------------------------------------------------------------

local function refSeparator( a )
	a = a or ''
	local refPattern = '\127UNIQ%-%-ref%-%x+%-QINU\127'
	local p, _  = string.find( a, refPattern )
	local contentPart, refPart
	
	if p then
		contentPart, refPart = string.sub( a, 1, p - 1 ), string.sub( a, p )
	else
		contentPart, refPart = a, ''
	end
	
	return contentPart, refPart
end

local function bold( a )
	local cont, ref = refSeparator( a )
	
	if yesno( _bold ) then
		cont = '<strong>' .. cont  .. '</strong>' .. ref
	else
		cont = cont .. ref
	end
	
	return cont
end

local function italic( a )
	local cont, ref = refSeparator( a )
	
	if yesno( _italic ) then
		cont = '<i>' .. cont ..'</i>' .. ref
	else
		cont = cont .. ref
	end
	
	return cont
end

local function isDiff( args )
	if yesno( args.diff ) or args.na or args.eu then
		return true
	end
end

local function lang( langcode, a )
	local content, ref = refSeparator( a )
	
	local span = mw.html.create( 'span' )
	span
		:attr( 'lang', langcode )
		:wikitext( '-{' .. content .. '}-' )
		
	return tostring( span ) .. ref 
end

local function lc( a )
	return '-{zh; zh-hans; zh-hant;|' .. a .. '}-'
end

local function varName( a )
	local s = {
		cn = '中国大陆',
		hk = '香港',
		tw = '台湾',
		cnhk = '中国大陆和香港',
		cntw = '中国大陆和台湾',
		hktw = '台港',
	}
	
	return s[a] or ''
end

local function varient( args, mode )
	local s = { '', 'hans', 'hant', 'cn', 'hk', 'mo', 'sg', 'tw' }
	local t = {}
	local ret = ''

	if mode == 'hktw' then
		t = { { 'cn', args.cn }, { 'hktw', args.tw } }
	elseif mode =='cnhk' then
		t = { { 'cnhk', args.cn }, { 'tw', args.tw } }
	elseif mode == 'cntw' then
		t = { { 'cntw', args.cn }, { 'hk', args.hk } }
	else
		t = { { 'cn', args.cn }, { 'hk', args.hk }, { 'tw', args.tw } }
	end

	for i, v in ipairs( s ) do
		if v == '' then
			ret = ret .. 'zh:'
			v = '\127'
		else
			ret = ret .. 'zh-' .. v .. ':'
			if v == 'mo' then -- mo回溯到sg补正
				v = 'hk'
			end
		end
		
		for j, w in ipairs( t ) do
			if v == string.sub( w[1], 1, 2 ) or v == string.sub( w[1], 3, 4 ) then
			else
				if w[2] == 'en' then
					ret = ret .. lc( varName( w[1] ) .. '多用英文' ) .. ','
				else
					ret = ret .. lc( varName( w[1] ) .. '译作「' .. bold( w[2] ) .. '」' ) .. ','
				end
			end
		end
		
		ret = string.sub( ret, 1, -4 )
		ret = ret .. '; '
	end
	
	ret = '-{' .. ret .. '}-'
	
	return ret
end

local function markSeparator( a )
	local cont, refs = refSeparator( a )
	cont = cont .. '、'
	
	a = string.gsub( cont, "(.-)、", '「' .. lc( bold( '%1' ) ) .. '」、' )
	
	a = string.sub( a, 1, -4 ) .. refs
	
	return a
end

--------------------------------------------------------------------------------

local function intro( args )
	local ret = args[1] or mw.title.getCurrentTitle()
	
	ret = bold( ret )
	
	if  _bracket == 'q' or _bracket == '"' then
		ret = '「' .. ret .. '」'
	elseif yesno( _bracket ) then
		ret = '《' .. ret .. '》'
	end
	
	return ret
end

local function original( args ) 
	local ret
	
	for i, v in ipairs( languageList ) do
		if args[v[1]] then
			local cont, refs = refSeparator( args[v[1]] )
			local _, _, orig, trans = string.find( cont, "(.+),([%w%p%s]+)" )
			
			if orig then
				ret = ( isDiff( args ) and v[3] or v[2] ) .. ':'
				ret = ret .. lang( v[1], orig ) .. ',' .. lang( v[1], trans ) .. refs
			else
				ret = ( isDiff( args ) and v[3] or v[2] ) .. ':'
				ret = ret .. lang( v[1], cont ) .. refs
			end
			
			break
		end
	end
	
	return ret
end

local function english( args )
	local ret
	
	if args.na then
		ret = '美版名:' .. italic( lang( 'en', args.na ) )
		if args.eu then
			ret = ret .. ',欧版名:' .. italic( lang( 'en', args.eu ) )
		end
		
	elseif args.eu then
		ret = '欧版名:' .. italic( lang( 'en', args.eu ) )

	elseif args.en then
		ret = ( isDiff( args ) and '英文版名' or '英语' ) .. ':' .. italic( lang( 'en', args.en ) )
		
	end
	
	return ret
end

local function chinese( args )
	local ret = ''
	
	args.hk = args.hk or 'tw'
	
	if args.hk == 'tw' or args.hk == args.tw then
		ret = 'hktw'
	elseif args.hk == 'cn' or args.hk == args.cn then
		ret = 'cnhk'
	elseif args.tw == 'cn' or args.tw == args.cn then
		ret = 'cntw'
	elseif args.cn == 'tw' then
		args.cn = args.tw
		ret = 'cntw'
	end
	
	ret = varient( args, ret )
	return ret
end

local function others( args )
	local list = {
		{ '', args.aka },
		{ 'cnhk', args['aka-cnhk'] or args['aka-hkcn'] },
		{ 'cntw', args['aka-cntw'] or args['aka-twcn'] },
		{ 'hktw', args['aka-hktw'] or args['aka-twhk'] },
		{ 'cn', args['aka-cn'] },
		{ 'hk', args['aka-hk'] },
		{ 'tw', args['aka-tw'] },


	}
	local ret = ''
	
	for i, v in ipairs( list ) do
		if v[2] then
			ret = ret .. varName( v[1] ) .. '又译' .. markSeparator( v[2] ) .. ','
		end
	end
	
	ret = string.sub( ret, 1, -4 )
	
	return ret
end


--------------------------------------------------------------------------------

local getArgs = require('Module:Arguments').getArgs
local p = {}
 
function p.main(frame)
	local args = getArgs(frame, { parentFirst = true, })
	
	_bold = args.bold or 'yes'
	_italic = args.italic or 'yes'
	_bracket = args.bracket or 'yes'
	args.diff = args.diff or false
	
	return p._main(args)
end
 
function p._main(args)
	local ret = ''

	if original( args ) then
		ret = ret .. original( args ) .. ','
	end
	
	if args.en or args.na or args.eu then
		ret = ret .. english( args) .. ','
	end
	
	if args.cn and args.tw then
		ret = ret .. chinese( args ) .. ','
	end
	
	if others( args ) ~= '' then
		ret = ret .. others( args ) .. ','
	end
	
	if args[2] then
		ret = ret .. args[2] .. ','
	end
	
	ret = string.sub( ret, 1, -4 )	
		
	return  intro( args ) .. '<span style="font-weight: normal">(' .. ret ..  ')</span>'

end
 
return p