Module:沙盒/Economy666/CL:修订间差异
Economy666(讨论 | 贡献) (fullVersionNum(ver, date)) |
Economy666(讨论 | 贡献) 小无编辑摘要 |
||
(未显示同一用户的9个中间版本) | |||
第1行: | 第1行: | ||
local p = {} | local p = {} | ||
-- local mad = require 'Module:AnotherData' | -- local mad = require 'Module:AnotherData' | ||
local memory = {} | |||
local | 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) | ||
第22行: | 第25行: | ||
local function formatLangText(text) | local function formatLangText(text) | ||
if not text then return text end | if not text then return text end | ||
return mw.ustring.gsub( | return mw.ustring.gsub( | ||
text, '[一-龠ぁ-ゔァ-ヴー々〆〤ヶ]+', | text, '[一-龠ぁ-ゔァ-ヴー々〆〤ヶ]+', | ||
第29行: | 第31行: | ||
end | end | ||
local function langLink(theType, __link, display) | 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 | end | ||
第42行: | 第42行: | ||
local display_lang = data.zh and data.display or formatLangText(data.display) | local display_lang = data.zh and data.display or formatLangText(data.display) | ||
if data.link then | if data.link then | ||
artist = artist .. langLink(theType, data.link, | artist = artist .. langLink(theType, data.link, display_lang, true) | ||
else | else | ||
artist = artist .. (display_lang or '') | artist = artist .. (display_lang or '') | ||
第79行: | 第79行: | ||
end | end | ||
local function | local CALv2 | ||
local function findArtist(artistName) | |||
CALv2 = CALv2 or mw.loadJsonData 'Template:ComplexArtistsList.json' | |||
local | |||
local | local artist_list = CALv2[artistName] | ||
local theType = '曲师' | |||
if artist_list then | |||
if artist_list.__FullData__ then | |||
if | artist = fullCL(theType, artist_list.__FullData__) | ||
else | |||
artist = defaultCL(theType, artistName, artist_list) | |||
end | end | ||
else | |||
artist = langLink(theType, artistName) | |||
end | end | ||
return artist | |||
end | end | ||
function p.artistLink(artistName) | function p.artistLink(artistName) | ||
第111行: | 第104行: | ||
-- 注意事项:json转义符,如曲师名称有 " 需要写成 \"(点名Gram(DJ Genki)); | -- 注意事项:json转义符,如曲师名称有 " 需要写成 \"(点名Gram(DJ Genki)); | ||
-- lua匹配转义符,CALv2使用匹配简化结构,注意默认格式下value即显示部分(冒号右侧) . * 等符号需要在之前添加%转义 | -- lua匹配转义符,CALv2使用匹配简化结构,注意默认格式下value即显示部分(冒号右侧) . * 等符号需要在之前添加%转义 | ||
if artistName then artistName=tostring(artistName) else return end | 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 | |||
local function findDesigner(designerName) | |||
DL = DL or mw.loadJsonData 'Template:DesignersList.json' | |||
local CDL = DL.complex | |||
local SDL = DL.simple | |||
local theType = '谱师' | |||
local | local function defaultSDL(text) | ||
local temp_text = text | |||
local link_placeholders = {} | |||
if | 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) | |||
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 | end | ||
local designer | local designer | ||
local theType = '谱师' | local theType = '谱师' | ||
第148行: | 第157行: | ||
designerName = designerName==''and ' ' or designerName | designerName = designerName==''and ' ' or designerName | ||
if songid then | if songid then | ||
if | if DL.special[songid] then | ||
return langLink(theType,'与主线剧情相关的特殊名义', designerName) | return langLink(theType,'与主线剧情相关的特殊名义', designerName) | ||
end | end | ||
end | end | ||
return langLink(theType, '其他未确认谱师名义', designerName) | 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) | |||
memory.designer[designerName] = designer | |||
return designer | |||
end | end | ||
第164行: | 第184行: | ||
-- 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']=''} | ||
第188行: | 第212行: | ||
end | end | ||
local pack = link(packLink, packDisplay) | local pack = link(packLink, packDisplay) | ||
memory[class][packName] = pack | |||
return pack | return pack | ||
end | end | ||
local lang, VT | |||
function p.fullVersionNum(ver, date) | function p.fullVersionNum(ver, date) | ||
local lang = mw.language.getContentLanguage() | local verClass = math.floor(date/100) | ||
local verData = getMemory('ver', verClass) | |||
if verData then return verData[1], verData[2], ymd end | |||
local function findVer() | |||
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,ymd end | |||
local dates = vt.time | |||
local version = vt.ver | |||
if #dates ~= #version then return ver,ymd,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 | end | ||
return ver.. '.' ..version[l], dates[l], ymd | |||
end | end | ||
return | verData={} | ||
verData[1], verData[2], verData[3] = findVer() | |||
memory.ver[verClass] = verData | |||
return verData[1], verData[2], verData[3] | |||
end | end | ||
第239行: | 第273行: | ||
function p.artistShowAll() | function p.artistShowAll() | ||
local lines = 'Artist Show All | local lines = '==Artist Show All==\n' | ||
local | local slst = mw.loadJsonData 'Template:Songlist.json' | ||
for name | local Artists = {} | ||
for _,song in pairs(slst.songs) do | |||
local id = song.id | |||
local artist = song.artist | |||
if not Artists[artist] then Artists[artist] = true end | |||
end | |||
for name in pairs(Artists) do | |||
lines = lines .. p.artistLink(name) .. '<br>' | lines = lines .. p.artistLink(name) .. '<br>' | ||
end | end | ||
第247行: | 第287行: | ||
end | end | ||
function p. | function p.designerShowAll() | ||
local lines = 'Designer Show All | local lines = '==Designer Show All==\n' | ||
local slst = mw.loadJsonData 'Template:Songlist.json' | local slst = mw.loadJsonData 'Template:Songlist.json' | ||
local Designers = {} | local Designers = {} | ||
第264行: | 第304行: | ||
end | end | ||
function p. | function p.packShowAll() | ||
local lines = 'Show All:<br>' | local lines = '==Pack Show All==\n' | ||
local function append(t) lines = lines .. t ..'<br>' end | |||
local slst = mw.loadJsonData 'Template:Songlist.json' | |||
local mad = require 'Module:AnotherData' | |||
local trans = mw.loadJsonData 'Template:Transition.json' | |||
local Packs = {} | |||
for _,song in pairs(slst.songs) do | |||
local id = song.set | |||
local pack | |||
if not Packs[id] then | |||
pack = trans.packName[id] or mad.packQueryWrap(id).name | |||
Packs[id] = pack | |||
end | |||
end | |||
for id,name in pairs(Packs) do | |||
append(p.packLink(name)) | |||
p.packLink(name,1) | |||
end | |||
return lines | |||
end | |||
function p.verShowAll() | |||
local lines = '==Version Show All==\n' | |||
local function append(t) lines = lines .. t ..'<br>' end | |||
local slst = mw.loadJsonData 'Template:Songlist.json' | local slst = mw.loadJsonData 'Template:Songlist.json' | ||
for _,song in pairs(slst.songs) do | for _,song in pairs(slst.songs) do | ||
local | local d = song.date | ||
local | local v = song.version | ||
local date = song.date | local vv, dd, t = p.fullVersionNum(v, d) | ||
append(vv ..'('.. dd..') '..(t~=dd and t or '')) | |||
if song.difficulties[4] and song.difficulties[4].date then | |||
local d = song.difficulties[4].date | |||
local v = song.difficulties[4].version | |||
local vv, dd, t = p.fullVersionNum(v, d) | |||
append(vv ..'('.. dd..') '..(t~=dd and t or '')) | |||
end | |||
end | |||
local Idx={} | |||
for idx in pairs(memory.ver) do | |||
table.insert(Idx, idx) | |||
end | |||
append("\n===Summary===\n") | |||
table.sort(Idx) | |||
for _,idx in ipairs(Idx) do | |||
append(idx..' '..(memory.ver[idx][1] or '') ..' ('.. (memory.ver[idx][2] or '') | |||
.." "..(20000000+tonumber(memory.ver[idx][2])~=tonumber(os.date("%Y%m%d", idx*100)) and os.date("%Y%m%d", idx*100) or '')..')') | |||
end | end | ||
return lines | return lines | ||
end | |||
local function readMemory() | |||
local text = '' | |||
local function append(t) text = text .. t end | |||
for i,j in pairs(memory) do | |||
append('\n==memory.'..i..'==\n') | |||
for ii,jj in pairs(j) do | |||
if type(jj) == 'table' then | |||
append(ii..' --> '..jj[1]..' '..jj[2]..'<br>\n') | |||
else | |||
append(ii..' --> '..jj..'<br>\n') | |||
end | |||
end | |||
end | |||
return text | |||
end | |||
function p.test() | |||
local text = '' | |||
local function append(t) text = text .. t ..'\n'end | |||
-- append(p.packShowAll()) | |||
-- append(p.artistShowAll()) | |||
-- append(p.designerShowAll()) | |||
append(p.verShowAll()) | |||
append(readMemory()) | |||
return text | |||
end | end | ||
return p | return p |
2024年8月10日 (六) 09:40的最新版本
可在Module:沙盒/Economy666/CL/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
local function findDesigner(designerName)
DL = DL or mw.loadJsonData 'Template:DesignersList.json'
local CDL = DL.complex
local SDL = DL.simple
local theType = '谱师'
local function defaultSDL(text)
local temp_text = 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)
placeholder_count = placeholder_count + 1
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 designer
local theType = '谱师'
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)
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
function p.fullVersionNum(ver, date)
local verClass = math.floor(date/100)
local verData = getMemory('ver', verClass)
if verData then return verData[1], verData[2], ymd end
local function findVer()
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,ymd end
local dates = vt.time
local version = vt.ver
if #dates ~= #version then return ver,ymd,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], ymd
end
verData={}
verData[1], verData[2], verData[3] = findVer()
memory.ver[verClass] = verData
return verData[1], verData[2], verData[3]
end
function p.artistLinkFrame(frame)
local name
if frame and frame.args[1] then
name = frame.args[1]
else
return ''
end
local al = p.artistLink(name)
return al
end
function p.packLinkFrame(frame)
if frame then
local name = frame.args['name'] or nil
local short = frame.args['short'] or nil
local ns = frame.args['ns'] or nil
return p.packLink(name, short, ns)
else
return 'none'
end
end
function p.artistShowAll()
local lines = '==Artist Show All==\n'
local slst = mw.loadJsonData 'Template:Songlist.json'
local Artists = {}
for _,song in pairs(slst.songs) do
local id = song.id
local artist = song.artist
if not Artists[artist] then Artists[artist] = true end
end
for name in pairs(Artists) do
lines = lines .. p.artistLink(name) .. '<br>'
end
return lines
end
function p.designerShowAll()
local lines = '==Designer Show All==\n'
local slst = mw.loadJsonData 'Template:Songlist.json'
local Designers = {}
for _,song in pairs(slst.songs) do
local id = song.id
for _,level in pairs(song.difficulties) do
local name = level.chartDesigner
Designers[name] = id
end
end
for name,id in pairs(Designers) do
lines = lines .. p.designerLink(name,id) .. '<br>'
end
return lines
end
function p.packShowAll()
local lines = '==Pack Show All==\n'
local function append(t) lines = lines .. t ..'<br>' end
local slst = mw.loadJsonData 'Template:Songlist.json'
local mad = require 'Module:AnotherData'
local trans = mw.loadJsonData 'Template:Transition.json'
local Packs = {}
for _,song in pairs(slst.songs) do
local id = song.set
local pack
if not Packs[id] then
pack = trans.packName[id] or mad.packQueryWrap(id).name
Packs[id] = pack
end
end
for id,name in pairs(Packs) do
append(p.packLink(name))
p.packLink(name,1)
end
return lines
end
function p.verShowAll()
local lines = '==Version Show All==\n'
local function append(t) lines = lines .. t ..'<br>' end
local slst = mw.loadJsonData 'Template:Songlist.json'
for _,song in pairs(slst.songs) do
local d = song.date
local v = song.version
local vv, dd, t = p.fullVersionNum(v, d)
append(vv ..'('.. dd..') '..(t~=dd and t or ''))
if song.difficulties[4] and song.difficulties[4].date then
local d = song.difficulties[4].date
local v = song.difficulties[4].version
local vv, dd, t = p.fullVersionNum(v, d)
append(vv ..'('.. dd..') '..(t~=dd and t or ''))
end
end
local Idx={}
for idx in pairs(memory.ver) do
table.insert(Idx, idx)
end
append("\n===Summary===\n")
table.sort(Idx)
for _,idx in ipairs(Idx) do
append(idx..' '..(memory.ver[idx][1] or '') ..' ('.. (memory.ver[idx][2] or '')
.." "..(20000000+tonumber(memory.ver[idx][2])~=tonumber(os.date("%Y%m%d", idx*100)) and os.date("%Y%m%d", idx*100) or '')..')')
end
return lines
end
local function readMemory()
local text = ''
local function append(t) text = text .. t end
for i,j in pairs(memory) do
append('\n==memory.'..i..'==\n')
for ii,jj in pairs(j) do
if type(jj) == 'table' then
append(ii..' --> '..jj[1]..' '..jj[2]..'<br>\n')
else
append(ii..' --> '..jj..'<br>\n')
end
end
end
return text
end
function p.test()
local text = ''
local function append(t) text = text .. t ..'\n'end
-- append(p.packShowAll())
-- append(p.artistShowAll())
-- append(p.designerShowAll())
append(p.verShowAll())
append(readMemory())
return text
end
return p