跳转到内容

模組:Vgname/sandbox

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

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

require('Module:No globals')

local p = {}

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')
local lc = require('Module:WikitextLC')
local label = mw.loadData('Module:Vgname/languages')

local chineseRegion = {
	["cn"] = {simp = "中国大陆", trad = "中國大陸", paraUsed = "cn"},
	["cnhk"] = {simp = "中国大陆和香港", trad = "中國大陸和香港", paraUsed = "cn"},
	["cntw"] = {simp = "中国大陆和台湾", trad = "中國大陸和台灣", paraUsed = "tw"},
	["hk"] = {simp = "香港", trad = "香港", paraUsed = "hk"},
	["hktw"] = {simp = "港台", trad = "港台", paraUsed = "tw"},
	["tw"] = {simp = "台湾", trad = "台灣", paraUsed = "tw"},
}

local function refSplit(content)
	content = content or ""
	local pattern = '\127\'"`UNIQ%-%-ref%-%x+%-QINU`"\'\127' -- [[en:WP:UNIQ]]

	local s, _ = content:find(pattern)
	if s then
		return content:sub(1, s-1), content:sub(s)
	end
	return content, ""
end

local function bold(args, content, openBracket, closeBracket, converted) -- with refSplit()
	local text, ref = refSplit(content)
	
	if converted then
		text = lc.converted(text, {'zh-hans', 'zh-hant'})
	end
	
	if yesno(args.bold) ~= false then
		text = "<b>" .. text .. "</b>"
	end
	
	return openBracket .. text .. closeBracket .. ref
end

local function boldWithPauseMark(args, content, openBracket, closeBracket, converted)
	local tab = mw.text.split(content, "、"), {}
	
	for key, val in ipairs(tab) do
		tab[key] = bold(args, val, openBracket, closeBracket, converted)
	end
	
	return table.concat(tab, "、")
end

local function lang(args, langIndex, content) -- with italic but not prefix
	local lang = label[langIndex][1]
	local text, ref = refSplit(content or args[lang])
	local style = "normal"

	if yesno(args.italic) ~= false and label[langIndex].italic then
		style = "italic"
	end
	
	return string.format('<span lang="%s" style="font-style:%s;">-{%s}-</span>%s', lang, style, text, ref)
end

local function head(args)
	local openBracket, closeBracket = "《", "》"
	
	if args.bracket == "q" then
		openBracket, closeBracket = "「", "」"
	elseif yesno(args.bracket) == false then
		openBracket, closeBracket = "", ""
	end
		
	return bold(args, args[1], openBracket, closeBracket, false)
end

local function foreign(args)
	local tab, tagcode = {}, nil
	
	-- For the value of tagcode, see [[Module:Vgname/languages]]; e.g. 2 => "英语", 3 => "英文版名".
	if yesno(args.diff) == false then tagcode = 2
	elseif yesno(args.diff) == true then tagcode = 3 
	elseif args.na or args.eu or args.au then tagcode = 3
	else tagcode = 2
	end
	
	for _, val in ipairs{"na", "eu", "au"} do
		if args[val] then
			table.insert(tab, label[val][tagcode] .. ":" .. lang(args, val, args[val]))
		end
	end
	
	if #tab == 0 and args.en then
		table.insert(tab, label.en[tagcode] .. ":" .. lang(args, "en"))
	end
	
	for langIndex, val in ipairs(label) do
		if args[val[1]] then
			table.insert(tab, 1, val[tagcode] .. ":" .. lang(args, langIndex))
			break
		end
	end

	return #tab == 0 and "" or table.concat(tab, ",")
end

local function variant(args)
	if args.cn == nil or args.tw == nil then return '' end
	
	local tab, varUsed = {}, {}
	local _args = {
		["cn"]= args.cn,
		["hk"]= args.hk,
		["tw"]= args.tw,		
	}

	if _args.hk == "tw" or _args.hk == _args.tw or _args.hk == nil then
		varUsed = {'cn', 'hktw'}
	elseif _args.hk == "cn" or _args.hk == _args.cn then
		varUsed = {'cnhk', 'tw'}
	elseif _args.cn == "tw" or _args.tw == "cn" or _args.cn == _args.tw then
		if _args.tw == "cn" then _args.tw = _args.cn end
		varUsed = {'cnhk', 'tw'}
	else
		varUsed = {'cn', 'hk', 'tw'}
	end
	
	for _, dispVar in ipairs{'hans', 'cn', 'sg'} do
		local tabInner = {}
		for _, usedVar in ipairs(varUsed) do
			if usedVar:sub(1, 2) ~= dispVar and usedVar:sub(-2, -1) ~= dispVar then
				local regionName, translation = chineseRegion[usedVar].simp, _args[chineseRegion[usedVar].paraUsed]
				if translation == "en" then
					translation = "常用英文"
				else
					translation = "译作" .. bold(args, translation, "“", "”", true)
				end
				table.insert(tabInner, regionName .. translation)
			end
		end
		tab["zh-" .. dispVar] = table.concat(tabInner, ",")
	end
	
	for _, dispVar in ipairs{'hant', 'hk', 'tw'} do
		local tabInner = {}
		for _, usedVar in ipairs(varUsed) do
			if usedVar:sub(1, 2) ~= dispVar and usedVar:sub(-2, -1) ~= dispVar then
				local regionName, translation = chineseRegion[usedVar].trad, _args[chineseRegion[usedVar].paraUsed]
				if translation == "en" then
					translation = "常用英文"
				else
					translation = "譯作" .. bold(args, translation, "「", "」", true)
				end
				table.insert(tabInner, regionName .. translation)
			end
		end
		tab["zh-" .. dispVar] = table.concat(tabInner, ",")
	end
	tab["zh-mo"] = tab["zh-hk"]
	
	return lc.selective(tab)
end

local function aka(args)
	local tab = {}
	
	local akaRegions = {"", "cnhk", "cntw", "hktw", "cn", "hk", "tw"}
	local akaType = {
		{"aka", "译作"},
		{"official", "官方译作"},
		{"old", "旧译"},
	}
	local akaPart = {
		{"sub", "正標題"},
		{"sub", "副標題"},
	}

	for _, typ in ipairs(akaType) do
		local tabInner = {}
		
		for _, reg in ipairs(akaRegions) do
			local text, reg2
			
			if reg:len() == 4 then	
				reg2 = reg:sub(3, 4) .. reg:sub(1, 2)
			else
				reg2 = reg
			end
			
			if args[typ[1]] then
				table.insert(tabInner, typ[2] .. boldWithPauseMark(args, text, "「", "」", true))
			end
			
			if args[typ[1] .. '-' .. reg] or args[typ[1] .. '-' .. reg2] then
				local text = args[typ[1] .. '-' .. reg] or args[typ[1] .. '-' .. reg2]
				text = chineseRegion[reg].simp .. typ[2] .. boldWithPauseMark(args, text, "「", "」", true)
				table.insert(tabInner, text)
			end
			
		end
		if #tabInner > 0 then
			table.insert(tab, table.concat(tabInner, ","))
		end
	end

	if #tab > 0 then
		return table.concat(tab, ",")
	end
	return ""
end

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

function p._main(args)
	local tab, _tab = {}, {}
	
	_tab = {
		foreign(args),
		variant(args),
		aka(args),
		args[2] or ""
	}
	
	for _, val in ipairs(_tab) do
		if val ~= "" then
			table.insert(tab, val)
		end
	end
	
	if #tab > 0 then
		return head(args) .. '<span style="font-weight: normal;">(' .. table.concat(tab, ",") .. ')</span>'
	end
	
	return head(args)
end

return p