Module:ConvertLink:修订间差异

来自Arcaea中文维基
无编辑摘要
(尝试优化)
 
(未显示同一用户的10个中间版本)
第2行: 第2行:


-- local mad = require 'Module:AnotherData'
-- local mad = require 'Module:AnotherData'
local memory = {}
local function getMemory(enType, name)
if memory[enType] then
if memory[enType][name] then
return memory[enType][name]
end
else
memory[enType] = {}
end
end


local function link(l, d)
local function link(l, d)
第10行: 第22行:
    end
    end
end
end
local NotJaArtist = {[' 旅人E']=''}
 
local function formatLangText(text)
if not text then return text end
   return mw.ustring.gsub(
  text, '[一-龠ぁ-ゔァ-ヴー々〆〤ヶ]+',
   function(v) return ('<span lang="ja">-{%s}-</span>'):format(v) end
)
end
 
local function langLink(theType, __link, display, noForm)
local dis = display or __link
local disForm = noForm and dis or formatLangText(dis)
return link(theType..'列表#' .. __link, disForm)
end
 
local function fullCL(theType, __FullData__)
local artist = ''
for _, data in ipairs(__FullData__) do
local display_lang =  data.zh and data.display or formatLangText(data.display)
if data.link then
artist = artist .. langLink(theType, data.link, display_lang, true)
else
artist = artist .. (display_lang or '')
end
end
return artist
end
 
local function defaultCL(theType, text, artist_list)
local temp_text = text
local link_placeholders = {}
local placeholder_count = 0
for theLink, display in pairs(artist_list) do
if type(display) == 'string' then
local link_text = langLink(theType, theLink, display)
local placeholder = "__LINK_PLACEHOLDER_" .. placeholder_count .. "__"
link_placeholders[placeholder] = link_text
temp_text = string.gsub(temp_text, display, placeholder)
placeholder_count = placeholder_count + 1
elseif type(display)=='table' then
for _,dis in pairs(display) do
local link_text = langLink(theType, theLink, dis)
local placeholder = "__LINK_PLACEHOLDER_" .. placeholder_count .. "__"
link_placeholders[placeholder] = link_text
temp_text = string.gsub(temp_text, dis, placeholder)
placeholder_count = placeholder_count + 1
end
   end
end
if placeholder_count == 0 then return text end
   local formatted_text = formatLangText(temp_text)
   for placeholder, link_text in pairs(link_placeholders) do
     formatted_text = string.gsub(formatted_text, placeholder, link_text)
   end
   return formatted_text
end
 
local CALv2
local function findArtist(artistName)
CALv2 = CALv2 or mw.loadJsonData 'Template:ComplexArtistsList.json'
local artist_list = CALv2[artistName]
local theType = ' 曲师'
if artist_list then
if artist_list.__FullData__ then
artist = fullCL(theType, artist_list.__FullData__)
else
artist = defaultCL(theType, artistName, artist_list)
end
else
artist = langLink(theType, artistName)
end
return artist
end


function p.artistLink(artistName)
function p.artistLink(artistName)
第17行: 第102行:
-- 返回:带链接的曲师名称
-- 返回:带链接的曲师名称
-- 若预期返回多个链接,实际返回一个链接;或曲师使用了马甲未能正确识别,请在 Template:ComplexArtistsList.json 添加新规则
-- 若预期返回多个链接,实际返回一个链接;或曲师使用了马甲未能正确识别,请在 Template:ComplexArtistsList.json 添加新规则
-- 添加示例:
-- 注意事项:json转义符,如曲师名称有 " 需要写成 \"(点名Gram(DJ Genki));
  --  "LaurvsCK": [  ## 曲目的曲师,空格替换为空(' ' -> '':"Laur vs CK" -> "LaurvsCK")
--      lua匹配转义符,CALv2使用匹配简化结构,注意默认格式下value即显示部分(冒号右侧) . * 等符号需要在之前添加%转义
  --    {
  --      "link": "Laur",  ## 第一位曲师的链接,建议使用曲师列表中对应<span id="xx" />位置的名称
  --      "display": "Laur" ## 第一位曲师的显示名称,复制进来即可
  --    },
  --    {
  --      "link": false,  # link为false,表示这组字符串不需要链接或不在曲师列表中
  --      "display": " vs " # 不需要链接的字符串,空格也要包括
  --    },
  --    {
  --      "link": "CK(しーけー)", ## 下一位曲师的链接,找到<span id="CK(しーけー)" />填入
  --      "display": "CK" ## 下一位曲师的显示名称,复制进来即可,此时值与link的值不同
  --    }
  --  ]
