User:Mikevoir/global.js

importArticles({   type: 'script',    articles: [        'u:dev:MediaWiki:AjaxBatchDelete.js',        'u:dev:MediaWiki:Bang.js',        'u:dev:MediaWiki:FileUsageAuto-update/code.js',        'u:dev:MediaWiki:LastEdited/code.js',        'u:dev:MediaWiki:MassRename/code.js',        'u:dev:MediaWiki:MassNullEdit/code.js',        'u:dev:MediaWiki:PurgeButton.js',        'u:dev:MediaWiki:Wikimarks/code.js',    ] });

// Initialize library object window._LIB = window._LIB || {}; window._LIB = { // Delay until element exists to run function waitFor: function(query, callback, extraDelay) { if ('function' == typeof callback && 'string' == typeof query) { // set up the mutation observer var observer = new MutationObserver(function (mutations, me) {				// mutations is an array of mutations that occurred				// me is the MutationObserver instance				var targetNode = document.querySelector(query);				if (targetNode) {					if (extraDelay && 'number' == typeof extraDelay) {setTimeout(callback, extraDelay);}					else {callback;}					me.disconnect; // stop observing					return;				}			}); // start observing observer.observe(document, {			 childList: true,			  subtree: true			}); }	} }; console.log('lib loaded: ', window._LIB); // Load all custom scripts importScriptPage('User:Mikevoir/betterLinkSuggest.js', 'community'); var config = mw.config.get(['wgDiffNewId', 'wgAction', 'wgCanonicalSpecialPageName', 'wgNamespaceNumber']);

// Load functions upon page load $(function{	// Check we're in the editor screen	if (['edit', 'submit'].includes(config.wgAction)) {		// waitFor('.wikiEditor-ui-linkSuggest', noBlankLinkSuggest);		waitFor('.group-insert', quickOL);	}	// Check we're in RC	if (config.wgCanonicalSpecialPageName == 'Recentchanges') {		waitFor('.mw-thanks-thank-link', noThank);		waitFor('.mw-changeslist-links > span:first-child', properLink);		document.addEventListener('mouseup', function(event){ // console.log(event); if (				event.target &&				event.target.classList.contains('oo-ui-labelElement-label') &&				event.target.innerHTML.match(/^View new changes since/g)			) { setTimeout(noThank, 7000); setTimeout(properLink, 7000); }		});	}	// Check we're in a diff or history page	if (config.wgDiffNewId || config.wgAction == 'history') {		waitFor('.mw-thanks-thank-link', noThank);		properDiff;	}	// Check we're in MessageWall or Main namespace	if (config.wgNamespaceNumber == 1200 || config.wgNamespaceNumber == 0) {		//waitFor('body', messageLinkSuggest);	} });

// No thanks function noThank { document.querySelectorAll('.mw-thanks-thank-link').forEach(function(el) {		if (el.parentNode.nodeName === 'SPAN'){			el.parentNode.remove;		}else{			if ( el.previousSibling.data === '( ' && el.nextSibling.data === ' )' ) {				el.nextSibling.remove;				el.previousSibling.remove;			}			el.remove;		}	}); }

// Make RC properly give links on diffs that include page creations function properLink { document.querySelectorAll('.mw-changeslist-links > span:first-child').forEach(		function(el) {			if (el.childNodes.length === 1 && el.childElementCount === 0){				var row = el.parentNode.parentNode.parentNode.parentNode.parentNode;				if (row.nodeName == 'TBODY') { row = row.parentNode; }				var pageName = row.querySelectorAll('.mw-changeslist-title')[0].attributes.title.nodeValue;				el.removeChild(el.firstChild); // delete plain text				var row_revid = row.getAttributeNode('data-mw-revid');				if (row_revid && row_revid.value) {					// single edit diff					el.appendChild(buildLink([row_revid.value, 0], pageName));				}else{					// multiple edit diff					var revisions = [];					row.querySelectorAll('tr.mw-rcfilters-ui-highlights-enhanced-nested.mw-changeslist-edit').forEach(function(edit) { // console.log(edit); //debug var edit_revid = edit.getAttributeNode('data-mw-revid'); if (edit_revid && edit_revid.value) { revisions[revisions.length] = edit_revid.value; }					});					// console.log(revisions); //debug					el.appendChild(buildLink(revisions, pageName));				}			}		}	); document.querySelectorAll('tr.mw-changeslist-src-mw-new.mw-rcfilters-ui-highlights-enhanced-nested').forEach(		function(row) {			if (!row.querySelector('.mw-changeslist-diff')){				var el = row.querySelector('td.mw-enhanced-rc-nested');				var pageName = row.querySelector('.mw-enhanced-rc-time a').title;				var targetNode = el.childNodes[3];				// console.log(targetNode);				var row_revid = row.getAttributeNode('data-mw-revid').value;				targetNode.parentNode.insertBefore(document.createTextNode(' | '), targetNode);				targetNode.parentNode.insertBefore(buildLink([row_revid.value, 0], pageName, 'prev'), targetNode);				targetNode.parentNode.insertBefore(document.createTextNode(')'), targetNode); targetNode.remove; }		}	);	function buildLink(revisions, page, label) {		// console.log(revisions); //debug		var link = document.createElement('a');		var from = revisions[revisions.length-1];		var to = revisions[0];

