User:Kailash29792/CatSort.js

// Category Sorting Script

//

// Original script: User:Alex 21/script-categoriessort.js

// Edited to use Pathoschild's TemplateScript https://meta.wikimedia.org/wiki/TemplateScript

// Because of this request: https://en.wikipedia.org/wiki/Wikipedia:Village_pump_(technical)#User:Alex_21/script-categoriessort

(function() {

const DEBUG = false;

function debug(...args) {

if (DEBUG) {

console.log('[CatSort]', ...args);

}

}

function extractCategories(text) {

const start = text.indexOf('[[Category:');

if (start === -1) return { before: text, categories: '' };

return {

before: text.substr(0, start).trim(),

categories: text.substr(start).trim()

};

}

function reorderCategories(categories) {

const eponymousCategory = '[[Category:' + mw.config.get("wgTitle");

return categories.split('\n').sort((a, b) => {

if (a.startsWith(eponymousCategory)) return -1e8;

if (b.startsWith(eponymousCategory)) return 1e8;

const normalizeCategory = (cat) => {

if (cat.startsWith('[[Category:A ')) {

return [cat.replace('[[Category:A ', '[[Category:'), -1];

}

if (cat.startsWith('[[Category:The ')) {

return [cat.replace('[[Category:The ', '[[Category:'), -1];

}

return [cat, 0];

};

const [normA, prioA] = normalizeCategory(a);

const [normB, prioB] = normalizeCategory(b);

if (prioA !== prioB) return prioA - prioB;

return normA.localeCompare(normB);

}).join('\n');

}

function sortCats() {

if (mw.config.get('wgNamespaceNumber') !== 0 || mw.config.get('wgAction') !== 'edit') {

debug("Not the correct namespace or action, script terminated");

return;

}

debug("Sorting categories...");

const content = document.querySelector('#wpTextbox1')?.value;

if (!content) {

debug("Textbox not found or empty");

return;

}

const { before, categories } = extractCategories(content);

if (!categories) {

debug("No categories found");

return;

}

const sortedCategories = reorderCategories(categories);

const textboxElement = document.querySelector('#wpTextbox1');

if (textboxElement) textboxElement.value = `${before}\n${sortedCategories}\n`;

const summaryElement = document.querySelector('#wpSummary');

if (summaryElement) {

summaryElement.value += (summaryElement.value ? ' ' : '') + "Sorted categories alphabetically.";

}

const minorEditElement = document.querySelector('#wpMinoredit');

if (minorEditElement) {

minorEditElement.checked = true;

}

debug("Categories sorted successfully");

}

$.when(

$.ajax("//tools-static.wmflabs.org/meta/scripts/pathoschild.templatescript.js", { dataType: "script", cache: true })

).then(function() {

pathoschild.TemplateScript.add(

[{

name: "sortCats",

tooltip: "Sort all categories alphabetically",

script: sortCats

}],

{ forActions: "edit", category: "CatSort" }

);

debug("Category sorting script loaded and ready.");

});

})();

//