-- 注意事项:json转义符,如曲师名称有 " 需要写成 \"(点名Gram(DJ Genki))
if artistName then artistName=tostring(artistName) else return end
if artistName then artistName=tostring(artistName) else return end
local cal = mw.loadJsonData 'Template:ComplexArtistsList.json'
local artist = getMemory('artist', artistName)
local function formatJapaneseText(text)
if artist then return artist end
if not text then return text end
artist = findArtist(artistName)
if NotJaArtist[text] then return text end
memory.artist[artistName] = artist
   return mw.ustring.gsub(
return artist
     text, '[ - 龠ぁ- ゔァ- ヴー々〆〤ヶ]+',
end
     function(v) return ('<span lang="ja">-{%s}-</span>'):format(v) end
 
   )
local DL,CDL,SDL
local dInit,sdlInit
 
local function designerInit()
DL = mw.text.jsonDecode(mw.title.new('Template:DesignersList.json'):getContent())
CDL = DL.complex
SDL = DL.simple
dInit = true
end
 
local function SDL_Init()
table.sort(SDL,
function(a,b)
return #(a.display)<#(b.display)
end)
sdlInit = true
end
 
local function findDesigner(designerName, songid)
if not dInit then designerInit() end
local theType = '谱师'
local function defaultSDL(text)
if not sdlInit then SDL_Init() end
local temp_text = text
local text_len = #text
local link_placeholders = {}
local placeholder_count = 0
for _,data in ipairs(SDL) do
local dis = data.display
local name = data.link
if string.find(temp_text, dis) then
local link_text = langLink(theType, name, dis)
local placeholder = "__LINK_PLACEHOLDER_" .. placeholder_count .. "__"
link_placeholders[placeholder] = link_text
temp_text = string.gsub(temp_text, dis, placeholder)
text_len = text_len - #dis
placeholder_count = placeholder_count + 1
if text_len < #dis then break end
end
-- temp_text = temp_text .. '__'..text_len
end
if placeholder_count == 0 then return text end
   local formatted_text = formatLangText(temp_text)
   for placeholder, link_text in pairs(link_placeholders) do
     formatted_text = string.gsub(formatted_text, placeholder, link_text)
   end
   return formatted_text
end
end
local artist = ''
local artist_list = cal[artistName] or cal[string.gsub(artistName, ' ' , '')]
local designer
if artist_list then
local designer_list = CDL[designerName]
for _, data in ipairs(artist_list) do
if designer_list then
local display_ja = formatJapaneseText(data.display)
if designer_list.__FullData__ then
if data.link then
designer = fullCL(theType, designer_list.__FullData__)
   artist = artist .. (display_ja and link('曲师列表#' .. data.link, display_ja) or '')
else
   else
designer = defaultCL(theType, designerName, designer_list)
   artist = artist .. (display_ja or '')
end
end
end
else
else
   artist = formatJapaneseText(artistName)
designer = defaultSDL(designerName)
   artist = link(' 曲师列表#' .. artistName, artist)
end
if designer ~= designerName then return designer end
designerName = designerName==''and ' ' or designerName
if songid then
if DL.special[songid] then
return langLink(theType,' 与主线剧情相关的特殊名义', designerName)
end
end
end
return artist
return langLink(theType, '其他未确认谱师名义', designerName)
end
end


function p.artistLinkFrame(frame)
function p.designerLink(designerName, songid)
   local name
-- songid参数可选,用于最终区分"其他未确认谱师名义"与"与主线剧情相关的特殊名义"
   if frame and frame.args[1] then 
--  不填默认归为"其他未确认谱师名义"
     name = frame.args[1]
