User:M~enwiki/dereference.js

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.
/*
 
importScript('User:M/jquery.js');
importScript('User:M/dereference.js');

*/ 
/*! selectText jQuery plugin by Steve Clay http://code.google.com/p/mrclay/source/browse/trunk */
/* 
 * Simple plugin to select a range of text within a text box/textarea
 */
(function(){function selectText(el,begin,end){var len=el.value.length;end=end||len;if(begin==null) el.select();else if(el.setSelectionRange) el.setSelectionRange(begin,end);else if(el.createTextRange){var tr=el.createTextRange(),c="character";tr.moveStart(c,begin);tr.moveEnd(c,end-len);tr.select();} else el.select();el.focus();} jQuery.fn.selectText=function(begin,end){this.length&&selectText(this.get(0),begin,end);return this;};})();


// Adds a link below the page heading which replaces references of the following form:
//  <ref name=aa/><ref>678</ref>
//  <ref name="bb">
//  </ref>
// with this form:
//  [1][2]
//  [3]
// The refs are re-inserted upon submit (unless these numbers are deleted).
// 
// TODO: 
// * Dump the refs into a list, where clicking each opens a textarea with its removed ref data.
// * Timer to check for new number-refs, add them to list, allow creation. Check duplicates [12][12], highlight removed for re-insertion.
// * Handle slashes in: ref name="aa/bb".
// * Entry form for template refs instead of textarea, make ref list look nicer.
// * More efficient, if problems arise.
//
// "...that removes all refs into an a div below the edit textarea, replacing them with numbers[439]. 
// If you mess with the number, the ref-down-there turns red. Click the button to inject another ref 
// below using reftools, and a number inline. Parsing/replacing the refs wouldn't be very difficult, 
// and then add a timer that makes sure the numbers are all still there in the text. Offer little 'add 
// this ref' for any new numbers (so right now I'd see '439: [click to add ref]' somewhere below)."
//
$(window).load( addRefTab );
function addRefTab() {
	if (window.location.href.indexOf("action=") == -1) return;
	$("<div id='refbox'    style='display:none;margin-bottom:.4em;    border:1px solid #bbb;background:#fafafa;border-top:none;padding:1px;margin-bottom:.3em;'></div></div>").insertAfter($("#wpTextbox1"));
	$("<div id='refbutton' style='padding-top:.3em;text-align:center;cursor:pointer;    border:1px solid #bbb;background:#fafafa;border-top:none;padding:1px;margin-bottom:.3em;'>References</div>").insertAfter($("#wpTextbox1"));
	$("#refbutton").click(function () {
		$("#refbox").slideDown( 500 );
		$(this).fadeTo(100,.01).slideUp(100);
		hideRefs();
 	}).mouseenter(function(){$(this).css("color","#900").css("background","#fafafa");
	}).mouseleave(function(){$(this).css("color","black").css("background","#fafafa");
	});
	$("#wpTextbox1").width($("#refbutton").width());	
}
var refMap = new Array();
function hideRefs (){

	var t1 = new Date().getTime()
	
	if (window.location.href.indexOf("action=") == -1) return;
	var text = $("#wpTextbox1").val();
	//var regex = /<ref\b[^(/>)>]*(\/>|>(?:(?! y4bo4gche5h)[\s\S])*?<\/ref>)/;
	// also absorbs comments to the sides of the ref
	var regex = /(<!--(?:(?!-->)[\s\S])*?-->[ ]*)*<ref\b[^(/>)>]*(\/>|>(?:(?! y4bo4gche5h)[\s\S])*?<\/ref>)([ ]*<!--(?:(?!-->)[\s\S])*?-->)*/
	var curRefNum = 0;
	var num=0;

	$("#refbox").append("<div id='reflist' style='font-size:90%'><b>References:</b> </div>");
	$("#refbox").append($("<div style='border:0px solid red;'><textarea style='margin-top:.5em;width:98.5%;margin-left:.5em;height:7em;' id='refcontent'></textarea></div>"));

	var t2 = new Date().getTime()

	for (;;) {
		curRefNum++;
		var match = text.match(regex);
		if (match==null) break;
		var startR = match.index;
		var endR = match[0].length + startR;
		
		var rText = text.substring(startR,endR);
	
		while(text.indexOf("["+curRefNum+"]")>=0) {
			curRefNum++;
		}
		text = text.substring(0,startR) + "["+curRefNum+"]" + text.substring(endR,text.length);
		refMap[""+curRefNum] = rText;

		$("#reflist").append(
		$("<span style='cursor:pointer;' id='ref-"+curRefNum+"'/>")
			.text(curRefNum+", ")
			.mouseenter(function(){
				$(this).css("background","red");
				var refnum = $(this).attr("id").substr(4);
				$("#refcontent").val(refMap[refnum]);
				var loc = $("#wpTextbox1").val().indexOf("["+refnum+"]");
				$("#wpTextbox1").selectText(loc,loc+2+refnum.length);
			}).mouseleave(function(){
				$(this).css("background","none");
				$("#refcontent").val("");
			})
		);

		num++;
	}
	var t3 = new Date().getTime()
alert(t3-t2);
	$("#wpTextbox1").text(text);

	$("#refclean").text("DeReferenced "+num+" references. They will be added back upon save/preview/changes, unless [2][56] etc. are removed.");
	$("#editform").submit(function() {
		$("#refclean").text("Rereferencing...");
		var text2 = $("#wpTextbox1").val();
		for (var key in refMap) {
			//TODO: notify missing refs.
			text2 = text2.split("["+key+"]").join(refMap[key]);
		}
		$("#wpTextbox1").text(text2);
		$("#refclean").text("Rereferenced");
		return true;
	});
}



// Adds a link below the page heading which replaces references of the following form:
//  <ref name=aa/><ref>678</ref>
//  <ref name="bb">
//  </ref>
// with this form:
//  [1][2]
//  [3]
// The refs are re-inserted upon submit (unless these numbers are deleted).
// 
//<ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref>
//<ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref>
//<ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref><ref>678</ref>