Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.

  • Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
  • Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
  • Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
  • Opera: натисніть Ctrl-F5
// MediaWiki:Wikificator.js (українська Вікіпедія); MediaWiki:Wikificator.js (на основі російських Вікіджерел)
mw.loader.using( 'ext.gadget.registerTool' ).done( function () {
	
	var wmFullText = 'Вікіфікатор опрацює ВЕСЬ текст. Виконати?',
		wmTalkPage = 'Будь ласка, не обробляйте Вікіфікатором репліки інших користувачів.\n\nВиділіть текст, який треба опрацювати.';
	window.wfPlugins = window.wfPlugins || [];
	window.wfPluginsT = window.wfPluginsT || [];
	
	
	// Function takes an input or text as an argument. If it is absent, it uses $( '#wpTextbox1' )
	// as an input.
	window.Wikify = function ( inputOrText ) {
		'use strict';
	
		var text, isInput, $input, caretPosition, textScroll,
			txt = '',
			hidden = [],
			winScroll = document.documentElement.scrollTop,
			$CodeMirrorVscrollbar = $( '.CodeMirror-vscrollbar' );
	
		// Check what's in the first parameter
		if ( typeof inputOrText === 'string' ) {
			text = inputOrText;
		} else {
			isInput = ( inputOrText &&
				( ( inputOrText.nodeType && inputOrText.value !== undefined ) || // node
					( inputOrText.prop && inputOrText.prop( 'nodeType' ) ) // jQuery object
				)
			);
			$input = $( isInput ? inputOrText : '#wpTextbox1' );
		}
	
	
		// FUNCTIONS
	
		function r( r1, r2 ) {
			txt = txt.replace( r1, r2 );
		}
	
		function hide( re ) {
			r( re, function ( s ) {
				return '\x01' + hidden.push( s ) + '\x02';
			} );
		}
	
		function hideTag ( tag ) {
			hide( new RegExp( '<' + tag + '( [^>]+)?>[\\s\\S]+?<\\/' + tag + '>', 'gi' ) );
		}
	
		function hideTemplates() {
			hide( /\{\{([^{]\{?)+?\}\}/g );
			var pos = 0,
				stack = [],
				tpl,
				left,
				right;
			while ( true ) {
				left = txt.indexOf( '{{', pos );
				right = txt.indexOf( '}}', pos );
				if ( left === -1 && right === -1 && !stack.length ) {
					break;
				}
				if ( left !== -1 && ( left < right || right === -1 ) ) {
					stack.push( left );
					pos = left + 2;
				} else {
					left = stack.pop();
					if ( typeof left === 'undefined' ) {
						if ( right === -1 ) {
							pos += 2;
							continue;
						} else {
							left = 0;
						}
					}
					if ( right === -1 ) {
						right = txt.length;
					}
					right += 2;
					tpl = txt.substring( left, right );
					txt = txt.substring( 0, left ) +
						'\x01' + hidden.push( tpl ) + '\x02' +
						txt.substr( right );
					pos = right - tpl.length;
				}
			}
		}
		
		function processLink( link, left, right ) {
			left = left.replace( /[ _\u00A0]+/g, ' ' ).trim();
			if ( left.match( /^(?:Категорія|Файл) ?:/ ) ) {
				return '[[' + left + '|' + right + ']]';
			}
			right = right.replace( / {2,}/g, ' ' ).trim();
			var inLink = right.substr( 0, left.length );
			var afterLink = right.substr( left.length );
			var uniLeft = left.substr( 0, 1 ).toUpperCase() + left.substr( 1 );
			var uniRight = ( right.substr( 0, 1 ).toUpperCase() + right.substr( 1 ) ).replace( /[_\u00A0]/g, ' ' );
			if ( uniRight.indexOf( uniLeft ) === 0 && afterLink.match( /^[a-zа-я]*$/ ) ) {
				return '[[' + inLink + ']]' + afterLink;
			} else {
				return '[[' + left + '|' + right + ']]';
			}
		}
	
		function processText() {
			var i,
				u = '\u00A0', // non-breaking space
				nnbsp = '\u202F', // narrow non-breaking space
				thinsp = '\u2009', // thin space
				fsp = '\u2007'; // figure space

			if ( mw.config.get( 'wgNamespaceNumber' ) % 2 || mw.config.get( 'wgNamespaceNumber' ) === 4 ) { // is talk page
				var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g );
				if ( sigs && sigs.length > 1 ) {
					alert( wmTalkPage );
					return;
				}
			}
	
			r( /^( |&nbsp;|\x00a0|\t)+$/gm, '' ); // spaces in empty lines
	
			hideTag( 'nowiki' );
			hideTag( 'pre' );
			hideTag( 'source' );
			hideTag( 'syntaxhighlight' );
			hideTag( 'templatedata' );
	
			hideTag( 'code' );
			hideTag( 'kbd' );
			hideTag( 'tt' );
	
			hideTag( 'graph' );
			hideTag( 'hiero' );
			hideTag( 'math' );
			hideTag( 'timeline' );
			hideTag( 'chem' );
			hideTag( 'score' );
			hideTag( 'categorytree' );
			hideTag( 'inputbox' );
			hideTag( 'mapframe' );
			hideTag( 'maplink' );
	
			// r( /\{\{(?:підст|subst):(?:[уУ]дар(?:ение)?|')\}\}/g, '\u0301' );
			r( /( |\n|\r)+\{\{(·|•|\*)\}\}/g, '{{$2}}' ); // before {{·/•/*}}, usually in templates
			r( /\{\{\s*[Шш]аблон:([\s\S]+?)\}\}/g, '{{$1}}' );
			r( /(\{\{\s*)(?:reflist|примітки)(\s*[\|\}])/ig, '$1примітки$2' );
			r( /(\{\{\s*)примітки(\s*\|\s*)[4-9](\s*[\|\}])/ig, '$1примітки$2короткі$3' );
			r( /(\{\{\s*)примітки\s*\|\s*height=[0-9]*(\s*[\|\}])/ig, '$1примітки$2' );
			r( /[\u00A0 ]+(\{\{\s*([Rr]ef-[a-z\-]+?|[Ee]n icon|[Cc]hecked|[Vv]|[Пп]еревірено)\}\})/g, '$1' );
			r( /<[\/\\]?(hr|br)( [^\/\\>]+?)?? *[\/\\]?>/gi, '<$1$2>' );
			r( /<noinclude>\s*(\{\{[dD]ocpage\}\})\s*<\/noinclude>/g, '$1' );
			r( /(\| *(?:pp?|S|s|с|c|сторінки\d?|pages\d?|seite\d?|alleseiten|листи\d?|том|volume|band|випуск|issue|heft|номер|стопці\d?|columns\d?|kolonnen\d?|серія рік) *= *)(\d+)[\u00A0 ]?(?:-{1,3}|—) ?(\d+)/g, '$1$2—$3' );
			r( /(\| *рік *= *)(\d{4})[\u00A0 ]?(?:-{1,3}|—) ?(\d{4})/g, '$1$2—$3' );
	
			r( /(\[\[[^\{\]|\n]+){{!}}([^\{\]|\n]+\]\])/g, '$1|$2' );
	
			for ( i in window.wfPluginsT ) {
				if ( window.wfPluginsT.hasOwnProperty( i ) ) {
					window.wfPluginsT[i]( txt, r );
				}
			}
	
			hideTemplates();
			hide( /^[ \t].*/mg );
			hide( /(https?|ftp|news|nntp|telnet|irc|gopher):\/\/[^\s\[\]<>"]+ ?/gi );
			hide( /magnet:\?[^\s\[\]<>"]+ ?/gi );  // torrent magnet links
			hide( /^#(redirect|перенапр(авлення)?)/i );
			hideTag( 'gallery' );
	
			txt = '\n' + txt + '\n';
	
	
			// LINKS
			r( /(\[\[:?)(category|категорія):( *)/ig, '$1Категорія:' );
			r( /(\[\[:?)(module|модуль):( *)/ig, '$1Модуль:' );
			r( /(\[\[:?)(template|шаблон):( *)/ig, '$1Шаблон:' );
			r( /(\[\[:?)(image|зображення|file|файл):( *)/ig, '$1Файл:' );
			// Linked years, centuries and ranges
			r( /(\(|\s)(\[\[[12]?\d{3}\]\])[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[12]?\d{3}\]\])(\W)/g, '$1$2—$4$5' );
			r( /(\[\[[12]?\d{3}\]\]) ?(рр?\.)/g, '$1' + u + '$2' );
			r( /(\(|\s)(\[\[[IVX]{1,5}\]\])[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[IVX]{1,5}\]\])(\W)/g, '$1$2—$4$5' );
			r( /(\[\[[IVX]{1,5}\]\]) ?((вв?|ст)\.)/g, '$1' + u + '$2' );
			r( /\[\[(\d+)\]\]\sрік/g, '[[$1' + u + 'рік]]' );
			r( /\[\[(\d+)\sрік\|\1\]\]\sрік/g, '[[$1' + u + 'рік]]' );
			r( /\[\[(\d+)\sрік\|\1\sрік([а-яієїґ]{0,3})\]\]/g, '[[$1' + u + 'рік]]$2' );
			r( /\[\[((\d+)(?: (?:рік )?(в|у) [\wa-яієїґА-ЯІЄЇҐ ]+\|\2)?)\]\][\u00A0 ](рік[а-яієїґ]*)/g, '[[$1' + u + '$3]]' );
			r( /\[\[([XVI]+)\]\]\s(століття|сторіччя)/g, '[[$1 століття|$1 $2]]' );
            r(/\[\[([XVI]+)\]\]\s(століття|сторіччя)/g, '[[$1 століття|$1 $2]]');
            r(/\[\[([XVI]+)\sстоліття\|\1\sстоліття([а-яієїґ]{0,3})\]\]/g, '[[$1 століття]]$2');
            r(/\[\[(([XVI]+) століття\|\2)\]\][\u00A0 ]століття/g, '[[$2 століття]]');

			// Nice links
			r( /(\[\[[^|[\]]*)[\u00AD\u200E\u200F]+([^\[\]]*\]\])/g, '$1$2' ); // Soft Hyphen & DirMark
			r( /\[\[ *([^|[\]]+?) *\| *('''''|'''|'')([^'|[\]]*)\2 *]]/g, '$2[[$1|$3]]$2' ); // move fomatting out of link text
			r( /\[\[ *([^|[\]]+?) *\| *«([^»|[\]]*)» *\]\]/g, '«[[$1|$2]]»' ); // move quotation marks out of link text
			r( /\[\[ *([^|[\]]+?) *\| *„([^“|[\]]*)“ *\]\]/g, '„[[$1|$2]]“' );
			r( /\[\[ *([^|[\]]+?) *\| *"([^"|[\]]*)" *\]\]/g, '"[[$1|$2]]"' );
			r( /\[\[([^|[\]\n]+)\|([^|[\]\n]+)\]\]/g, processLink ); // link shortening
			r( /\[\[ *([^|[\]]+)([^|\[\]()]+?) *\| *\1 *\]\]\2/g, '[[$1$2]]' ); // text repetition after link
			r( /\[\[ *(?!Файл:|Категорія:)([a-zA-Zа-яА-Я\u00A0-\u00FF %!\"$&'()*,\-—.\/0-9:;=?\\@\^_`’~]+) *\| *([^\|\[\]]+) *\]\]([a-zа-я]+)/g, '[[$1|$2$3]]' ); // "
			hide( /\[\[[^\]|]+/g); // only link part
	
	
			// TAGS
			r( /<<(\S.+\S)>>/g, '"$1"' ); // << >>
			r( /(su[pb]>)-(\d)/g, '$1−$2' ); // ->minus
			r( /<(b|strong)>(.*?)<\/(b|strong)>/gi, "'''$2'''" );
			r( /<(i|em)>(.*?)<\/(i|em)>/gi, "''$2''" );
			r( /^<hr ?\/?>/gim, '----' );
			r( /[\u00A0 \t]*<ref(?:\s+name="")?(\s|>)/gi, '<ref$1' );
			r( /(\n== *[a-zа-я\s\.:]+ *==\n+)<references *\/>/ig, '$1{' + '{примітки}}' );
			hide( /<[a-z][^>]*?>/gi);
	
			hide( /^(\{\||\|\-).*/mg); // table/row def
			hide( /(^\||^!|!!|\|\|) *[a-z]+=[^|]+\|(?!\|)/mgi); // cell style
			hide( /\| +/g); // formatted cell
	
			r( /( |&nbsp;|\x00a0|\t)+$/gm, '' ); // spaces at EOL
			r( /[^\S\r\n]{2,}/g, ' ' ); // double spaces
			
	
			// Entities etc. → Unicode chars
			if ( mw.config.get( 'wgNamespaceNumber' ) !== 10 ) {
				r( /&(#x[0-9a-f]{2,4}|#[0-9]{3,4}|[0-9a-z]{2,8});/gi, function ( s ) {
					var t = document.createElement( 'textarea' );
					t.innerHTML = s;
					var c = t.value;
					if ( c.length === 1 && c.charCodeAt( 0 ) > 127 || s === '&#x20;' ) {
						return c;
					}
					return s;
				});
			}
			r( /\(tm\)/gi, '™' );
			r( /\.\.\./g, '…' );
			r( /(^|[^+])\+-(?!\+|-)/g, '$1±' );
			r( /~=/g, '≈' );
			r( /\^2(\D)/g, '²$1' );
			r( /\^3(\D)/g, '³$1' );
			r( /(\s)кв\.\s*(дм|см|мм|мкм|нм|км|м)(\s)/g, '$1' + u + '$2²$3' );
			r( /(\s)куб\.\s*(дм|см|мм|мкм|нм|км|м)(\s)/g, '$1' + u + '$2³$3' );
			r( /((?:^|[\s"])\d+(?:[\.,]\d+)?)\s*[xх]\s*(\d+(?:[\.,]\d+)?)\s*([мm]{1,2}(?:[\s"\.,;?!]|$))/g, '$1×$2' + u + '$3' );
			r( /\s+×\s+/g, u + '×' + u );
			r( /([\wа-яА-Я])'(?=[\wа-яА-Я])/g, '$1’' ); // '
			// r( /№№/g, '№' );
	
			// Headings
			r(/^(=+)[ \t\f\v]*(.*?)[ \t\f\v]*=+$/gm, '$1 $2 $1') //add spaces inside
			r( /([^\r\n])(\r?\n==.+==\r?\n)/g, '$1\n$2' ); // add empty line before
			r( /(==.+==)[\r\n]{2,}(?!=)/g, '$1\n' ); // remove empty line after
			r(/^== див(\.?|ись|іться) ?також ==$/gmi, '== Див. також ==');
			r( /^== виноски  ==$/gmi, '== Примітки  ==' );
			r(/^== зовнішні\sпосилання ==$/gmi, '== Посилання ==');
			r( /^== (?:(.+[^.])\.|(.+):) ==$/gm, '== $1$2 ==' );
			r( /^== '''(?!.*'''.*''')(.+)''' ==$/gm, '== $1 ==' );
	
			// r( /«|»|“|”|„/g, '"' ); // temp // викнуто [«»„“], є різні формати в текстах
	
			// Hyphens and en dashes to pretty dashes
			r( /([,?:;"«»„“])[-—]/g, '$1 -' ); // відсутність пробілу між розділовим знаком і наступним дефісом/тире. Не обробляємо після точки, бо часто бувають скорочення на кшталт "христ.-соц."
			r( /([.,?:;"«»„“])--/g, '$1 —' ); // відсутність пробілу між розділовим знаком і наступним подвійним дефісом (імітація тире на старих кодуваннях)
			r( /([^<]!)[-—]/g, '$1 -' ); // відсутність пробілу між "!" і наступним дефісом/тире. Виключаючи html-коментарі "<!--"
			r( /—]([А-я"«„])/g, '— $1' ); // відсутність пробілу між тире та наступною літерою або лапками
			r( /–/g, '-' ); // &ndash; -> hyphen
			r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> &mdash;
			r( /(\d)--(\d)/g, '$1—$2' ); // -> &mdash;
			r( /(\s)-(\d)/g, '$1−$2' ); // hyphen -> minus
	
			// Year and century ranges
			r( /(\(|\s)([12]?\d{3})[\u00A0 ]?(-{1,3}|—) ?([12]?\d{3})(?![\wА-Яа-я]|-[^ех]|-[ех][\wА-Яа-я])/g, '$1$2—$4' );
			r( /(\(|\s)([IVX]{1,5})[\u00A0 ]?(-{1,3}|—) ?([IVX]{1,5})(?![\w\-])/g, '$1$2—$4' );
			r( /([IVX]{1,5}) ?(ст?\.|століття)/g, '$1' + u + '$2' );
			r( /([12]?\d{3}) ?(рр?\.)/g, '$1' + u + '$2' );
			r( /(\d)\s(рік|літ)/g, '$1' + u + '$2' );
			r( /н\.\s?э(\.|(?=\s))/g, 'н.' + nnbsp + 'е.' ); // н.е.
			r( /(Д|д)о\sн\.\s?э\./g, '$1о' + u + 'н.' + nnbsp + 'е.' );  // До н.е.
			r( /(Д|д)о\sР\.\s?Х\./g, '$1о' + u + 'Х.' + nnbsp + 'Р.' );  // До Р.Х.
			r( /(\d)\s(гг?\.|рік|літ)\s(Д|д)о\s(Р|н)/g, '$1' + u + '$2' + u + '$3о' + u + '$4' );
	
			// Пробелы
			// Сокращения
			r( /(Т|т)\.\s?ч\./g, '$1\.'+nnbsp+'ч\.'); // тому числі
			//r( /(В|в)\sт\.\s?ч\./g, '$1'+u+'т\.'+nnbsp+'ч\.');
			r( /(Т|т)\. ?ін\./g, '$1\.'+nnbsp+'ін\.'); // те інше
			r( /(Т|т)\. ?д\./g, '$1\.'+nnbsp+'д\.');
            r( /(Т|т)\. ?зв\./g, '$1\.'+nnbsp+'д\.');
			r( /(І|і)\sт\.\s?ін\./g, '$1' + u + 'т.' + nnbsp + 'ін.' ); // і те інше 
			//r( /(И|и)\sт\.\s?п\./g, '$1' + u + 'т.' + nnbsp + 'п.' );
			//r( /(Т|т)\.\s?н\./g, '$1.' + nnbsp + 'н.' );
			//r( /(И|и)\.\s?о\./g, '$1.' + nnbsp + 'о.' );
			r(/(Т|т)\. ?я\./g, "$1ак як") // так як
			
			// скрч напримків світу
			r( /пн\.\s?ш\./g, 'пн.' + nnbsp + 'ш.' ); 
			r( /пд\.\s?ш\./g, 'пд.' + nnbsp + 'ш.' );
			r( /сх\.\s?д\./g, 'сх.' + nnbsp + 'д.' );
			r( /зх\.\s?д\./g, 'зх.' + nnbsp + 'д.' );
			
			//r( /л\.\s?с\./g, 'л.' + nnbsp + 'с.' );
			//r( /а\.\s?е\.\s?м\./g, 'а.' + nnbsp + 'е.' + nnbsp + 'м.' );
			//r( /а\.\s?е\./g, 'а.' + nnbsp + 'е.' );
			r( /мм\sрт\.\s?ст\./g, 'мм' + nnbsp + 'рт.' + nnbsp + 'ст.' );
			r( /(\d)[\u00A0 ]?(млн|млрд|трлн|(?:м|с|д|к)?м|[км]г)\.?(?=[,;.]| "?[а-я\-]|\s*\|)/g, '$1' + u + '$2' );
			r( /(\d)[\u00A0 ]?(руб\.|р\.|рубл|к\.|коп\.|копе[ей]к)/g, '$1' + u + '$2' );
			r( /(\d)[\u00A0 ](тис)([^\.А-Яа-я])/g, '$1' + u + '$2.$3' );
			r( /ISBN:\s?(?=[\d\-]{8,17})/, 'ISBN' + u );

			r( /^([#*:]+)[ \t\f\v]*(?!\{\|)([^ \t\f\v*#:;])/gm, '$1 $2' ); // space after #*: unless before table
			r( /^[-—][^\S\r\n]/gm, '—' + fsp );  // тире на початку
			r( /[^\S\r\n][-—]$/gm, nnbsp + '—' );  // тире в кінці рядка
			r( /[^\S\r\n](-{1,3}|—)[^\S\r\n]/g, nnbsp + '—' + thinsp );  // тире з обох боків
			r( /([)a-zа-я\]²³])\s*([,:])"/g, '$1$2 "' );  // біля [,:]
			r( /([)"a-zа-я\]²³])[ \u00A0\t]([,;])\s([\[("a-zа-я])/g, '$1$2 $3' );  // біля [,:]
			r( /([^%\/\wА-Яа-я"]\d+?(?:[\.,]\d+?)?) ?([%‰])(?!-[А-Яа-я])/g, '$1' + nnbsp + '$2' ); //5 %
			r( /(\d) ([%‰])(?=-[А-Яа-я])/g, '$1$2' ); //5%-й
			r( /([№§])(\s*)(\d)/g, '$1' + u + '$3' );
			r( /(\d)[^\S\r\n](\d{3,})/g, '$1' + nnbsp + '$2' );  // між розрядами цифр
			// inside ()
			r( /\( +/g, '(' );
			r( / +\)/g, ')' );
			
			// Неразрывный пробел в сокращениях в словосочетаниях
			r( /([^А-Яа-я](?:[Сс]|[Сс]тр|[Сс]твп|[Пп]п?|[Тт]|[Чч])\.)[^\S\r\n]?(\d)/g, '$1' + u + '$2' );  // "стр. 4, пп. 5"
			r( /([^\S\r\n](?:[A-Za-zА-Яа-я]|\d+)\))[^\S\r\n](?=[А-я\w])/g, '$1' + u );  // у списках після номера і [.)] "а) текст, 10) текст"
			r( /(\s)([Гг]-н(?:а|ов|у|ом|ы)?|[Гг]-ж(?:а|е|и|у|ой)|[Тт]ов\.|[Тт]\.|[Гг]р\.)[^\S\r\n]([а-яієїґ])/g, '$1$2' + u + '$3' );  // між скороченими зверненнями та прізвищем («п-н Коваль»)
			r( /(\s)((?:[Гг]|[Сс]|[Мм]|[Оо]|[Рр])\.)[^\S\r\n]([а-яієїґ])/g, '$1$2' + u + '$3' );  // в географ. скороченях («г. Москва», «о-ва Кука»)
			r( /(\s)([Оо]-в(?:а|ов|у|ом)?)[^\S\r\n]([а-яієїґ])/g, '$1$2' + u + '$3' );  // в географ. скороченях без крапки («о-ва Кука»)
			r( /([А-Я][а-я]+)[^\S\r\n](вул|пров|губ|обл)\./g, '$1' + u + '$2.' ); // "Незалежності вул, Київська обл.."
			r( /(^|[^\wА-я\.])([А-Я][а-я]+) ([А-Я]\.) ?([А-Я]\.)(?! ?[А-Я][а-я\.])/g, '$1$2' + nnbsp + '$3' + nnbsp + '$4'); // ініціали "Кіт А. В."
			r( /(^|[^\wА-я\.])([А-Я]\.) ?([А-Я]\.) ?(?=[А-Я][а-я]+)/g, '$1$2' + nnbsp + '$3' + nnbsp); // ініціали "А. В. Кіт"
			r( /([а-я]"?\)?[\.\?!:])((?:\x01\d+\x02\|)?(?:[A-QS-ZА-Я]|R(?!u\b)))/g, '$1 $2' ); // "word. Word"; don't change in cases like "Газета.Ru"
			r( /([)"a-zа-я\]²³])\s*([,:])([\[(a-zа-я])/g, '$1$2 $3' ); // "word, word", "word: word"; except ":"
			// Неразрывный пробел после предлогов, союзов, перед частицами (вимкнено)
			//r( /([^А-я])(в|во|без|до|из|к|ко|на|по|о|от|перед|при|через|с|у|не|за|над|для|об|под|про|и|а|но|да|или|ли|бы|то|что|как|я|он|мы|они|ни)[^\S\r\n]([А-Яа-я])/g, '$1$2' + u + '$3' ); // Неразрывный пробел после предлогов, союзов, частицы «не»
			//r( /([^А-я])(В|Во|Без|До|Из|К|Ко|На|По|О|От|Перед|При|Через|С|У|Нет|За|Над|Для|Об|Под|Про|И|А|Но|Да|Или|Ли|Бы|То|Что|Как|Я|Он|Мы|Они|Ни)[^\S\r\n]([А-Яа-я])/g, '$1$2' + u + '$3' ); // Неразрывный пробел после предлогов в начале предложения
			//r( /([а-я])[^\S\r\n]+(бы|ли|же)(?![А-я])/g, '$1' + u + '$2' );  // перед частицами «бы», «ли», «же»

			// Temperature
			r( /([\s\d=≈≠≤≥<>—("'|])([+±−\-]?\d+?(?:[.,]\d+?)?)(([ °\^*]| [°\^*])(C|F))(?=[\s"').,;!?|\x01])/gm, '$1$2' + u + '°$5' ); // '
	
			// Dot → comma in numbers
			// r( /(\s\d+)\.(\d+[\u00A0 ]*[%‰°×])/gi, '$1,$2' );
	
			// Plugins
			for ( i in window.wfPlugins ) {
				if ( window.wfPlugins.hasOwnProperty( i ) ) {
					window.wfPlugins[i]( txt, r );
				}
			}
	
			// "" → «»
			for ( i = 1; i <= 2; i++ ) {
				r( /([\s\x02!|#'"\/([{;+\-])"([^"]*)([^\s"([{|])"([^a-zа-я])/ig, '$1«$2$3»$4' ); // "
			}
			while ( /«[^»]*«([^»]*)»/.test( txt ) ) {
				r( /«([^»]*)«([^»]*)»/g, '«$1„$2“' );
			}
	
			function unhide( s, num ) {
				return hidden[ num - 1 ];
			}
			while ( txt.match( /\x01\d+\x02/ ) ) {
				r( /\x01(\d+)\x02/g, unhide );
			}
	
			txt = txt.substr( 1, txt.length - 2 ); // compensation for "txt = '\n' + txt + '\n';"
		}
	
		function processAllText() {
			if ( mw.config.get( 'wgNamespaceNumber' ) == 104 )
				txt = '\n' + wpTextbox1.value;  // Виключення колонтитулів у ПІ Сторінка
			else 
				txt = $input ? $input.textSelection( 'getContents' ) : text;
			processText();
			if ( $input ) {
				r( /^[\n\r]+/, '' );
				
				$input.textSelection( 'setContents', txt );
				if ( caretPosition ) {
					$input.textSelection( 'setSelection', {
						start: caretPosition[0] > txt.length ? txt.length : caretPosition[0]
					} );
				}
			} else {
				text = txt;
			}
			if ( window.auto_comment &&
				window.insertSummary &&
				!document.editform.wpSection.value
			) {
				window.insertSummary( 'вікіфікатор' );
			}
		}
	
	
		// MAIN CODE
	
		if ( $input ) {
			$input.focus();
			
			caretPosition = $input.textSelection( 'getCaretPosition', { startAndEnd: true } );
			if ( caretPosition ) {
				textScroll = ( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input )
					.scrollTop();
				if ( caretPosition[0] === caretPosition[1] ) {
					processAllText();
				} else {
					txt = $input.textSelection( 'getSelection' );
					processText();
					// replaceSelection doesn't work with MediaWiki 1.30 in case this gadget is loaded
					// from other wiki
					$input.textSelection( 'encapsulateSelection', {
						replace: true,
						peri: txt
					} );
					// In CodeMirror, the selection isn't preserved, so we do it explicitly
					$input.textSelection( 'setSelection', {
						start: caretPosition[0],
						end: caretPosition[0] + txt.length
					} );
				}
				( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input )
					.scrollTop( textScroll );
			// If something went wrong
			} else if ( confirm( wmFullText ) ) {
				processAllText();
			}
		} else {
			processAllText();
			return text;
		}
	
		// scroll back, for 2017 wikitext editor, IE, Opera
		document.documentElement.scrollTop = winScroll;
	};
	
	
	registerTool( {
		name: 'wikificator',
		position: 100,
		title: 'Вікіфікатор',
		label: 'Вікіфікатор — автоматичний обробник тексту',
		callback: Wikify,
		classic: {
			icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
		},
		visual: {
			icon: '//upload.wikimedia.org/wikipedia/commons/thumb/4/41/Wikificator_VE_icon.svg/20px-Wikificator_VE_icon.svg.png',
			modes: [ 'source' ],
			addRightAway: true,
		},
	} );


}() );
// </nowiki>