User:RossPatterson/Reorganize References.js

/* */

/* Add an editting tab called "ReorgRef" to convert reorganize references */

/* Simply add importScript("User:RossPatterson/Reorganize References.js"); to your own monobook.js and clear the cache before it will work.

/* Version 1.0 */ var RossPatterson_Reorganize_References = function { var _private = { generatedNameIndex: 0 ,		debugLevel: 0 ,

debug: function(text) { if (_private.debugLevel > 0) { alert(text); }		}		,		reorgRefs: function (articleText, refs) { _private.debug("reorgRefs: start"); // Match " ", " ", etc., but not " " var refPat = new RegExp("(]*>[^<]*)", "gi"); var refElements = (articleText.match(refPat)); _private.debug("reorgRefs: Found " + refElements.length + " references"); for (var i=0; i < refElements.length; i++) { _private.debug("reorgRefs: i=" + i); _private.debug("reorgRefs: refElements[" + i + "]=" + refElements[i]); var name = ''; var originalRef=refElements[i]; var refParms=refElements[i].substr(4, refElements[i].indexOf('>') - 4);	// " yyy" -> " xxxx" if (refParms != "" && refParms.search(new RegExp("\\s+name\\s*=", "i")) != -1) { // Extract the existing "name=x" name = refParms.replace(new RegExp("\\s+name\\s*=\\s*([^\\s]*)", "i"), '$1'); _private.debug("reorgRefs: found name=" + name); } else { _private.debug("reorgRefs: no name="); // No "name=x", add one name = _private.chooseUniqueName(refElements[i], articleText); refElements[i] = " " yyy" _private.debug("reorgRefs: modified refElements[" + i + "]=" + refElements[i]); }				refs.push(refElements[i]); articleText = articleText.replace(originalRef, " "); }			_private.debug("reorgRefs: end"); return articleText; }		,

chooseUniqueName: function (refText, articleText) { _private.debug("chooseUniqueName: start"); var name=''; // Try to use the parameters of to set the reference name if (refText.search(new RegExp("\\{\\{[Cc]ite")) != -1) { _private.debug("chooseUniqueName: found eee"				temp = temp.substr(0, temp.indexOf("}}"));		// "|aa=bb |cc=dd}}eee" -> "|aa=bb |cc=dd"				var temp2 = temp.split("|");				// "|aa=bb |cc=dd" -> ["aa=bb", "cc=dd"]				var citeParms = new Array;				for (var i=0; i < temp2.length; i++) {					var temp3 = temp2[i].split("=");		// "aa=bb" -> ["aa",bb"]					if ((temp2[i] == "") || (temp3[0] == "")) {						continue;					}					citeParms[_private.trim(temp3[0])] = _private.trim(temp3[1]);	// citeParams["aa"] = "bb"				}				// Build the reference name from some of the parameters				if ((citeParms["last1"] != null) && (citeParms["last1"] != "")) {					name = citeParms["last1"];	// Add the last1= value				} else if ((citeParms["last"] != null) && (citeParms["last"] !=  "")) {					name = citeParms["last"];	// Add the last= value				} else if ((citeParms["author1"] != null) && (citeParms["author1"] !=  "")) { name = citeParms["author1"];	// Add the author1= value } else if ((citeParms["author"] != null) && (citeParms["author"] != "")) { name = citeParms["author"];	// Add the author= value } else if ((citeParms["editor1"] != null) && (citeParms["editor1"] != "")) { name = citeParms["editor1"];	// Add the editor1= value } else if ((citeParms["editor"] != null) && (citeParms["editor"] != "")) { name = citeParms["editor"];	// Add the editor= value } else if ((citeParms["publisher"] != null) && (citeParms["publisher"] != "")) { name = citeParms["publisher"];	// Add the publisher= value } else if ((citeParms["title"] != null) && (citeParms["title"] != "")) { name = citeParms["title"];	// Add the title= value }				name = name + " "; if ((citeParms["date"] != null) && (citeParms["date"] != "")) { name = name + citeParms["date"];	// Add the date= value } else if ((citeParms["year"] != null) && (citeParms["year"] != "")) { name = name + citeParms["year"];	// Add the year= value }				name = name.replace(new RegExp("[\\W]+", "g"), " ");	// Replace whitespace, specials, ... name = (_private.trim(name)).replace(new RegExp("[\\s]+", "g"), "_");	// ... with "_" _private.debug("chooseUniqueName: name=" + name); if (articleText.indexOf(name) == -1) { return '"' + name + '"'; }				_private.debug("chooseUniqueName: name already in use"); }			// Try to use the URL components to set the reference name if (refText.search(new RegExp("^]*>\\s*\\[\\s*https?:")) != -1) { _private.debug("chooseUniqueName: found http:"); var URL = (refText.match(new RegExp("https?:[^\\s]*[^?;<\\]]*")))[0];	// " " -> "http://aaa/bbb ccc" _private.debug("chooseUniqueName: URL=" + URL); var host = URL.replace(new RegExp("^https?:\\/\\/([^\\/]*)\\/.*$"), '$1');	// Isolate the hostname/IP addr _private.debug("chooseUniqueName: host=" + host); var path = URL.replace(new RegExp("^https?:\\/\\/[^\\/]*\\/([^\\s]*).*$"), '$1');	// Isolate the pathname _private.debug("chooseUniqueName: path=" + path); var title = URL.replace(new RegExp("^https?:\\/\\/[^\\/]*\\/[^\\s]*\\s+(.*)$"), '$1');	// Isolate the title _private.debug("chooseUniqueName: title=" + title); var file= path.replace(new RegExp("^.*([^\\/]*)$"), '$1');		// Isolate the file name from the pathname _private.debug("chooseUniqueName: file=" + file); if (host != "") { name = host; }				name = name + " "; if (title != "") { name = name + title; } else if (file != "") { name = name + file; } else if (path != "") { name = name + path; }				name = name.replace(new RegExp("[\\W]+", "g"), " ");	// Replace whitespace, specials, ... name = (_private.trim(name)).replace(new RegExp("[\\s]+", "g"), "_");	// ... with "_" _private.debug("chooseUniqueName: name=" + name); if (articleText.indexOf(name) == -1) { return '"' + name + '"'; }				_private.debug("chooseUniqueName: name already in use"); }			// Make up a name of our own when all else fails for (var i=0; i < 20; i++) { name = '"RRGEN_' + _private.generatedNameIndex++ + '_"'; _private.debug("chooseUniqueName: name=" + name); if (articleText.indexOf(name) == -1) { return name; }				_private.debug("chooseUniqueName: name already in use"); }			alert("chooseUniqueName: Unable to generate a unique name for reference: " + refText); exit(1); }		,

addRefs: function (articleText, refs) { _private.debug("addRefs: start"); var referencesEndTag = new RegExp("(]*>)", "i"); var referencesMinTag = new RegExp("<(references)([^\\/>]*)\\/>", "i"); var reflistWithRefs = new RegExp("(\\{\\{[Rr]eflist[^\\}]*\\s*\\|\\s*refs=)"); var reflistNoRefs   = new RegExp("(\\{\\{[Rr]eflist[^}]*)\\}\\}"); if (articleText.search(referencesEndTag) != -1) { // Add our collected refs to the existing articleText = articleText.replace(referencesEndTag, refs.join("\n") + "\n$1"); } else if (articleText.search(reflistWithRefs) != -1) { // Add our collected refs to the existing articleText = articleText.replace(reflistWithRefs, "$1\n" + refs.join("\n") + "\n"); } else 	if (articleText.search(referencesMinTag) != -1) { // Expand the references tag and insert our collected refs articleText = articleText.replace(referencesMinTag, "<$1$2>\n" + refs.join("\n") + "\n"); } else if (articleText.search(reflistNoRefs) != -1) { // Expand the and include our collected refs articleText = articleText.replace(reflistNoRefs, "$1 |refs=\n" + refs.join("\n") + "\n}}"); } else { alert("addRefs: Can't find reference list, adding my own!!!!"); articleText += " "; }			_private.debug("addRefs: end"); return articleText; }		,		trim: function (input) { if (input == null) { return ""; }			var start; var end; for (start = 0; start < input.length; start++) { if (input[start] != " ") { break; }			}			for (end = input.length; end >= 0; end--) { if (input[end] != " ") { break; }			}			return input.substr(start, end); }	}

var _public = { run: function { _private.debug("run: start"); var articleTextField = document.editform.wpTextbox1; var articleText = articleTextField.value; var refs = new Array; articleText = _private.reorgRefs(articleText, refs); articleTextField.value = _private.addRefs(articleText, refs); // Add a tag to the summary box var summaryField = document.editform.wpSummary; var summary = "Reorganize references"; if (summaryField.value.indexOf(summary) == -1) { // If the summary contains anything other than a section comment, add a separator if (summaryField.value.match(/[^\*\/\s][^\/\s]?\s*$/)) { summaryField.value += "; "; }				summaryField.value += summary; } 			// Press the "Show changes" button to let the user see the diffs. document.editform.wpDiff.click _private.debug("run: end"); }		,

initialize: function { if (document.forms.editform) { mw.util.addPortletLink('p-cactions', 'javascript:RossPatterson_Reorganize_References.run',						'RefReorg', 'ca-ref-reorg', 'Reorganize references', , ); }		}

}

return _public; }; addOnloadHook(RossPatterson_Reorganize_References.initialize);

/* */