Module:AVBrandList: Difference between revisions
Increase query limit and suppress "further results" link for consistency (via update-page on MediaWiki MCP Server) |
Implement pagination for consistency and future-proofing (via update-page on MediaWiki MCP Server) |
||
| Line 2: | Line 2: | ||
-- Dynamically generates a list of AV device brand buttons by querying | -- Dynamically generates a list of AV device brand buttons by querying | ||
-- all unique brands from the AV devices category. | -- all unique brands from the AV devices category. | ||
-- Uses pagination to work around server-side SMW query limits. | |||
local p = {} | local p = {} | ||
| Line 11: | Line 12: | ||
if s == '' then return nil end | if s == '' then return nil end | ||
return s | return s | ||
end | |||
local function extractBrandsFromResult(queryResult, brandsSet, brandsList) | |||
if not queryResult then return end | |||
for cellContent in queryResult:gmatch('<td[^>]*>(.-)</td>') do | |||
local brand = trim(cellContent:gsub('<[^>]+>', '')) | |||
if brand and brand ~= '' and not brandsSet[brand] then | |||
brandsSet[brand] = true | |||
table.insert(brandsList, brand) | |||
end | |||
end | |||
end | end | ||
function p.list(frame) | function p.list(frame) | ||
local brandsSet = {} | local brandsSet = {} | ||
local brandsList = {} | local brandsList = {} | ||
-- Query in batches to work around server-side limits | |||
local batchSize = 500 | |||
local | local maxBatches = 20 -- Safety limit | ||
for batch = 0, maxBatches - 1 do | |||
local offset = batch * batchSize | |||
local queryWikitext = | |||
'{{#ask:\n' .. | |||
' [[Category:AV devices]]\n' .. | |||
' |?Has brand\n' .. | |||
' |format=broadtable\n' .. | |||
' |headers=hide\n' .. | |||
' |link=none\n' .. | |||
' |mainlabel=-\n' .. | |||
' |limit=' .. batchSize .. '\n' .. | |||
' |offset=' .. offset .. '\n' .. | |||
' |searchlabel=\n' .. | |||
'}}' | |||
local queryResult = frame:preprocess(queryWikitext) | |||
extractBrandsFromResult(queryResult, brandsSet, brandsList) | |||
-- Count cells to check if we got a full batch | |||
local cellCount = 0 | |||
if queryResult then | |||
for _ in queryResult:gmatch('<td[^>]*>') do | |||
cellCount = cellCount + 1 | |||
end | end | ||
end | |||
-- If we got fewer results than batch size, we're done | |||
if cellCount < batchSize then | |||
break | |||
end | end | ||
end | end | ||