From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.

$(function($) {

	mw.loader.using( 'mediawiki.util' ).then( function () {

		var portletlink = mw.util.addPortletLink('p-tb', '#', 'Sort references');

		$(portletlink).click( function(e) {

			e.preventDefault();

			// Declare variables

			var loc = window.location.href; var wpTextbox1 = document.getElementById('wpTextbox1'); var i; var r; var x;

			if (loc.indexOf('action=edit') < 0 && loc.indexOf('action=submit') < 0) {

				// Check page is in editing move

				alert("Go to the edit page to use this script.");

			} else {

				// Declare variables

				var allRefs = [];

				var allRefNames = [];

				var addToReflist = "";

				var wpTextboxContents;

				var regexDateFormats = 

					/\|\s*?date\s*=\s*(([A-Za-z]+) \d{1,2}, (\d{4}))/,

					/\|\s*?date\s*=\s*(\d{1,2} ([A-Za-z]+) (\d{4}))/,

					/\|\s*?date\s*=\s*((\d{4})-(\d{1,2})-(\d{1,2}))/,

					/\|\s*?archive-?date\s*=\s*(([A-Za-z]+) \d{1,2}, (\d{4}))/,

					/\|\s*?archive-?date\s*=\s*(\d{1,2} ([A-Za-z]+) (\d{4}))/,

					/\|\s*?archive-?date\s*=\s*((\d{4})-(\d{1,2})-(\d{1,2}))/,

					/\|\s*?access-?date\s*=\s*(([A-Za-z]+) \d{1,2}, (\d{4}))/,

					/\|\s*?access-?date\s*=\s*(\d{1,2} ([A-Za-z]+) (\d{4}))/,

					/\|\s*?access-?date\s*=\s*((\d{4})-(\d{1,2})-(\d{1,2}))/,

				];

				

				// Fix all references as they exist, use double quotes instead of single/none

				while (x = /(<ref[^>]*name=)'?([^'">]+)'?([^>]*>([^>]+<\/ref>)?)/.exec(wpTextbox1.value)) {

					wpTextbox1.value = wpTextbox1.value.replaceAll(x0], x1+"\""+x2+"\""+x3]);

				}

				

				// Gather all references

				wpTextboxContents = wpTextbox1.value.split("\n");

				for (i = 0; i < wpTextboxContents.length; i++) {

					if (wpTextboxContentsi].indexOf('ref') > 0) {

						var reg = /<ref[^>]*>([^>]+<\/ref>)?/g;

						while (x = reg.exec(wpTextboxContentsi])) {

							if (x0].indexOf("/>") < 0) allRefsallRefs.length = x0];

						}

					}

				}

				

				// Sort all references by date

				var allRefsDated = [];

				var dateRegex;

				for (i = 0; i < allRefs.length; i++) {

					dateRegex = null;

					for (r = 0; r < regexDateFormats.length; r++) {

						if (!dateRegex) dateRegex = regexDateFormatsr].exec(allRefsi]);

					}

					allRefsDatedallRefsDated.length = parseInt((new Date(dateRegex1]).getTime() / 1000).toFixed(0)), allRefsi]];

				}

				allRefsDated.sort(function(a, b) {

					if (a0 < b0]) return -1;

					else if (a0 > b0]) return 1;

					else return 0;

				});

				for (i = 0; i < allRefs.length; i++) {

					allRefsi = allRefsDatedi][1];

				}

				

				// Loop through all references

				for (i = 0; i < allRefs.length; i++) {

					// Reference does not have a name - provide one

					if (allRefsi].indexOf('<ref name=') < 0) {

						// Gather website name, date month and year

						var urlRegex = /https?:\/\/(www\.)?([-a-zA-Z0-9@:%._\+~#=]{1,256})\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/.exec(allRefsi]);

						dateRegex = null;

						for (r = 0; r < regexDateFormats.length; r++) {

							if (!dateRegex) dateRegex = regexDateFormatsr].exec(allRefsi]);

						}

						// Reference name = website name + date month + date year

						var citeName = ( urlRegex ? citeName = urlRegex2 : citeName = /\{\{[Cc]ite\s*([^\|]+)\s*\|/.exec(allRefsi])[1 );

						var newName = citeName.charAt(0).toUpperCase() + citeName.slice(1) + dateRegex2 + dateRegex3];

						// Duplicate reference names, update to name, name-2, name-3, etc.

						if (typeof allRefNamesnewName != "undefined") {

							var newNameTmp = newName;

							var repeatNameCount = 2;

							while (typeof allRefNamesnewNameTmp != "undefined") {

								newNameTmp = newName+"-"+repeatNameCount;

								repeatNameCount++;

							}

							newName = newNameTmp;

						}

						

						// Update this unnamed reference

						var oldRefName = allRefsi];

						var newRefName = allRefsi].replace("<ref", "<ref name=\""+newName+"\"");

						wpTextbox1.value = wpTextbox1.value.replaceAll(oldRefName, newRefName);

						

						// Update all references list with named reference

						allRefsi = newRefName;

					}

					// Add reference to list that will end in {{Reflist}}

					addToReflist += "\n\n" + allRefsi];

					

					// Gather name of reference, and update all <ref name="*">...</ref> to <ref name="*" />

					var regNamed = /(<ref[^>]*name=['"]?([^'">]+)['"]?[^>]*)>([^>]+<\/ref>)?/g;

					x = regNamed.exec(allRefsi]);

					if (x) {

						var name = x2];

						allRefNamesname = true;

						var reg2 = new RegExp("(<ref[^>]*name=['\"]?"+name+"['\"]?[^>]*)>([^>]+<\/ref>)?","g");

						wpTextbox1.value = wpTextbox1.value.replace(reg2, x1+" />");

					}

				}

				

				// Update {{reflist}} to {{Reflist}}, then add all reference within template

				wpTextbox1.value = wpTextbox1.value.replace("{{reflist", "{{Reflist");

				wpTextbox1.value = wpTextbox1.value.replace("{{Reflist", "{{Reflist |refs="+addToReflist+"\n\n");

				

				// Done

				document.getElementById('wpSummary').value += "Adjusted references via [[User:Alex 21/script-references|script]].";

			}

		});

	});

});