User:Danski454/w2wFinder.js

Source: 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.
var w2wNext;

( function( mw, $ ) {//isolate code

var LIST_LOCATION = "User:Danski454/w2wFinder/list";
var insensitiveList = [];
var sensitiveList = [];
var regexList = [];
var index = -1;
var useDiv = false;

function createLists(location) {
	$.getJSON(
		mw.util.wikiScript('api'),
		{
			format: 'json',
			action: 'query',
			prop: 'revisions',
			rvprop: 'content',
			rvlimit: 1,
			titles: location
		}
	)
		.done(function ( data ) {
			var page, wikitext;
			//try {
				for ( page in data.query.pages ) {
					wikitext = data.query.pages[page].revisions[0]['*'];
					createListsWikitext( wikitext );
				}
			/*} catch ( e ) {
				alert("Unable to load words to watch list - processing crashed");
			}*/
		})
		.fail( function(){ alert("Unable to load words to watch list - ajax failed"); } );
}

function createListsWikitext(wikitext) {
	var regex_regex = /^\/.+\/[gmixXsuUAJD]*$/;
	var lines = wikitext.split("\n");
	for (var i = 0; i < lines.length; i++) {
		if (lines[i].charAt(0) === "*") {//if line is a bullet point
			var line = lines[i].slice(1).trim();
			if (regex_regex.test(line)) {
				var re, flags, end;
				end = line.lastIndexOf("/");
				flags = line.slice(end + 1);
				re = line.slice(1, end);
				if (flags.indexOf("g") === -1){
					flags = flags + "g";//force g flag
				}
				try {
					regexList.push(new RegExp(re, flags));
				}
				catch (e){
					console.error("Unable to create regex /" + re + "/" + flags);
				}
			} else if (line.toLowerCase() === line) {
				insensitiveList.push(line);
			} else {
				sensitiveList.push(line);
			}
		}
	}
	createUI();
}

function testWikitext(start) {
	var text, lcaseText, earliestIssue = Number.POSITIVE_INFINITY, loc, length;
	text = $("#wpTextbox1").val();
	if (!text) {
		console.warn("Words to watch finder could not find editing area, you must use the 2010 editor");
		return;
		/*text = $("div .mw-parser-output [contenteditable='true']").first().text();
		useDiv = true;*/
	}
	lcaseText = text.toLowerCase();
	for (var i = 0; i < insensitiveList.length; i++) {
		loc = lcaseText.indexOf(insensitiveList[i], start);
		if (loc !== -1 && loc < earliestIssue) {
			length = insensitiveList[i].length;
			earliestIssue = loc;
		}
	}
	for (var s = 0; s < sensitiveList.length; s++) {
		loc = text.indexOf(sensitiveList[s], start);
		if (loc !== -1 && loc < earliestIssue) {
			length = sensitiveList[s].length;
			earliestIssue = loc;
		}
	}
	for (var r = 0; r < regexList.length; r++) {
		while (true) {
			var result = regexList[r].exec(text);
			if (result === null || result.index >= earliestIssue) {
				break;
			}
			if (result.index >= start){
				length = result[0].length;
				earliestIssue = result.index;
				break;
			}
		}
		regexList[r].lastIndex = 0;
	}
	if (earliestIssue !== Number.POSITIVE_INFINITY){
		return {index:earliestIssue, length:length};
	} else if (start === 0) {
		return {index:-1, length:0};//there are no occurences
	} else {
		return testWikitext(0);//we have reached the end, but the could be previous occurences
	}
}

function createUI(){
	$("#editform").before('Words to watch finder: <span id="w2w-status">No issues found</span> <input id="w2w-next" type="button" value="Next issue" onclick="w2wNext();" />');
	if (testWikitext(0) === -1){
		$("#w2w-status").html("No issues found");
	} else {
		$("#w2w-status").html("Possible issues found");
	}
}

function gotoNextIssue() {
	var out = testWikitext(index + 1);
	index = out.index;
	if (index === -1){
		$("#w2w-status").html("No issues found");
	} else {
		$("#w2w-status").html("Possible issues found");
		var textarea = $("#wpTextbox1")[0];
		textarea.focus();
		textarea.setSelectionRange(index, index + out.length);//move cursor
	}
}

$(document).ready(function(){
	if (mw.config.get("wgAction") === "edit" && mw.config.get("wgIsProbablyEditable") && (mw.config.get("wgNamespaceNumber") === 0 || mw.config.get("wgTitle") === "Sandbox")){
		createLists(LIST_LOCATION);
	}
});

w2wNext = gotoNextIssue;//allow external calls

} )( mediaWiki, jQuery );