Module:BrandSeries: Difference between revisions
Fix parameter passing - check frame.args first, then parent (via update-page on MediaWiki MCP Server) |
Use Category:CRTs without series for unassigned link (SMW !+ queries don't work) (via update-page on MediaWiki MCP Server) |
||
| (10 intermediate revisions by the same user not shown) | |||
| Line 10: | Line 10: | ||
s = s:gsub('^%s+', ''):gsub('%s+$', '') | s = s:gsub('^%s+', ''):gsub('%s+$', '') | ||
if s == '' then return nil end | if s == '' then return nil end | ||
return s | |||
end | |||
-- Encode a string for use in Special:Ask URL path | |||
local function encodeForAsk(s) | |||
-- Special:Ask uses a custom encoding: [ = -5B, ] = -5D, space = _, etc. | |||
s = s:gsub('%[', '-5B') | |||
s = s:gsub('%]', '-5D') | |||
s = s:gsub(' ', '_') | |||
s = s:gsub('%+', '-2B') | |||
s = s:gsub('!', '-21') | |||
return s | return s | ||
end | end | ||
| Line 28: | Line 39: | ||
return '<span class="error">Error: brand parameter required</span>' | return '<span class="error">Error: brand parameter required</span>' | ||
end | end | ||
-- Query total count of all CRTs for this brand | |||
local totalQuery = string.format( | |||
'{{#ask:[[Category:CRT models]][[Has brand::%s]]|format=count}}', | |||
brand | |||
) | |||
local totalResult = frame:preprocess(totalQuery) | |||
local totalCount = tonumber(trim(totalResult)) or 0 | |||
-- Query all CRTs for this brand with their series using broadtable | -- Query all CRTs for this brand with their series using broadtable | ||
| Line 35: | Line 54: | ||
) | ) | ||
local crtResult = frame:preprocess(crtQuery) | local crtResult = frame:preprocess(crtQuery) | ||
-- Count occurrences of each series by parsing HTML table | -- Count occurrences of each series by parsing HTML table | ||
local seriesCounts = {} | local seriesCounts = {} | ||
local assignedCount = 0 | |||
if crtResult and crtResult ~= '' then | if crtResult and crtResult ~= '' then | ||
-- Parse each table row | -- Parse each table row | ||
| Line 53: | Line 70: | ||
if #cells >= 2 and cells[2] then | if #cells >= 2 and cells[2] then | ||
local series = cells[2] | local series = cells[2] | ||
if series and series ~= '' then | -- Filter out invalid series values like "+" | ||
if series and series ~= '' and series ~= '+' then | |||
seriesCounts[series] = (seriesCounts[series] or 0) + 1 | seriesCounts[series] = (seriesCounts[series] or 0) + 1 | ||
assignedCount = assignedCount + 1 | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
-- Calculate unassigned as total minus assigned | |||
local unassignedCount = totalCount - assignedCount | |||
-- Convert to sorted array | -- Convert to sorted array | ||
| Line 72: | Line 94: | ||
table.sort(rows, function(a, b) return a.series < b.series end) | table.sort(rows, function(a, b) return a.series < b.series end) | ||
-- If no series found | -- If no series found and no unassigned, return nothing | ||
if #rows == 0 then | if #rows == 0 and unassignedCount <= 0 then | ||
return | return "" | ||
end | end | ||
-- Build the table as | -- Build the table as wikitext (so links render properly) | ||
local | local lines = {} | ||
table.insert(lines, '{| class="wikitable"') | |||
table.insert(lines, '! Series !! Count') | |||
-- | -- Series rows | ||
for _, row in ipairs(rows) do | |||
local seriesLink = '[[' .. row.series .. ']]' | |||
table.insert(lines, '|-') | |||
table.insert(lines, '| ' .. seriesLink .. ' || ' .. tostring(row.count)) | |||
end | |||
-- | -- Unassigned row (if any) with link to Special:Ask | ||
if unassignedCount > 0 then | |||
local | -- Use Category:CRTs without series instead of [[Has series::!+]] | ||
-- because SMW's negated existence queries don't work correctly | |||
local askQuery = string.format('[[Category:CRTs without series]][[Has brand::%s]]', brand) | |||
local askUrl = 'https://wiki.everycrt.com/wiki/Special:Ask/' .. encodeForAsk(askQuery) | |||
-- Use wikitext external link syntax with full URL | |||
local unassignedLink = "[" .. askUrl .. " ''(Unassigned)'']" | |||
table.insert(lines, '|-') | |||
table.insert(lines, '| ' .. unassignedLink .. ' || ' .. tostring(unassignedCount)) | |||
end | end | ||
return | table.insert(lines, '|}') | ||
return table.concat(lines, '\n') | |||
end | end | ||
return p | return p | ||