MediaWiki:Common.js: Unterschied zwischen den Versionen
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Admin (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
| Zeile 664: | Zeile 664: | ||
/* ========== Kategorien rekursiv einsammeln (inkl. Subkats, Namespaces) ========== */ | /* ========== Kategorien rekursiv einsammeln (inkl. Subkats, Namespaces) ========== */ | ||
// NIMMT nsStr (z. B. "*", "0|102|14"). Bei "*" wird cmnamespace NICHT gesetzt. | |||
function fetchCategoryMembersRecursiveSingleResolved(api, catTitle, limit, outSet, pages, nsStr){ | |||
var visited = {}, queue = [catTitle]; | |||
var cmNS = (nsStr && nsStr.trim()) ? nsStr.trim() : '0|14'; // default: Artikel+Kategorie | |||
function fetchOne(title, cont){ | |||
var params = { | |||
action: 'query', | |||
list: 'categorymembers', | |||
cmtitle: title, | |||
// cmnamespace nur setzen, wenn NICHT "*" | |||
if (cont) params.cmcontinue = cont; | cmtype: 'page|subcat', | ||
cmlimit: Math.min(200, limit), | |||
format: 'json' | |||
}; | |||
if (cmNS !== '*' && cmNS !== '') { | |||
params.cmnamespace = cmNS; // z.B. "0|102|14" | |||
} | |||
if (cont) params.cmcontinue = cont; | |||
return api.get(params).then(function(d){ | |||
var cms = (d.query && d.query.categorymembers) || [], i, it; | |||
for (i = 0; i < cms.length; i++) { | |||
it = cms[i]; | |||
if (it.ns !== 14) { // alles außer Kategorien zählt als Seite | |||
var pid = String(it.pageid); | |||
if (!outSet[pid] && pages.length < limit) { | |||
outSet[pid] = 1; | |||
pages.push({ pageid: pid, title: it.title }); | |||
} | } | ||
} else { | |||
var sub = it.title; | |||
if (!visited[sub]) { visited[sub] = 1; queue.push(sub); } | |||
} | } | ||
} | |||
var next = d.continue && d.continue.cmcontinue; | |||
if (next && pages.length < limit) return fetchOne(title, next); | |||
}); | |||
} | |||
function loop(){ | |||
if (pages.length >= limit || !queue.length) return Promise.resolve(); | |||
var next = queue.shift(); | |||
if (visited[next]) return loop(); | |||
visited[next] = 1; | |||
return fetchOne(next).then(loop); | |||
} | |||
return loop(); | |||
} | |||
function fetchCategoryMembersRecursiveMulti(rootCats, limit, status, nsStr){ | function fetchCategoryMembersRecursiveMulti(rootCats, limit, status, nsStr){ | ||