if (from == 0) { if (!label){label = 'diff';} link.classList.add('mw-changeslist-diff'); } else { if (!label){label = revisions.length + ' changes';} link.classList.add('mw-changeslist-groupdiff'); }

link.href = '/wiki/' + page + '?diff=' + to + '&oldid=' + from; link.title = page; link.innerHTML = label; return link; } }

// Properly display diff for page creation edits function properDiff { if (document.querySelectorAll('#mw-diff-ntitle1 > strong > a').item(0)) { var table = document.getElementsByClassName('diff')[0]; var api = new mw.Api; var revid = document.querySelectorAll('#mw-diff-ntitle1 > strong > a').item(0).href.replace(/^.+\?oldid=/g, ''); var api_opt = { action: 'compare', torev: revid, fromslots: 'main', 'fromtext-main': '', prop: 'diff|ids', formatversion: 2 };		if ( revid && document.querySelectorAll('#mw-diff-otitle1 > strong > a').item(0) && !document.querySelectorAll('#differences-prevlink').item(0) ) { //Add edit link to page creation diff table.querySelectorAll('#mw-diff-otitle4')[0].innerHTML = ' strong > a')[0].title +			'?diff=' +			document.querySelectorAll('#mw-diff-otitle1 > strong > a')[0].href.replace(/^.+\?oldid=/g, '') +			'&oldid=0" title="' +			document.querySelectorAll('#mw-diff-otitle1 > strong > a')[0].title +			'" id="differences-prevlink">← Older edit';

}else if (revid && !document.querySelectorAll('#differences-prevlink').item(0)) { //Render proper diff table.getElementsByClassName('diff-ntitle')[0].colSpan = 4; table.getElementsByClassName('diff-notice')[0].parentNode.remove; api.get(api_opt).then(function(data) {				table.innerHTML = '  ' + table.innerHTML;				table.querySelectorAll('tbody')[0].innerHTML = table.querySelectorAll('tbody')[0].innerHTML + data.compare.body;			}); }	} } // Add buttons to add empty OL call with or without _tl params function quickOL { // Where button gets added var row = document.querySelector('.group-insert');

// Call insertions var $textbox = $( '#wpTextbox' ); var handler = function(event) { if (event.target.innerHTML == 'OL'){ $textbox.textSelection('replaceSelection', ''); }else if (event.target.innerHTML == 'OL_tl'){ $textbox.textSelection('replaceSelection', ''); }	};

// OL call with translation params var OL_TL = document.createElement('span'); OL_TL.classList.add('tool', 'oo-ui-widget', 'oo-ui-widget-enabled', 'oo-ui-buttonElement', 'oo-ui-buttonElement-frameless', 'oo-ui-iconElement', 'oo-ui-buttonWidget'); var OL_TL_button = document.createElement('a'); OL_TL_button.classList.add('oo-ui-buttonElement-button'); OL_TL_button.innerHTML = 'OL_tl'; OL_TL_button.role = 'button'; OL_TL_button.addEventListener('mousedown', handler); OL_TL.appendChild(OL_TL_button); row.insertBefore(OL_TL, row.children[0]); // console.log(OL_TL);

// OL call without translation params var OL = document.createElement('span'); OL.classList.add('tool', 'oo-ui-widget', 'oo-ui-widget-enabled', 'oo-ui-buttonElement', 'oo-ui-buttonElement-frameless', 'oo-ui-iconElement', 'oo-ui-buttonWidget'); var OL_button = document.createElement('a'); OL_button.classList.add('oo-ui-buttonElement-button'); OL_button.innerHTML = 'OL'; OL_button.role = 'button'; OL_button.addEventListener('mousedown', handler); OL.appendChild(OL_button); row.insertBefore(OL, row.children[0]); // console.log(OL); }

// Helper function to delay function until anchor element exists function waitFor(query, THEN, extraDelay) { // set up the mutation observer var observer = new MutationObserver(function (mutations, me) {		// `mutations` is an array of mutations that occurred		// `me` is the MutationObserver instance		var targetNode = document.querySelector(query);		if (targetNode) {			if (extraDelay) {setTimeout(THEN, extraDelay);}			else {THEN;}			me.disconnect; // stop observing			return;		}	}); // start observing observer.observe(document, {	 childList: true,	  subtree: true	}); }