if designerName then designerName=tostring(designerName) else return end
   else 
local designer = getMemory('designer', designerName)
     return ''
if designer then return designer end
   end
local designer = findDesigner(designerName, songid)
   local al = p.artistLink(name)
memory.designer[designerName] = designer
   return al
return designer
end
end


function p.packLink(packName, short, ns)
function p.packLink(packName, short, ns)
第80行: 第203行:
-- true  NS版曲包
-- true  NS版曲包
-- false 移动版曲包
-- false 移动版曲包
if packName then packName=tostring(packName) else return end
local class = 'pack_'..(ns and 'ns' or 'mobile')..(short and '_short' or '')
local pack = getMemory(class, packName)
if pack then return pack end
local discrete_pack = {['Arcaea']='曲包', ['Memory Archive']=''}
local discrete_pack = {['Arcaea']='曲包', ['Memory Archive']=''}
第104行: 第231行:
end
end
local pack = link(packLink, packDisplay)
local pack = link(packLink, packDisplay)
memory[class][packName] = pack
return pack
return pack
end
end


function p.packLinkFrame(frame)
local lang, VT
   if frame then
local function findVer(ver, date)
   local name = frame.args['name'] or nil
lang = lang or mw.language.getContentLanguage()
   local short = frame.args['short'] or nil
-- VT = VT or mw.loadJsonData 'Template:VersionTime.json'
   local ns = frame.args['ns'] or nil
VT = VT or mw.text.jsonDecode(mw.title.new('Template:VersionTime.json'):getContent())
   return p.packLink(name, short, ns)
local ymd = tonumber(lang:formatDate('ymd', '@' .. date)) - 1
   else
local vt
   return 'none'
if VT[ver] then vt=VT[ver] else return ver, ymd end
   end
local dates = vt.time
local version = vt.ver
if #dates ~= #version then return ver,ymd end
local l, r = 1, #dates
while l < r do
local m = math.floor((l + r) / 2)
if dates[m] < ymd then
l = m + 1
else
r = m
end
end
return ver.. '.' ..version[l], dates[l]
end
local function dateConvert(date)
if not date then return nil end
local dateStr = tostring(date)
local yy = string.sub(dateStr,1,2)
local mm = string.sub(dateStr,3,4)
local dd = string.sub(dateStr,5,6)
return '20'..string.format("%02d/%02d/%02d", yy, mm, dd % 100)
end
end


 
function p.fullVersionNum(ver, date)
local verClass = math.floor(date/100)
local verData = getMemory('ver', verClass)
if verData then return verData[1], verData[2], 'Memory' end
verData={}
verData[1], verData[2] = findVer(ver, date)
verData[2] = dateConvert(verData[2])
memory.ver[verClass] = verData
return verData[1], verData[2]
end


return p
return p

2024年10月25日 (五) 14:29的最新版本

可在Module:ConvertLink/doc创建此模块的帮助文档

local p = {}

-- local mad = require 'Module:AnotherData'

local memory = {}

local function getMemory(enType, name)
	if memory[enType] then
		if memory[enType][name] then
			return memory[enType][name]
		end
	else
		memory[enType] = {}
	end
end

local function link(l, d)
    if d then
        return '[[' .. l .. '|' .. d .. ']]'
    else
        return '[[' .. l .. ']]'
    end
end

local function formatLangText(text)
	if not text then return text end
    return mw.ustring.gsub(
	   text, '[一-龠ぁ-ゔァ-ヴー々〆〤ヶ]+',
    	function(v) return ('<span lang="ja">-{%s}-</span>'):format(v) end
	)
end

local function langLink(theType, __link, display, noForm)
	local dis = display or __link
	local disForm = noForm and dis or formatLangText(dis)
	return link(theType..'列表#' .. __link, disForm)
end

local function fullCL(theType, __FullData__)
	local artist = ''
	for _, data in ipairs(__FullData__) do
		local display_lang =  data.zh and data.display or formatLangText(data.display)
		if data.link then
			artist = artist .. langLink(theType, data.link, display_lang, true)
		else
			artist = artist .. (display_lang or '')
		end
	end
	return artist
