הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: ללחוץ על Ctrl-F5.
window.script64Watch = 'unwatch';
if (mw.config.get('wgTitle') == "Mod/אחר" && mw.config.get('wgAction') == 'purge') {
	$('form[action*="action=purge"]').submit();
}
//importScript('משתמש:1Or/patrol.js');

extraSpaces();
markCategories();
clickForUndo();
addFixButton();

// add info about extra spaces
function extraSpaces () {
	var x = document.getElementsByClassName('mw-parser-output')[0],
		newLine = 0,
		doubleSpace = 0,
		check1,
		check2;

	if (x && document.title.indexOf(':') == -1) {
		for (var i = 0; i < x.children.length; ++i) {
			var cur = x.children[i];
			if (cur.tagName == 'P') {
				check1 = cur.innerHTML.match(/ \n/g);
				check2 = cur.innerHTML.match(/  /g);

				if (check1 || check2) {
					newLine += check1 ? check1.length : 0;
					doubleSpace += check2 ? check2.length : 0;
				}
			}
		}

		var elem = document.createElement('p');
		elem.innerText='New line:' + newLine + '\nDouble space:' + doubleSpace;
		elem.style.cssText = 'position: absolute; left: 0px; text-align: left; font-size: 13px; direction: ltr;';
		document.body.insertBefore(elem, document.body.children[0]);
	}
}

// marks categories with sub-pages
function markCategories () {
	if (mw.config.get('wgCanonicalNamespace') == 'Category' || mw.config.get('wgTitle') == "Mod/אחר") {
		var cats = document.getElementsByClassName('CategoryTreeItem');
		for (var i = 0; i < cats.length; ++i) {
			if (cats[i].children[2]) {
				if (cats[i].children[2].innerText != "(ריקה)") {
					cats[i].children[2].style.backgroundColor = 'yellow';
				} else if (['קטגוריות ציטוט לריקון מיידי', 'שגיאות פרמטריות לפי תבנית'].includes(mw.config.get('wgTitle'))) {
					cats[i].parentElement.parentElement.parentElement.removeChild(cats[i].parentElement.parentElement);
					--i; // return i back as the child was removed
				}
			}
		}
	}
}

// gives the option to click a diff line to undo it, works only for small changes
function clickForUndo () {
	var table = document.querySelector('.diff > tbody');
	if (table && table.children && table.children.length > 1) {
		table.childNodes.forEach(function (row) {
			if (row.children && row.children.length == 4) {
				row.children[1].onclick = function() {
					var oldText = this.parentElement.children[1].innerText,
						newText = this.parentElement.children[3].innerText,
						textBox = document.getElementById('wpTextbox1'),
						text = textBox.textContent;

					text = text.replace(newText, oldText);
					textBox.textContent = text;
				};
			}
		});
	}
}

