User:Epicgenius/sortcategories.js

/* See [[User:Alex 21/script-categoriessort.js]], original script by [[User:Alex 21]]The main script page is [[User:Epicgenius/sortcategories.js]].*/mw.loader.using("mediawiki.util", function () {// Only run script if user is editing an articleif (!document.forms.editform || (mw.config.get("wgAction") !== "edit" && mw.config.get("wgAction") !== "submit")) {return;}$(function($) {/*if (config.mw.wgNamespaceNumber == 1 || //talk pageconfig.mw.wgArticleId === 0 || // Page doesn't exist) {return;} else ()*/mw.loader.using( ['mediawiki.util'] ).then( function () {var portletlink = mw.util.addPortletLink('p-tb', '#', 'Sort categories');$(portletlink).click( function(e) {e.preventDefault();// Get textbox valuevar wpTextbox1 = document.getElementById('wpTextbox1');var wpTextbox1_V = wpTextbox1.value;// Categories to checkvar category = "[[Category:";var categoryA = category+"A ";var categoryAn = category+"An ";var categoryThe = category+"The ";var categoryEnd = "]]"; // This might match to both categories and linksvar categoryEponymous = category+mw.config.get("wgTitle");var defaultSort = "{{DEFAULTSORT:";var stubTag = "-stub}}";var someTemplateEnd = "}}";// Get the text up to the start of the categories, and then all of the text with the categories.var categoriesStart = wpTextbox1_V.indexOf(category);var categoriesEnd = wpTextbox1_V.lastIndexOf(categoryEnd);var textBeforeCategories = wpTextbox1_V.substr(0, categoriesStart).trim();var textWithCategories = wpTextbox1_V.substr(categoriesStart,categoriesEnd-categoriesStart+2).trim();var textAfterCategories = wpTextbox1_V.substr(categoriesEnd+2).trim();// Categories should be on new lines, so split by new line, sort alphabetically with a few checks, then join again with new lines.// Checks: eponymous categories are listed first; categories are sorted without preceding "The"var splitCategories = textWithCategories.split("\n");splitCategories.sort(function(a, b) {if (a.substr(0, categoryEponymous.length) == categoryEponymous) return -1e8;if (b.substr(0, categoryEponymous.length) == categoryEponymous) return 1e8;if (a.substr(0, categoryThe.length) == categoryThe) a = a.replace(categoryThe, category);if (b.substr(0, categoryThe.length) == categoryThe) b = b.replace(categoryThe, category);if (a.substr(0, categoryA.length) == categoryA) a = a.replace(categoryA, category);if (b.substr(0, categoryA.length) == categoryA) b = b.replace(categoryA, category);if (a.substr(0, categoryAn.length) == categoryAn) a = a.replace(categoryAn, category);if (b.substr(0, categoryAn.length) == categoryAn) b = b.replace(categoryAn, category);return a.localeCompare(b);});textWithCategories = splitCategories.join("\n");if (wpTextbox1_V.indexOf(defaultSort) < 0) {textWithCategories = "\n"+textWithCategories;} else {textWithCategories = textWithCategories;}if (wpTextbox1_V.indexOf(stubTag) < 0) {textWithCategories = textWithCategories;} else {textWithCategories = textWithCategories+"\n\n\n";}// Merge pre-category text back with the sorted and joined category text, place back in textbok and add summary.wpTextbox1.value = textBeforeCategories+"\n"+textWithCategories+textAfterCategories;setoptions(minor = 'true');setreason('sorted categories alphabetically via [[User:Epicgenius/sortcategories|script]]', 'append');doaction('diff');});});});});