end

local function defaultCL(theType, text, artist_list)
	local temp_text = text
	local link_placeholders = {}
	local placeholder_count = 0
	for theLink, display in pairs(artist_list) do
		if type(display) == 'string' then
			local link_text = langLink(theType, theLink, display)
			local placeholder = "__LINK_PLACEHOLDER_" .. placeholder_count .. "__"
			link_placeholders[placeholder] = link_text
			temp_text = string.gsub(temp_text, display, placeholder)
			placeholder_count = placeholder_count + 1
		elseif type(display)=='table' then
			for _,dis in pairs(display) do
				local link_text = langLink(theType, theLink, dis)
				local placeholder = "__LINK_PLACEHOLDER_" .. placeholder_count .. "__"
				link_placeholders[placeholder] = link_text
				temp_text = string.gsub(temp_text, dis, placeholder)
				placeholder_count = placeholder_count + 1
			end
    	end
	end
	if placeholder_count == 0 then return text end
    local formatted_text = formatLangText(temp_text)
    for placeholder, link_text in pairs(link_placeholders) do
        formatted_text = string.gsub(formatted_text, placeholder, link_text)
    end
    return formatted_text
end

local CALv2
local function findArtist(artistName)
	CALv2 = CALv2 or mw.loadJsonData 'Template:ComplexArtistsList.json'
	
	local artist_list = CALv2[artistName]
	local theType = '曲师'
	if artist_list then
		if artist_list.__FullData__ then
			artist = fullCL(theType, artist_list.__FullData__)
		else
			artist = defaultCL(theType, artistName, artist_list)
		end
	else
		artist = langLink(theType, artistName)
	end
	return artist
end

function p.artistLink(artistName)
	-- 将songlist中纯文本形式的曲师名称转换为带一个或多个链接的曲师名称,同时进行日文转换
	-- 输入:曲师名称(需要与songlist内完全一致,或仅存在空格差异)(不要手打!!)
	-- 返回:带链接的曲师名称
	-- 若预期返回多个链接,实际返回一个链接;或曲师使用了马甲未能正确识别,请在 Template:ComplexArtistsList.json 添加新规则
	-- 注意事项:json转义符,如曲师名称有 " 需要写成 \"(点名Gram(DJ Genki));
	--           lua匹配转义符,CALv2使用匹配简化结构,注意默认格式下value即显示部分(冒号右侧) . * 等符号需要在之前添加%转义
	if artistName then artistName=tostring(artistName) else return end
	local artist = getMemory('artist', artistName)
	if artist then return artist end
	artist = findArtist(artistName)
	memory.artist[artistName] = artist
	return artist
end

local DL,CDL,SDL
local dInit,sdlInit

local function designerInit()
	DL = mw.text.jsonDecode(mw.title.new('Template:DesignersList.json'):getContent())
	CDL = DL.complex
	SDL = DL.simple
	dInit = true
end

local function SDL_Init()
	table.sort(SDL,
			function(a,b)
				return #(a.display)<#(b.display)
			end)	
	sdlInit = true
end

local function findDesigner(designerName, songid)
	if not dInit then designerInit() end
	local theType = '谱师'
	
	local function defaultSDL(text)
		if not sdlInit then SDL_Init() end
		local temp_text = text
		local text_len = #text
		local link_placeholders = {}
		local placeholder_count = 0
		for _,data in ipairs(SDL) do
			local dis = data.display
			local name = data.link
			if string.find(temp_text, dis) then
				local link_text = langLink(theType, name, dis)
				local placeholder = "__LINK_PLACEHOLDER_" .. placeholder_count .. "__"
				link_placeholders[placeholder] = link_text
				temp_text = string.gsub(temp_text, dis, placeholder)
				text_len = text_len - #dis
				placeholder_count = placeholder_count + 1
				if text_len < #dis then break end
			end
			-- temp_text = temp_text .. '__'..text_len
		end
		if placeholder_count == 0 then return text end
	    local formatted_text = formatLangText(temp_text)
	    for placeholder, link_text in pairs(link_placeholders) do
	        formatted_text = string.gsub(formatted_text, placeholder, link_text)
	    end
	    return formatted_text
	end
	
	local designer
	local designer_list = CDL[designerName]
	if designer_list then
		if designer_list.__FullData__ then
			designer = fullCL(theType, designer_list.__FullData__)
		else
			designer = defaultCL(theType, designerName, designer_list)
		end
	else
		designer = defaultSDL(designerName)
	end
	if designer ~= designerName then return designer end
	designerName = designerName==''and ' ' or designerName
	if songid then
		if DL.special[songid] then
			return langLink(theType,'与主线剧情相关的特殊名义', designerName)
		end
	end
	return langLink(theType, '其他未确认谱师名义', designerName)
