Module:曲目页面:修订间差异

Admin​(留言 | 贡献)
曲师→曲师列表、谱师→谱师列表 自动索引;autoUnlock 支持 教程/剧情模式
Admin​(留言 | 贡献)
自动索引加过滤:列表中确实存在该小节时才链接(教程/训练场独占曲师显示为纯文本)
第40行: 第40行:
end
end


-- 署名 → 链到 [[<列表页>#主名义]](马甲/合作名义自动归并)
-- 列表页里实际有小节的署名集合
local function linkedCredits(raw, lk, page)
local function knownCredits(data, lk, field, includeSpecial)
local known = {}
local function eat(list)
for _, s in ipairs(list or {}) do
local raw = s[field]
if type(raw) == 'table' then
for _, v in pairs(raw) do
for _, pt in ipairs(parse.attribute(lk, v) or parse.parts(v)) do known[pt.base] = true end
end
else
for _, pt in ipairs(parse.attribute(lk, raw) or parse.parts(raw)) do known[pt.base] = true end
end
end
end
eat(data.songs)
if includeSpecial then eat(data.special) end
return known
end
 
-- 署名 → 链到 [[<列表页>#主名义]](马甲/合作名义自动归并;无小节则纯文本)
local function linkedCredits(raw, lk, page, known)
if not raw or raw == '' then return '' end
if not raw or raw == '' then return '' end
local parts = parse.attribute(lk, raw) or parse.parts(raw)
local parts = parse.attribute(lk, raw) or parse.parts(raw)
local out = {}
local out = {}
for _, pt in ipairs(parts) do
for _, pt in ipairs(parts) do
out[#out + 1] = '[[' .. page .. '#' .. esc(pt.base) .. '|' .. esc(pt.base) .. ']]'
if known and not known[pt.base] then
out[#out + 1] = esc(pt.base)
else
out[#out + 1] = '[[' .. page .. '#' .. esc(pt.base) .. '|' .. esc(pt.base) .. ']]'
end
end
end
return table.concat(out, ' / ')
return table.concat(out, ' / ')
第146行: 第170行:
local artistLk = parse.buildLookup(loadJson(ARTIST_MAP))
local artistLk = parse.buildLookup(loadJson(ARTIST_MAP))
local charterLk = parse.buildLookup(loadJson(CHARTER_MAP))
local charterLk = parse.buildLookup(loadJson(CHARTER_MAP))
local knownArtists = knownCredits(data, artistLk, '曲师', true)
local knownCharters = knownCredits(data, charterLk, '谱师', false)


-- 信息框: 自动填 标题/图片/曲师/曲包/定数/谱师/时长/BPM, 手工传参可覆盖
-- 信息框: 自动填 标题/图片/曲师/曲包/定数/谱师/时长/BPM, 手工传参可覆盖
第156行: 第182行:
table.insert(out, '|图片= [[文件:曲绘-' .. esc(art) .. '.png|256px]]')
table.insert(out, '|图片= [[文件:曲绘-' .. esc(art) .. '.png|256px]]')
end
end
table.insert(out, '|曲师= ' .. arg(frame, '曲师', linkedCredits(song['曲师'], artistLk, '曲师列表')))
table.insert(out, '|曲师= ' .. arg(frame, '曲师', linkedCredits(song['曲师'], artistLk, '曲师列表', knownArtists)))
-- 曲包: 手工传参优先; 否则自动生成指向 曲包列表#<曲包名> 的链接
-- 曲包: 手工传参优先; 否则自动生成指向 曲包列表#<曲包名> 的链接
local packArg = frame.args['曲包']
local packArg = frame.args['曲包']
第171行: 第197行:
for _, d in ipairs({ 'CASUAL', 'TOUGH', 'INSANE', 'PRO' }) do
for _, d in ipairs({ 'CASUAL', 'TOUGH', 'INSANE', 'PRO' }) do
table.insert(out, '|' .. d .. '定数= ' .. fmt(consts[d]))
table.insert(out, '|' .. d .. '定数= ' .. fmt(consts[d]))
table.insert(out, '|' .. d .. '谱师= ' .. arg(frame, d .. '谱师', linkedCredits(charters[d], charterLk, '谱师列表')))
table.insert(out, '|' .. d .. '谱师= ' .. arg(frame, d .. '谱师', linkedCredits(charters[d], charterLk, '谱师列表', knownCharters)))
table.insert(out, '|' .. d .. '连击= ' .. esc(arg(frame, d .. '连击', '')))
table.insert(out, '|' .. d .. '连击= ' .. esc(arg(frame, d .. '连击', '')))
end
end