Module:Soldier: Difference between revisions
Expand more nativity code aliases (Pal, Col, Arg, …) |
Infobox Teams row: merge IPW fields, |teams=, and research-note team codes |
||
| Line 1,774: | Line 1,774: | ||
return '' | return '' | ||
end | end | ||
-- Filled after noteTeamNames (local forward declare; used by p.infobox). | |||
local addTeamsInfoboxRow | |||
function p.infobox(frame) | function p.infobox(frame) | ||
| Line 1,909: | Line 1,912: | ||
addRow(tbl, 'Unit / division', prettyProse(parentArg(frame, 'division'))) | addRow(tbl, 'Unit / division', prettyProse(parentArg(frame, 'division'))) | ||
addRow(tbl, 'Battles / wars', formatBattles(parentArg(frame, 'battles'))) | addRow(tbl, 'Battles / wars', formatBattles(parentArg(frame, 'battles'))) | ||
addTeamsInfoboxRow(tbl, frame) | |||
addRow(tbl, 'Arrived', parentArg(frame, 'date_arrive')) | addRow(tbl, 'Arrived', parentArg(frame, 'date_arrive')) | ||
addRow(tbl, 'Departed', parentArg(frame, 'date_depart')) | addRow(tbl, 'Departed', parentArg(frame, 'date_depart')) | ||
| Line 2,045: | Line 2,047: | ||
end | end | ||
return names | return names | ||
end | |||
local function appendUniqueTeamName(names, seen, name) | |||
name = trim(tostring(name or '')) | |||
if name == '' or seen[name] then | |||
return | |||
end | |||
seen[name] = true | |||
table.insert(names, name) | |||
end | |||
local function namesFromIpwGerman(raw) | |||
local names = {} | |||
local seen = {} | |||
for part in mw.text.gsplit(raw or '', ';', true) do | |||
part = trim(part) | |||
part = mw.ustring.gsub(part, '[#<>%[%]|{}]', '') | |||
part = trim(part) | |||
if part ~= '' then | |||
local code, shown, mii = normalizeIpwTeamCode(part) | |||
if mii then | |||
appendUniqueTeamName(names, seen, 'MII ' .. mii) | |||
elseif code then | |||
appendUniqueTeamName(names, seen, 'IPW ' .. shown) | |||
end | |||
end | |||
end | |||
return names | |||
end | |||
local function namesFromIpwItalian(raw) | |||
local names = {} | |||
local seen = {} | |||
for part in mw.text.gsplit(raw or '', ';', true) do | |||
part = trim(part) | |||
part = mw.ustring.gsub(part, '[#<>%[%]|{}]', '') | |||
part = trim(part) | |||
if part ~= '' then | |||
local code = normalizeIpwItalianCode(part) | |||
if code then | |||
appendUniqueTeamName(names, seen, 'IPW Italian ' .. code) | |||
end | |||
end | |||
end | |||
return names | |||
end | |||
--- Explicit |teams= values: "MII 439-G; IPW 12" or shorthand "439-G". | |||
local function namesFromTeamsParam(raw) | |||
local names = {} | |||
local seen = {} | |||
for part in mw.text.gsplit(raw or '', ';', true) do | |||
part = trim(part) | |||
if part ~= '' then | |||
local fromScan = noteTeamNames(part) | |||
if #fromScan > 0 then | |||
for _, name in ipairs(fromScan) do | |||
appendUniqueTeamName(names, seen, name) | |||
end | |||
else | |||
local upper = mw.ustring.upper(part) | |||
local itRest = mw.ustring.match(upper, '^IPW%s+ITALIAN%s+(.+)$') | |||
if itRest then | |||
local code = normalizeIpwItalianCode(itRest) | |||
if code then | |||
appendUniqueTeamName(names, seen, 'IPW Italian ' .. code) | |||
end | |||
else | |||
local ipwRest = mw.ustring.match(upper, '^IPW%s+(.+)$') | |||
if ipwRest then | |||
local code, shown, mii = normalizeIpwTeamCode(ipwRest) | |||
if mii then | |||
appendUniqueTeamName(names, seen, 'MII ' .. mii) | |||
elseif code then | |||
appendUniqueTeamName(names, seen, 'IPW ' .. shown) | |||
end | |||
else | |||
local code, shown, mii = normalizeIpwTeamCode(part) | |||
if mii then | |||
appendUniqueTeamName(names, seen, 'MII ' .. mii) | |||
elseif code and mw.ustring.match(tostring(shown or code), '^%d') then | |||
appendUniqueTeamName(names, seen, 'IPW ' .. shown) | |||
end | |||
end | |||
end | |||
end | |||
end | |||
end | |||
return names | |||
end | |||
local function teamNameLink(name) | |||
return string.format('[[Team %s|%s]]', name, name) | |||
end | |||
local function pageResearchNotesText() | |||
local title = mw.title.getCurrentTitle() | |||
if not title or not title.getContent then | |||
return '' | |||
end | |||
local ok, content = pcall(function() | |||
return title:getContent() | |||
end) | |||
if not ok or not content then | |||
return '' | |||
end | |||
return researchNotesSection(content) | |||
end | |||
--- Roster IPW fields + optional |teams= + research-note team codes, one linked row. | |||
addTeamsInfoboxRow = function(tbl, frame) | |||
local names = {} | |||
local seen = {} | |||
local function addAll(list) | |||
for _, name in ipairs(list) do | |||
appendUniqueTeamName(names, seen, name) | |||
end | |||
end | |||
addAll(namesFromIpwGerman(parentArg(frame, 'ipw_ge'))) | |||
addAll(namesFromIpwItalian(parentArg(frame, 'ipw_it'))) | |||
addAll(namesFromTeamsParam(parentArg(frame, 'teams'))) | |||
addAll(noteTeamNames(pageResearchNotesText())) | |||
if #names == 0 then | |||
return | |||
end | |||
local links = {} | |||
for _, name in ipairs(names) do | |||
table.insert(links, teamNameLink(name)) | |||
end | |||
local label = 'Team' | |||
if #names > 1 then | |||
label = 'Teams' | |||
end | |||
addRow(tbl, label, table.concat(links, ', ')) | |||
end | end | ||
| Line 2,058: | Line 2,194: | ||
return '' | return '' | ||
end | end | ||
local seen = {} | |||
local bits = {} | local bits = {} | ||
local function addCat(name) | |||
name = trim(tostring(name or '')) | |||
if name == '' or seen[name] then | |||
return | |||
end | |||
seen[name] = true | |||
table.insert(bits, '[[Category:Team ' .. name .. ']]') | |||
end | |||
for _, name in ipairs(noteTeamNames(researchNotesSection(content))) do | for _, name in ipairs(noteTeamNames(researchNotesSection(content))) do | ||
addCat(name) | |||
end | |||
for _, name in ipairs(namesFromTeamsParam(parentArg(frame, 'teams'))) do | |||
addCat(name) | |||
end | end | ||
return table.concat(bits) | return table.concat(bits) | ||