end

function p.designerLink(designerName, songid)
	-- songid参数可选,用于最终区分"其他未确认谱师名义"与"与主线剧情相关的特殊名义"
	--   不填默认归为"其他未确认谱师名义"
	if designerName then designerName=tostring(designerName) else return end
	local designer = getMemory('designer', designerName)
	if designer then return designer end
	local designer = findDesigner(designerName, songid)
	memory.designer[designerName] = designer
	return designer
end


function p.packLink(packName, short, ns)
	-- 曲包名称转换成链接
	-- short
		-- true  简短(x Collaboration y)
		-- false 完整(x Collaboration - Collaboration y)
	-- ns  适用于Arcaea和Memory Archive曲包
		-- true  NS版曲包
		-- false 移动版曲包
	if packName then packName=tostring(packName) else return end
	local class = 'pack_'..(ns and 'ns' or 'mobile')..(short and '_short' or '')
	local pack = getMemory(class, packName)
	if pack then return pack end
	
	local discrete_pack = {['Arcaea']='曲包', ['Memory Archive']=''}
	-- 分离双平台页的曲包,value为后缀附加内容: '曲包'->' (xx版曲包)' ; ''->' (xx版)'
	
	local cc = 'Collaboration %- Collaboration'
	local ccl = 'Collaboration#Collaboration'
	local linkFlag = ''
	if discrete_pack[packName] then
		if ns then
			linkFlag = (' (NS版%s)'):format(discrete_pack[packName])
		else
			linkFlag = (' (移动版%s)'):format(discrete_pack[packName])
		end
	end
	
	local packLink = string.gsub(packName, cc, ccl) .. linkFlag
	local packDisplay
	if short then
		local ccd = 'Collaboration'
		packDisplay = string.gsub(packName, cc, ccd)
	else
		packDisplay = packName
	end
	local pack = link(packLink, packDisplay)
	
	memory[class][packName] = pack
	return pack
end

local lang, VT
local function findVer(ver, date)
	lang = lang or mw.language.getContentLanguage()
	-- VT = VT or mw.loadJsonData 'Template:VersionTime.json'
	VT = VT or mw.text.jsonDecode(mw.title.new('Template:VersionTime.json'):getContent())
	local ymd = tonumber(lang:formatDate('ymd', '@' .. date)) - 1
	local vt
	if VT[ver] then vt=VT[ver] else return ver, ymd end
	local dates = vt.time
	local version = vt.ver
	if #dates ~= #version then return ver,ymd end
	local l, r = 1, #dates
	while l < r do
		local m = math.floor((l + r) / 2)
		if dates[m] < ymd then
			l = m + 1
		else
			r = m
		end
	end
	return ver.. '.' ..version[l], dates[l]
end
local function dateConvert(date)
	if not date then return nil end
	local dateStr = tostring(date)
	local yy = string.sub(dateStr,1,2)
	local mm = string.sub(dateStr,3,4)
	local dd = string.sub(dateStr,5,6)
	return '20'..string.format("%02d/%02d/%02d", yy, mm, dd % 100)
end

function p.fullVersionNum(ver, date)
	local verClass = math.floor(date/100)
	local verData = getMemory('ver', verClass)
	if verData then return verData[1], verData[2], 'Memory' end
	verData={}
	verData[1], verData[2] = findVer(ver, date)
	verData[2] = dateConvert(verData[2])
	memory.ver[verClass] = verData
	return verData[1], verData[2]
end

return p