|
|
(未显示同一用户的3个中间版本) |
第1行: |
第1行: |
| local checkType = require 'libraryUtil'.checkType
| | local p = {} |
| local getArgs = require 'Module:Arguments'.getArgs
| | function p.len(frame) |
| local lang = mw.language.getContentLanguage()
| | return #frame.args.a |
| local p = {} | |
| | |
| local function chain(obj, expr)
| |
| local first = expr:sub(1, 1)
| |
| if first ~= '.' and first ~= '?' then return obj[expr] end | |
| for op, sKey in expr:gmatch '([.?])([^.?]+)' do
| |
| if op == '?' and obj == nil then break end
| |
| local iKey = tonumber(sKey)
| |
| local key = iKey or sKey
| |
| obj = obj[key]
| |
| end
| |
| return obj
| |
| end | | end |
| | | function p.explode(frame) |
| local srcFileName = {
| | return mw.dumpObject({mw.ustring.byte(frame.args.a,1,-1)}) |
| ['songs'] = {'Songlist.json', 'Songlist NS.json'},
| |
| ['packs'] = {'Packlist.json', 'Packlist NS'},
| |
| ['unlocks'] = {'Unlocks.json', 'Unlocks NS'},
| |
| }
| |
| function p.listOf(type, platform) | |
| return mw.text.jsonDecode(mw.title.new(srcFileName[type][platform == 'ns' and 2 or 1], 'Template'):getContent())[type] | |
| end | | end |
|
| |
| local commonExpr = {
| |
| title = '.title_localized.en',
| |
| pstChartDesigner = '.difficulties.1.chartDesigner',
| |
| pstJacketDesigner = '.difficulties.1.jacketDesigner',
| |
| pstRating = '.difficulties.1.rating',
| |
| prsChartDesigner = '.difficulties.2.chartDesigner',
| |
| prsJacketDesigner = '.difficulties.2.jacketDesigner',
| |
| prsRating = '.difficulties.2.rating',
| |
| ftrChartDesigner = '.difficulties.3.chartDesigner',
| |
| ftrJacketDesigner = '.difficulties.3.jacketDesigner',
| |
| -- ftrRating
| |
| bydChartDesigner = '.difficulties.4?chartDesigner',
| |
| bydJacketDesigner = '.difficulties.4?jacketDesigner',
| |
| -- bydRating
| |
| pstChange = '.difficulties.1.has_controller_alt_chart',
| |
| prsChange = '.difficulties.2.has_controller_alt_chart',
| |
| ftrChange = '.difficulties.3.has_controller_alt_chart',
| |
| bydAudioChange = '.difficulties.4?audioOverride',
| |
| bydBg = '.difficulties.4?bg',
| |
| bydBPM = '.difficulties.4?bpm',
| |
| bydArtist = '.difficulties.4?artist',
| |
| }
| |
| local commonFunc = {}
| |
| function commonFunc.titleName(obj)
| |
| local trans = mw.loadJsonData 'Template:Transition.json'
| |
| local name = obj['title_localized']['en']
| |
| local res = trans.songNameToDisplayName[name]
| |
| if res then return res end
| |
| res = trans.sameName[name]
| |
| if res then return res[obj['id']] end
| |
| end
| |
| function commonFunc.ftrRating(obj)
| |
| local diff = obj['difficulties'][3]
| |
| return diff['rating'] .. (diff['ratingPlus'] and '+' or '')
| |
| end
| |
| function commonFunc.bydRating(obj)
| |
| local diff = obj['difficulties'][4]
| |
| if not diff then return nil end
| |
| return diff['rating'] .. (diff['ratingPlus'] and '+' or '')
| |
| end
| |
|
| |
| local INFO = '__info'
| |
| local function songQuery(target, property)
| |
| checkType('songQuery', 2, property, 'string')
| |
| local obj = getmetatable(target)[INFO]
| |
| if next(obj) == nil then return nil end
| |
| local expr = commonExpr[property]
| |
| if expr then return chain(obj, expr) end
| |
| local func = commonFunc[property]
| |
| if func then return func(obj) end
| |
| return chain(obj, property)
| |
| end
| |
| function p.songQueryWrap(tar)
| |
| checkType('songQueryWrap', 1, tar, 'table')
| |
| return setmetatable({}, {__call = songQuery, __index = songQuery, [INFO] = tar})
| |
| end
| |
|
| |
| ---传入曲名或ID,获得一个查阅信息的函数。直接在下一个模块使用。
| |
| ---@param index string 曲目的索引,和typed一致
| |
| ---@param indexType 'id'|'name' 查找曲目的索引值类型
| |
| ---@param platform 'mobile'|'ns'
| |
| ---@return table
| |
| function p.singleSongInformation(index, indexType, platform)
| |
| local lSong = p.listOf('songs', platform)
| |
| local sKey = index
| |
| local tar = {}
| |
| if indexType == 'id' then
| |
| for _, k in ipairs(lSong) do
| |
| if k['id'] == sKey then
| |
| tar = k
| |
| break
| |
| end
| |
| end
| |
| else
| |
| sKey = lang:ucfirst(index)
| |
| for _, k in ipairs(lSong) do
| |
| if lang:ucfirst(k['title_localized']['en']) == sKey then
| |
| tar = k
| |
| break
| |
| end
| |
| end
| |
| end
| |
| if next(tar) == nil then mw.log('无法在Songlist中发现目标,索引值为:' .. index) end
| |
| return p.songQueryWrap(tar)
| |
| end
| |
|
| |
| --undone
| |
| function p.songMapWrap(platform)
| |
| local lSong = p.listOf('songs', platform)
| |
| local res = {}
| |
| for _, k in ipairs(lSong) do
| |
| res[k['id']] = k
| |
| res[lang:ucfirst(k['title_localized']['en'])] = k
| |
| end
| |
| return res
| |
| end
| |
|
| |
| local mPlatFormPackData = {}
| |
| local function mobilePackSection(pack)
| |
| return pack['section']
| |
| end
| |
| local lSectionNS = {'free', 'mainstory', 'sidestory'}
| |
| local function nsPackSection(pack)
| |
| if pack['pack_parent'] then return nil end
| |
| if mw.loadJsonData 'Template:Transition.json'.packName[pack['id']] then return 'collab' end
| |
| return lSectionNS[pack['section']]
| |
| end
| |
| function p.packQueryWrap(id, platform)
| |
| local packData = mPlatFormPackData[platform]
| |
| if not packData then
| |
| packData = {}
| |
| mPlatFormPackData[platform] = packData
| |
| local packSection = platform == 'ns' and nsPackSection or mobilePackSection
| |
| for _, pack in ipairs(p.listOf('packs', platform)) do
| |
| local item = {pack['pack_parent'], name = pack['name_localized']['en'], section = packSection(pack)}
| |
| packData[pack['id']] = item
| |
| end
| |
| packData['single'] = {name = 'Memory Archive', section = 'single'}
| |
| for _, item in pairs(packData) do
| |
| local parentId = unpack(item)
| |
| local parent
| |
| if parentId then
| |
| parent = packData[parentId]
| |
| if item.name:match 'Collaboration Chapter' then
| |
| item.name = parent.name .. ' ' .. item.name
| |
| end
| |
| end
| |
| item.section = item.section or parent.section
| |
| end
| |
| end
| |
| -- return id and packData[id] or packData
| |
| return packData[id] or {name = '请更新plst', section = 'unknown'}
| |
| end
| |
|
| |
| function makeInvokeFunc(funcName)
| |
| return function(frame)
| |
| local args = getArgs(frame)
| |
| return p[funcName](args)
| |
| end
| |
| end
| |
| -- 面向wikitext直接查询
| |
| p.Song_Query = makeInvokeFunc '_Song_Query'
| |
| function p._Song_Query(args)
| |
| return p.singleSongInformation(args[1], args[2], args[4])(args[3])
| |
| end
| |
| p.Pack_Query = makeInvokeFunc '_Pack_Query'
| |
| function p._Pack_Query(args)
| |
| return p.packQueryWrap(args[1], args[2]).name
| |
| end
| |
|
| |
| return p | | return p |