User:Danski454/w2wFinder.js

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: No issues found '); 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 );