Module:曲目页面:修订间差异
曲师→曲师列表、谱师→谱师列表 自动索引;autoUnlock 支持 教程/剧情模式 |
自动索引加过滤:列表中确实存在该小节时才链接(教程/训练场独占曲师显示为纯文本) |
||
| 第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 | ||