模組:Vgname
外观
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%x+%-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 = '<b>' .. cont .. '</b>' .. 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;|' .. bold( 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 .. varName( w[1] ) .. '多用英文,'
else
ret = ret .. varName( w[1] ) .. '译作「' .. lc( 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)
_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