Module:BrandSeries: Difference between revisions

Remove Browse column, add Unassigned row for models without series (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)
 
(7 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 38: Line 57:
-- 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 73:
if series and series ~= '' and series ~= '+' then
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
Line 58: Line 79:
end
end
-- Query count of models with NO series assigned
-- Calculate unassigned as total minus assigned
local unassignedQuery = string.format(
local unassignedCount = totalCount - assignedCount
'{{#ask:[[Category:CRT models]][[Has brand::%s]][[Has series::!+]]|format=count}}',
brand
)
local unassignedResult = frame:preprocess(unassignedQuery)
local unassignedCount = tonumber(trim(unassignedResult)) or 0
-- Convert to sorted array
-- Convert to sorted array
Line 78: 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 and no unassigned models, return nothing
-- If no series found and no unassigned, return nothing
if #rows == 0 and unassignedCount == 0 then
if #rows == 0 and unassignedCount <= 0 then
return ""
return ""
end
end
Line 95: Line 111:
end
end
-- Unassigned row (if any)
-- Unassigned row (if any) with link to Special:Ask
if unassignedCount > 0 then
if unassignedCount > 0 then
-- 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, '|-')
table.insert(lines, "| ''(Unassigned)'' || " .. tostring(unassignedCount))
table.insert(lines, '| ' .. unassignedLink .. ' || ' .. tostring(unassignedCount))
end
end
MediaWiki Appliance - Powered by TurnKey Linux