Jump to content

User:FlightTime/SortCats.js

From Simple English Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5.
/*
This is a custom fork of  [[:en:User:Epicgenius/sortcategories.js]]

See original script by [[:en: 21]], [[:en: 21/script-categoriessort.js]]

********************************************************************************************
To install this version copy below and add it to your favorite .js page

  importScript('User:FlightTime/SortCats.js'); // Backlink: [[User:FlightTime/SortCats.js]]

*/

mw.loader.using("mediawiki.util", function () {
	// Only run script if user is editing an article
	if (!document.forms.editform || (mw.config.get("wgAction") !== "edit" && mw.config.get("wgAction") !== "submit")) {
		return;
	}
	$(function($) {
		/*
		if (
				config.mw.wgNamespaceNumber == 1 || //talk page
				config.mw.wgArticleId === 0 || // Page doesn't exist
		) {
			return;
		} else (
		)
		*/
		mw.loader.using( ['mediawiki.util'] ).then( function () {
			var portletlink = mw.util.addPortletLink('p-tb', '#', 'SORT-CATS');
			$(portletlink).click( function(e) {
				e.preventDefault();
	
					// Get textbox value
					var wpTextbox1 = document.getElementById('wpTextbox1');
					var wpTextbox1_V = wpTextbox1.value;
					
					// Categories to check
					var category = "[[Category:";
					var categoryA = category+"A ";
					var categoryAn = category+"An ";
					var categoryThe = category+"The ";
					var categoryEnd = "]]"; // This might match to both categories and links
					var 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('Categories sorted alphabetically by [[User:FlightTime/SortCats.js|script]]', 'append');
					doaction('diff');
				document.getElementById('wpMinoredit').checked = true;
			});
		});
	});
});