$(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]].";
}
});
});
});