Content deleted Content added
Polygnotus (talk | contribs) No edit summary |
Polygnotus (talk | contribs) No edit summary |
||
Line 1:
// Wikipedia Category Items Copier -
const API_DELAY = 500; // Delay between API requests in milliseconds
Line 275:
}
}
// Function to get all subcategories of a category
Line 316 ⟶ 318:
let apiUrl = `https://en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:${encodeURIComponent(categoryTitle)}&cmnamespace=0|1|2|3|4|5|6|7|8|9|10|11|12|13|15&cmlimit=max&maxlag=5&format=json&origin=*`;
// Add
if (ignoreRedirects) {
apiUrl += '&
}
Line 335 ⟶ 337:
}
// Extract members and
// When ignoreRedirects is true and we have page info, filter out redirects
members = data.query.categorymembers
.filter(member => {
const pageInfo = data.query.pages[member.pageid];
return pageInfo && !pageInfo.hasOwnProperty('redirect');
})
.map(member => member.title);
} else {
// Normal case - just get titles
members = data.query.categorymembers.map(member => member.title);
}
const nextContinueToken = data.continue ? data.continue.cmcontinue : null;
Line 359 ⟶ 374:
pagesProcessed++;
const redirectText = ignoreRedirects ? ' (filtering redirects)' : '';
statusText.innerHTML = `Retrieved ${allMembers.length} items from "${categoryTitle}" (page ${pagesProcessed})${redirectText}...`;
} while (continueToken);
Line 438 ⟶ 454:
totalCategories++;
const redirectText = ignoreRedirects ? ' (filtering redirects)' : '';
statusText.innerHTML = `Getting items from "${currentCategory}" (processed ${totalCategories} categories, found ${allItems.length} items, queue: ${queue.length})${redirectText}...`; // Get items from current category
Line 460 ⟶ 477:
// Handle "Copy Items" button click
copyItemsBtn.addEventListener('click', async () => {
statusText.innerHTML = 'Gathering items from this category via API...';▼
const redirectText = ignoreRedirects ? ' (filtering out redirects)' : '';
try {
▲ const ignoreRedirects = ignoreRedirectsCheckbox.checked;
const items = await getAllCategoryMembers(categoryName, ignoreRedirects);
Line 476 ⟶ 494:
const copySuccess = await copyToClipboardOrDownload(formattedText, categoryName);
if (copySuccess) {
const
statusText.innerHTML = `Successfully copied ${items.length} items to clipboard${
}
} catch (error) {
Line 512 ⟶ 530:
// Handle "Copy All Items" button click
copyAllItemsBtn.addEventListener('click', async () => {
const ignoreRedirects = ignoreRedirectsCheckbox.checked;
statusText.innerHTML = 'Gathering items from this category and all subcategories recursively via API (this may take a while)...';▼
const redirectText = ignoreRedirects ? ' (filtering out redirects)' : '';
▲ statusText.innerHTML =
try {
Line 518 ⟶ 538:
globalVisited.clear();
▲ const ignoreRedirects = ignoreRedirectsCheckbox.checked;
// Get all items recursively
const { items: allItems, totalCategories } = await getAllItemsRecursive(categoryName, ignoreRedirects);
Line 535 ⟶ 554:
const copySuccess = await copyToClipboardOrDownload(formattedText, categoryName + '_all_recursive');
if (copySuccess) {
const
statusText.innerHTML = `Successfully copied ${uniqueItems.length} unique items to clipboard from ${totalCategories} categories${
}
} catch (error) {
|