// add a 'fix spaces' button between 'show changes' and 'cancel'
function addFixButton () {
	var cancel = document.getElementById('mw-editform-cancel');

	if (cancel && (mw.config.get('wgAction') == 'edit' || mw.config.get('wgAction') == 'submit')) {
		var span = document.createElement('span'),
			input = document.createElement('input');

		span.id = 'wpFixSpaces';
		span.className = 'oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-buttonElement oo-ui-buttonElement-framed oo-ui-labelElement oo-ui-buttonInputWidget';
		span.title = 'תיקון כללי';
		
		input.className = 'oo-ui-inputWidget-input oo-ui-buttonElement-button';
		input.value = 'תיקון כללי';
		input.style.width = '96px';

		span.appendChild(input);
		cancel.parentElement.parentElement.insertBefore(span, cancel.parentElement);

		document.getElementById('wpFixSpaces').onclick = function () {
			var textBox = document.getElementById('wpTextbox1'),
				name = document.getElementById('firstHeadingTitle').innerText,
				clearName = name.replace(/ \(.*/, ''),
				strImg = document.querySelector("meta[property='og:image']") || { content: '/' },
				splitImg = strImg.content.split('/'),
				artImg = window.decodeURI(splitImg[splitImg.length-(strImg.content.indexOf('/thumb/') > 0 ? 2 : 1)]), // get image info
				text = textBox.textContent.replace(/\-\-\>/g, 'arrowleft'); // weird bugfix

			if ((text.indexOf('בעבודה}}') == -1 && text.indexOf('{{מקצרמר למובחר') == -1) ? true : confirm('הערך בעבודה. האם להמשיך?')) {
				text = text.replace(/[\u200B\u200E\u200F\u2028\u202A\u202B\u202C\u202D\u202E\uFEFF]/g, ''); // remove invisible Unicode control characters
				text = text.replace(/ /g, ' '); //special space to space
				text = text.replace(/\t/g, ' ').replace(/ {2,}/g, ' ').replace(/(?<!\=) \n/g, '\n'); // tabs and double spaces to space
				text = text.replace(/ ([\.\,])(?!\.)/g, '$1'); // double punctuation
				text = text.replace(/\s\-(?!\-)(\S)/g, ' - $1').replace(/(קטגוריה:) /g, '$1').replace(/ \-([A-z\d\u0590-\u05FF\[\]\(\)])/g, ' - $1').replace(/([A-z\d\u0590-\u05FF\[\]\(\)])- /g, '$1 - ').replace(/([\u0590-\u05FF]) \: /g, '$1: ').replace(/ (<ref|{{הערה)/g, '$1').replace(/\( ?(.*?) ?\)/g, '($1)'); // spaces
				text = text.replace(/([\n ])([בהוכלמ])\s?\-\s?('?'?'?\"?\"?\[?\[?[\dA-z])/g, '$1$2-$3').replace(/([\n ])([בהוכלמ])(\[?\[?\d)/g, '$1$2-$3').replace(/([\n ])([בהוכלמ]) ('?'?'?\"?\"?\[?\[?[\dA-z])/g, '$1$2-$3').replace(/(\d{4}\]\] )-( \[\[\d{1,2})/g, '$1–$2'); // dash
				text = text.replace(/&quot;/g, "\"").replace(/&nbsp;/g, ' ').replace(/&[mn]dash;/g, '-').replace(/&#x2013;/g, '-').replace(/&[rl]squo;/g, "\'"); // html codes to chars
				text = text.replace(/([א-ת])״([א-ת]+(?:[\|\]\)\} ]|$))/g, '$1"$2').replace(/([א-ת])׳([א-ת]+(?:[\|\]\)\} ]|$))/g, "$1'$2"); // fix quotation mark as part of acronyms
				text = text.replace(/\[\[(.+)\|('''?'?'?|")\1\2]]/g, '$2[[$1]]$2'); // bad bold\quotation full
				text = text.replace(/('''?'?'?|")\[\[(.+)\|\2\1]]/g, '$1[[$2]]$1'); // bad bold\quotation partly start
				text = text.replace(/\[\[(.+)\|('''?'?'?|")\1]]\2/g, '$2[[$1]]$2'); // bad bold\quotation partly end
				text = text.replace(/\[\[(.+)\|(ו?[בהכלמש])\1]]/g, '$2[[$1]]'); // THE inside
				text = text.replace(/\[\[(.+)\|(\(?)\1(\)?)]]/g, '$2[[$1]]$3'); // bad brackets
				text = text.replace(/\[\[(.+)\|\1([,\.:])]]/g, '[[$1]]$2'); // bad punctuation
				text = text.replace(/\[\[(.+)\|\1]]/g, '[[$1]]'); // identical text
				text = text.replace(/ ([-–]) ''' /g, '\'\'\' $1 '); // wrong - location
				text = text.replace(/<nowiki>''<\/nowiki>/g, '"').replace(/<\/?nowiki\/?>/g, ''); // remove nowiki
				text = text.replaceAll("[[" + name +"]]", name).replaceAll("[[" + name + "|" + clearName + "]]", clearName); // self-linked
				text = text.replace(/\n ?\*\s*\n/g, '\n'); // unneeded list child

				text = text.replace(/<cite.*?<\/cite>/ig, ''); // badly copied cite from automated translate
				text = text.replace(/(\|(author|editor)\d?-?link\d? ?= ?[A-z].*?)(?=[\||}])/g, ''); // author/editor links copied from automated translate
				text = text.replace(/({{Cite .*?\|.*?\|.*? ?= ?)(\[\[).*?\|?([A-Za-zæéá \-\(\)\'\.,&]+)(\]\])(.*?}})/ig, '$1$3$5');

				text = text.replace(/<small.*?\[\[:?en:(.*?)\|.*?>/g, '{{אנ|$1}}').replace(/\(\[\[:?en:(.*?)\|.*?\)/g, '{{אנ|$1}}').replace(/\[\[:?en:(.*?)\|(.*?)]]/g, '$2 {{אנ|$1}}'); // use template for redirecting to wikien
				text = text.replace(/<ref>{{צ-מאמר\|שם=(.*?)\|.*https:\/\/en\.wikipedia\.org.*?<\/ref>/g, ' {{אנ|$1}}'); // fix bad call to wikien

				text = text.replace(/<\/?u\/?>/g, ''); // remove underline
				// text = text.replace(/<\/?big\/?>/g, ''); // remove big
				text = text.replace(/(ISBN|ISSN|PMID): ?(\d)/g, '$1 $2').replace(/(ISBN|ISSN|PMID) <bdi>(.*?)<\/bdi>/g, '$1 $2').replace(/ISBN (\d+.?\d+.?\d+.?\d+.?\d+-?X?)/g, '{{מ'+'סת"ב|$1|אנגלית=כן}}').replace(/ISSN (\d+).?(\d+)/g, '{{I'+'SSN|$1-$2}}').replace(/PMID (\d+)/g, '{{P'+'MID|$1}}').replace(/RFC (\d+)/g, '{{R'+'FC|$1}}'); // ISBN, ISSN, PMID
				text = text.replace(/(\[\[(?:קובץ|תמונה):.*?\|)(קישור=.*?\|)(.*]])/g, '$1$3'); // remove unneeded url in file/picture

				if (text.indexOf('קטגוריה:דפים עם כיתוב ללא תמונה בתבניות') > 0 && artImg) { // use media image when caption exists with no image
					text = text.replace(/\| ?תמונה ?=\n/g, '').replaceAll('\[\[קטגוריה:דפים עם כיתוב ללא תמונה בתבניות\]\]\n', '');
					text = text.replaceAll('|כיתוב', '| תמונה = ' + artImg + '\n|כיתוב').replaceAll('| כיתוב', '| תמונה = ' + artImg + '\n| כיתוב');
				}

				text = text.replace(/}}\n\n'''/g, '}}\n\'\'\''); // space after template
				text = text.replace(/תאריך (לידה|פטירה) ?= ?(\d+ .*) (\d+)/g, 'תאריך $1 = [[$2]] [[$3]]'); // date in template
				text = text.replace(/(נולדה? ב-)(\d+ [א-ת]+) (\d+)\)/g, '$1[[$2]] [[$3]])').replace(/(\d+ [א-ת]+) (\d+) [-–] (\d+ [א-ת]+) (\d+)\)/g, '[[$1]] [[$2]] – [[$3]] [[$4]])'); // birth date in header

				text = text.replace(/\| ?{{כ}} ?(\d)/g, '|$1'); // clear date
				// text = text.replaceAll('|כיוון=ימין', ''); // temporary

				text = text.replace(/\|language=iw/g, ''); // non existing language
				// text = text.replace(/,? '?'?et al\.?'?'?/g, ''); // explicit use of et al

				textBox.textContent = text.replace(/arrowleft/g, '-->'); // second part of the weird bugfix
			}
		};
	}
}