Jump to content

User:ערן/WeaselWords.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by ערן (talk | contribs) at 14:47, 7 August 2014 (using regex). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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.
/*
Written by [[User:Ravid ziv]] and [[User:ערן]]
*/
mw.hook( 've.activationComplete' ).add(function(){
	importStylesheetURI('//tools.wmflabs.org/eranbot/clippy.css');
	$.getScript('//tools.wmflabs.org/eranbot/clippy.min.js', function(){
		var loadedAgent;
		var weasleWords = [];
		var warningsForWeasleWords = [];
		var WEASLE_WORD_PAGE = "Wikipedia:Manual of Style/Words to watch/Config";
 
		function loadAgent(callback){
			if(loadedAgent) {
				callback(loadedAgent);
			}
			else
			{ 
				clippy.load('Clippy', function(agent) {
					loadedAgent = agent; 
					agent._balloon.CLOSE_BALLOON_DELAY=8000;
					agent.show();
					agent.moveTo(50,50)
					window.agent=agent;
					callback(loadedAgent);
				});
			}
		}
 
		function showWarning(warn, x, y){
			loadAgent(function(agent) { 
				agent.speak(warn);
				if (x && y) {
					agent.moveTo(x,y);
				}
			});
		}	
 
		function loadWeaselWords()
		{
			var api = new mw.Api();
			api.get({
				action:'parse',
				page: WEASLE_WORD_PAGE,
				prop: 'wikitext'
				}).done(function (data) {
					var text = data.parse.wikitext['*'].split('-----')[1]
					var genrealWeasleWords = text.split('\n*');
 
					for (var i=0;i<genrealWeasleWords.length;i++)
					{
						var splitedweasleWords = genrealWeasleWords[i].split("//");
						if ( splitedweasleWords.length !== 2 ) continue;
						weasleWords.push( new RegExp( splitedweasleWords[0], 'i' ) );
						warningsForWeasleWords.push(splitedweasleWords[1]);
					}
					searchWeasleWarnings( getText().join('') );
				});	
		}
 
		function searchWeasleWarnings( text, ignoreWarning ){
			var warnings = [];
			for (var i=0; i<weasleWords.length;i++)
			{
				if ( weasleWords[i].test(text) )
				{
					warnings.push(weasleWords[i].exec(text) + ": " +warningsForWeasleWords[i]);
				}
			}
 
			console.log(warnings);
			if ( warnings.length>0 && !ignoreWarning ) {
				showWarning( warnings.join('\n') );
			}
			return warnings.length>0;
		}
		function extractText(){
			var nodes = [];
			var model = ve.instances[0].model;
			function getTextNodes( obj ) {
				var i;
 
				for ( i = 0; i < obj.children.length; i++ ) {
					if ( obj.children[i].type == 'text'){
						nodes.push(obj.children[i]);
					}
 
					if ( obj.children[i].children ) {
						getTextNodes( obj.children[i] );
					}
				}
			}
			getTextNodes(ve.instances[0].model.documentModel.getDocumentNode());
			return nodes;
		}
 
 
		 function getText  (){
			var textNodes = extractText();
			var model = ve.instances[0].model;
			var firstIndex = 0;
			var numReplacements = 0;
			var text = [];
 
			for (var nodeI = 0; nodeI < textNodes.length; nodeI++) {
				var node = textNodes[nodeI];
				var nodeRange = node.getRange();
				var nodeData = model.getFragment( nodeRange ).getData();
				var nodeText = $.map(nodeData, function( e ){ 
						if ( e instanceof Array){ return e[0]; } else { return e; } 
					}).join(''); 
				;
 
				text.push(nodeText);
 
			}
 
			return text;
		};

		var view = ve.instances[0].getView();
		var doc = view.getDocument();
		var model = ve.instances[0].getModel();
		var cachedNode = null;
		//while editing - only on current node
		model.on( 'documentUpdate', function () {
			var text,
			    selection = model.getSelection(),
			    node = doc.getNodeFromOffset( selection.start ),
			    textMatches;
			if ( !( node instanceof ve.ce.ContentBranchNode ) ) {
			    return;
			}
			var hasWarnings = searchWeasleWarnings( $( node.$element[0] ).text(), $( node.$element[0] ).data( 'weaselWords' ) );
			if (hasWarnings){
				$( node.$element[0] ).data( 'weaselWords', true);
			} else {
				$( node.$element[0] ).data( 'weaselWords', null);
			}
		}
		);


		loadAgent(function(){})
		loadWeaselWords();
	});
});