Участник:X0stark69/wikificator+.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
//Викификатор проекта ВО
//Документация: [[Проект:Водные объекты/Технарий#Скрипт автозамены]]

function Wikify_WO() {

	window.wfWOPlugins = window.wfWOPlugins || [];

	Wikify();

	time = new Date();
	var txt = '',
		label = '',
		subst = '{{subst:',
		substclose = '}}',
		system = '',
		current_mouth_altitude = '',
		replace_all_link = 0,
		wpTextbox1 = document.editform.wpTextbox1,
		winScroll = document.documentElement.scrollTop,
		linetime = time.getUTCFullYear() + '-' + (time.getUTCMonth()+1).toString().padStart( 2, "0") + '-' + time.getUTCDate().toString().padStart( 2, "0");

	function processText() {

		//приоритетные изменения: стиль, типографика, викификация
		r(/((\s|\()[1-9])\s([0-9][0-9][0-9])(\s[^0-9]|\.)/g, '$1$3$4'); //4-значные числа без пробела

		r(/\[\[(Волга|Обь|Лена|Печора|Неман|Иртыш|Миссисипи|Амазонка)\s\(река\)/g, '[[$1');
		r(/\[\[Томь\s\(приток\sОби\)/g, '[[Томь');
		r(/\[\[Березина\s\(нижний приток Днепра\)/g, '[[Березина');
		r(/\[\[Суда\s\(приток\sВолги\)\|/g, '[[Суда (река, впадает в Рыбинское водохранилище)|');
		r(/\[\[(Таймыр|Камчатка)\s\(полуостров\)/g, '[[$1');

		r(/< *ref *name *= *\'([^\']+)\'/g, '<ref name="$1"');
		r(/< *ref *name *= *([^\'\"\/\> ]+)/g, '<ref name="$1"');


		//разрывы строк
		r(/\n\s\n/g, '\n\n');//пробелы между абзацами
		r(/\n\n\n/g, '\n\n');
		r(/\n\n\n/g, '\n\n');
		r(/\}\}\n\n\'\'\'/g, '}}\n\'\'\'');//после карточки
		if (txt.indexOf('<gallery') == -1 && txt.indexOf('<poem') == -1) {//убрать разрывы строк
			r(/,\n([^#\*])/g, ', $1');//замена переносов пробелами за запятыми
			r(/([а-яё]\.)\n([А-УХ-яа-ух-я])/g, '$1 $2');//замена переносов пробелами за точками
			r(/([а-яё])\n(\[\[[^:]+?[\|\]])/g, '$1 $2');//замена переносов пробелами, заливка укропоселений
			r(/([^\s])[\n]([а-яё]+)/g, '$1 $2');
			r(/([a-z]+)[\n]([a-z]+)/g, '$1 $2');
		}
		
		
		var temp = txt.match( /\|\s?Высота устья\s*=\s(.+)\n/ );

		if (temp != null)
		{
			current_mouth_altitude = temp[1];
		}

		var temp = txt.match( /\|\s?Устье\s*=\s(.+)\n/ );
		current_mouth = '';
		if (temp != null)
		{
			current_mouth = temp[1];
		}

		//предупреждения
		var added = '';
		if (txt.indexOf('{{Река') > -1)
		{
			added = added + attention('Длина', '|Длина реки — replace км.}}');
			added = added + attention('Площадь водосбора', '|Площадь водосборного бассейна — replace км².}}');
			r(/\n\[\[Категория:Реки\sпо\sалфавиту\]\]/g, '');
		};
		added = added + attention('Расход воды', '|Средний расход воды — replace м³/с.}}');
		added = added + attention('Высота над уровнем моря', '|Высота над уровнем моря — replace м.}}');
		added = added + attention('Высота истока', '|Высота истока — replace м над уровнем моря.}}');
		if (current_mouth_altitude != '0' || current_mouth_altitude == '−28' || current_mouth_altitude == '-28')
		{
			added = added + attention('Высота устья', '|Высота устья — replace м над уровнем моря.}}');
		}
		added = added + attention('Уклон реки', '|Уклон реки — replace м/км.}}');
		added = added.replace(/}} {{subst:АИ2\|/g, ' '); //всё в один запрос АИ2
		
		if (label == 1)
		{
			if (confirm('Внимание! Ряд параметров карточки не указаны или не соответствуют тексту статьи! «' + added + '» — вставить?')) {
				r('\n\n', '\n\n' + added + '\n\n');
			}
		}

		r(/\|Исток\s*=\s(.+)\n/g, function ( line, source )
		{
			source = request('https://ru.wikipedia.org/w/api.php?format=xml&action=query&prop=categories&cllimit=500&titles=' + source);

			if ((source.indexOf('missing') == -1) && (source.indexOf('Водные объекты по алфавиту') == -1))
			{
				alert('В истоке указана статья об объекте, не являющимся водным! Пожалуйста, исправьте ошибку!');
			};

			return line;
		});
		r(/\|Устье\s*=\s(.+)\n/g, function ( line, source )
		{
			source = request('https://ru.wikipedia.org/w/api.php?format=xml&action=query&prop=categories&cllimit=500&titles=' + source);

			if ((source.indexOf('missing') == -1) && (source.indexOf('Водные объекты по алфавиту') == -1))
			{
				alert('В устье указана статья об объекте, не являющимся водным! Пожалуйста, исправьте ошибку!');
			};

			return line;
		});

		//автозапрос АИ для раздела
		r(/{{Нет/g, '{{нет');
		if (txt.indexOf('{{нет ссылок\|') === -1 && txt.indexOf('{{нет сносок}}') === -1 && txt.indexOf('{{нет сносок\|') === -1 && txt.indexOf('{{частично без сносок') === -1 && txt.indexOf('подст:нет источников}}') === -1) {
	//		r(/\}\}\n\'\'\'/g, '}}\n== Преамбула ==\n\'\'\'');
			r(/ ([^=]+?) (==)\n([^@]+?)(\n==|$)/g, function ( line, name_part, tab, text_part, last_tab )
			{
				if ( name_part.indexOf('Притоки') !== -1 || name_part.indexOf('Бассейн') !== -1 || name_part.indexOf('Ссылки') !== -1 || name_part.indexOf('Литература') !== -1 || name_part.indexOf('Дополнительная литература') !== -1 || name_part.indexOf('См. также') !== -1 || name_part.indexOf('Примечания') !== -1 || name_part.indexOf('Комментарии') !== -1 || name_part.indexOf('Источники') !== -1 || name_part.indexOf('Топографические карты') !== -1 || name_part.indexOf('Галерея') !== -1 || name_part.indexOf('Фотографии') !== -1 || name_part.indexOf('Библиография') !== -1 || name_part.indexOf('Географическое положение') !== -1) { return line; }//сбросить

				if ( text_part.indexOf('ref') !== -1 || text_part.indexOf('sfn') !== -1 || text_part.indexOf('нет ссылок в разделе') !== -1  || text_part.indexOf('подст:нет источников в разделе') !== -1 || text_part.indexOf('нет АИ') !== -1 ) { return line; }//сбросить

				if ( text_part.length < 400  ) { return line; }//сбросить

				if (confirm('Запросить АИ для раздела «' + name_part + '»?')) {
					return ' ' + name_part + ' ' + tab + '\n{{' + 'подст:нет источников в разделе' + '}}\n' + text_part + last_tab;
				} else { return line; }
			});
	//		r(/== Преамбула ==\n/g, '');
		}

		r(/\|Бассейн\s*=([А-яЁёA-z0-9\/\(\)\s\-]*)\n/g, function ( line, bassin )
		{
				line = line.replace(/(Кама|Камчатка|Печора|Миссисипи) \(река\)/g, '$1');
				line = line.replace(/Вишера \(приток Камы\)\/Кама/g, 'Вишера (приток Камы)/Камское водохранилище/Кама');
				line = line.replace(/Ветлуга \(река\)\/Волга/g, 'Ветлуга (река)/Чебоксарское водохранилище/Волга');
				line = line.replace(/(Томь) \(приток Оби\)/g, '$1');
				line = line.replace(/([а-яё\)])\s*\n/g, '$1\n');
				
				return line;
		});
		
		//команды
		r(/\|Бассейн\s*=([А-яЁёA-z0-9\/\(\)\s\-]*)\n/g, function ( line, bassin )
		{
			if (current_mouth_altitude == '0' || current_mouth_altitude == '−28' || current_mouth_altitude == '-28')
			{
				return line;
			}

			var mouth = txt.match( /\|\s?Устье\s*=\s(.+)\n/ );

			if (mouth != null)
			{
				system = mouth[1];

				wb( mouth[1], 0 );

				if (system == mouth[1])
				{
					system = '';
				}
			}

			if (bassin == ' ')
			{
				return line.replace('\n', system + '\n');
			}
			else if (bassin != ' ' + system)
			{
				alert('Параметр «Бассейн» не соответствует автоматически сгенерированному списку! Возможные причины:\nа) параметр «Бассейн» заполнен неверно (присутствует неточная викификация либо ошибка; очистка параметра покажет потенциальную проблему);\nб) в параметре «Устье» присутствует проблема (викификация, перенаправление, несуществующая статья);\nв) в одной из статей речной системы параметр «Устье» заполнен неверно (см. пункт б);\nг) река впадает в море, а в параметр «Высота устья» не вписан «0».');
			}
			return line;
		});

		//заменить устаревшее название
		if (txt.indexOf('==у') > -1)
		{
			var temp = mw.config.get( 'wgPageName' ).split('_(');
			temp[0] =  temp[0].replace('_', ' ');

			r(/==у\'\'\'([А-яЁё-\s]*?)\'\'\'/g, function ( uns, old )
			{
				return '\'\'\'' + temp[0] + '\'\'\' (\'\'устар.\'\' ' + old + '<ref name=\"ГВР\"/>)';
			});

			r(/\n *\| *Название *= *.*\n/g, '\n |Название                = ' + temp[0] + '\n');
		}

		//вставить карточку
		r(/==(река|озеро|вдх|залив|пролив|ист)/g, function ( uns, type )
		{
			return request('https://ru.wikipedia.org/w/index.php?action=raw&title=Участник:X0stark69/wikificator%2B/' + type);
		});

		//вставить шаблон
		r(/==(книга|кн|статья|ст|cite|ci|сайт|са)/g, function ( uns, type )
		{
			if (type == 'кн' || type == 'книга')
			{
				return '{{книга\n |автор         = \n |ссылка        = \n |заглавие      = \n |ответственный = \n |место         = \n |издательство  = \n |год           = \n |страниц       = \n |isbn          = \n |страницы      = \n}}';
			}

			if (type == 'ст' || type == 'статья')
			{
				return '{{статья\n |автор    = \n |ссылка   = \n |заглавие = \n |язык     = \n |издание  = \n |тип      = \n |год      = \n |месяц    = \n |число    = \n |номер    = \n |issn     = \n |страницы = \n}}';
			}

			if (type == 'ci' || type == 'cite' || type == 'са' || type == 'сайт')
			{
				return '{{cite web\n |author      = \n |url         = \n |title       = \n |lang        = \n |date        = \n |website     = \n |publisher   = \n |access-date  = ' + linetime + ' \n}}';
			}
		});

		r(/==прит([А-яЁё\d\.,\:\(\)\s-]*)/g, function ( uns, tributaries )
		{
			tributaries = 'Объекты перечислены по порядку от устья к истоку.\n{{колонки|3}}' + tributaries;
			tributaries = tributaries.replace( /\n\n/g, '\n{{колонки|конец}}\n');
			tributaries = tributaries.replace( /\n([\d,]+ км: )(река|ручьи руч.) ([А-Я])([А-яЁё\. -]+)/g, '\n$1[[$3$4]]' );
			tributaries = tributaries.replace( /\n([\d,]+ км\:)/g, '\n* $1' );
			tributaries = tributaries.replace( / ]]/g, ']] ' );
			tributaries = tributaries.replace( /]][^\n]+\n/g, ']]\n' );

			return tributaries;
		});

		//вставить параметр позкарты
		r(/==п/g, function ( line )
		{
			return ' |Позиционная карта       = ';
		});

		//поиск битых ссылок в истории
		r(/<ref\sfixref=(\'|\")?(.+?)(\'|\")?\s?\/>/g, function ( uns0, uns1, name )
		{
			var history = request('https://ru.wikipedia.org/w/index.php?action=history&title=' + mw.config.get( 'wgPageName' ));

			var tid = history.match( /oldid=([\d]*)"\sclass/g );

			var t = 0;
			while (tid[t])
			{
				var reg = /=([\d]*)/g;
				var id = reg.exec(tid[t]);

				var history_raw = request('https://ru.wikipedia.org/w/index.php?action=raw&oldid=' + id[1]);

				var regex1 = new RegExp('(<ref\\sname\s?=\s?(\'|\")?' + name + '(\'|\")?\s?>.+?<\/ref>)', '');

				var result1 = history_raw.match( regex1 );

				if (result1 != null)
				{
					alert('Ура! Сноска найдена!\n\nОбыскано версий: ' + t + '\n\nВыражение: ' + regex1);

					label = 2;

					return result1[1];
				}
				t++;
			}
			alert('Сноска не найдена!\n\nОбыскано версий: ' + t + '\n\nВыражение: ' + regex1);

			return uns0.replace('fixref', 'name');
		});

		//исправление доменов
		//загрузить категории
		categories = request( 'https://ru.wikipedia.org/w/api.php?format=xml&action=query&prop=categories&cllimit=500&titles=' + mw.config.get('wgPageName') );

		//протоколы доменов
		if (txt.indexOf('http') > -1){
			if (categories.indexOf('Водные объекты по алфавиту') > -1) {//фиксация протоколов и доменов для ПРО:ВО
				var code = request( 'https://ru.wikipedia.org/w/index.php?title=Участник:X0stark69/ВО.js&action=raw' );

				eval(code);
			} else if (categories.indexOf('Природные географические объекты по алфавиту') > -1) {//фиксация протоколов и доменов для ПРО:Физгео
				var code = request( 'https://ru.wikipedia.org/w/index.php?title=Участник:X0stark69/Физгео.js&action=raw' );

				eval(code);
			} else if (categories.indexOf('Административные единицы по алфавиту') > -1) {//фиксация протоколов и доменов для ПРО:АТД
				var code = request( 'https://ru.wikipedia.org/w/index.php?title=Участник:X0stark69/АТД.js&action=raw' );

				eval(code);
			} else if (categories.indexOf('Антропогенные географические объекты по алфавиту') > -1) {//фиксация протоколов и доменов для ПРО:Агео
				var code = request( 'https://ru.wikipedia.org/w/index.php?title=Участник:X0stark69/Агео.js&action=raw' );

				eval(code);
			} else if (categories.indexOf('Населённые пункты по алфавиту') > -1) {//фиксация протоколов и доменов для ПРО:Города
				var code = request( 'https://ru.wikipedia.org/w/index.php?title=Участник:X0stark69/НП.js&action=raw' );

				eval(code);
			}
		}

		//чистка шаблонов-перенаправлений
		//if (typeof no_replace_redirect_for_template === 'undefined') {//персональное отключение
			if (typeof source_code_edit_article === 'undefined') {//исходный html-код страницы редактирования
				source_code_edit_article = request( 'https://ru.wikipedia.org/w/index.php?action=edit&title=' + mw.config.get('wgPageName') ).toLowerCase();
			}

			r(/{{([^\|\}\n]+)/g, function ( line, template ) {

				if ( template == 'iw' || template == 'ГКГН' || template == 'ГЕУ' || template == 'СНГОСНГ' || template == 'ИПТ' || template == 'ССГН' ) {
					return '{{' + template;//пропускать эти шаблоны-перенаправления
				}

				if ( source_code_edit_article.indexOf('class="mw-redirect" title="шаблон:' + template.toLowerCase() + '"') > -1 ) {
					xml = request( 'https://ru.wikipedia.org/w/api.php?action=query&format=xml&prop=info&redirects=1&titles=Шаблон%3A' + template );

					if (xml.indexOf('redirects') > -1) {
						var template_new = xml.match(/title=\"Шаблон\:([^\"]+)\"/)[1];

						if (template_new.length < 21 || template_new.length/2 < template.length) {//заменить если превышает не более чем вдвое или меньшей длины чем средний шаблон по ВО

							if (template[0].toLowerCase() == template[0]) {//установить исходный регистр
								template_new = template_new.substring(0, 1).toLowerCase() + template_new.substring(1);
							}

							template = template_new;
						}
					}
				}

				return '{{' + template;
			});
		//}

		r(/{{[Нн]е\s*переведено\s*[2345]?\s*\|/g, '{{iw|'); //универсальная замена на iw, выполняется после замены редиректов шаблонов

//чистка ссылок-перенаправлений
		//if (typeof no_replace_redirect_for_article === 'undefined') {//персональное отключение
			if (typeof source_code_visual_article === 'undefined') {//исходный html-код страницы просмотра
				source_code_visual_article = request( 'https://ru.wikipedia.org/wiki/' + mw.config.get('wgPageName') ).toLowerCase();
			}

			r(/\[\[([^\|\]\:]+)([\|\]])/g, function ( line, article, stop ) {//«:» от категорий
				var line_find = 'class="mw-redirect" title="' + article.toLowerCase() + '"';

				if (source_code_visual_article.indexOf(line_find) > -1) {
					xml = request( 'https://ru.wikipedia.org/w/api.php?format=xml&action=query&prop=info&redirects=1&titles=' + article );

					if (xml.indexOf('redirects') > -1 && xml.indexOf('tofragment') == -1 ) {
						article_new = xml.match(/title=\"([^\"]+)\"/)[1];

						if (article.toLowerCase() == article) {//установить исходный регистр
							article_new = article_new.substring(0, 1).toLowerCase() + article_new.substring(1);
						}

						var article = (stop == '|') ? article_new : article_new + '|' + article;
					}
				}

				return '[[' + article + stop;
			});
		//}

		//оформление
		r(/('''|>) \(устар\. ''([^']+?)''/g, '$1 (\'\'устар.\'\' $2');//исправление устар.
		r(/'''([А-яЁё \-]+) \(([А-яЁё \-]+)\)'''/g, '\'\'\'$1\'\'\' (\'\'\'$2\'\'\')');//разделение жирноты
		r(/== Фотогалерея ==/g, '== Фотографии ==');

		//избыточная викификация
		r(/\[\[11\sвек\]\]/g, 'XI век');
		r(/\[\[12\sвек\]\]/g, 'XII век');
		r(/\[\[13\sвек\]\]/g, 'XIII век');
		r(/\[\[14\sвек\]\]/g, 'XIV век');
		r(/\[\[15\sвек\]\]/g, 'XV век');
		r(/\[\[16\sвек\]\]/g, 'XVI век');
		r(/\[\[17\sвек\]\]/g, 'XVII век');
		r(/\[\[18\sвек\]\]/g, 'XVIII век');
		r(/\[\[19\sвек\]\]/g, 'XIX век');
		r(/\[\[20\sвек\]\]/g, 'XX век');
		r(/\[\[(X[XVI]+) век\|([XVI]+)\]\]/g, '$2');
		r(/\[\[([IVX]+)\sвек\]\]/g, '$1 век');
		r(/\[\[\d\d\d\d\-е\sгоды\|([^\]]+?)\]\]/g, '$1');
		r(/\[\[(\d\d\d\d\-е\sгоды)\]\]/g, '$1');
		r(/\[\[\d\d\d\d\sгод\|([^\]]+?)\]\]/g, '$1');
		r(/\[\[(\d\d\d\d\sгод)\]\]/g, '$1');
		r(/\[\[(\d\d\d\d)\]\]/g, '$1');
		r(/\[\[км\]\]/g, 'км');
		r(/\[\[км²\]\]/g, 'км²');
		r(/\[\[[Кк]илометр\|км\]\]/g, 'км');
		r(/\[\[[Кк]вадратный километр\|км²\]\]/g, 'км²');
		r(/\[\[[Мм]етр\|м\]\]/g, 'м');
		r(/\[\[(Л|л)ето\]\]/g, '$1ето');
		r(/\[\[(З|з)има\]\]/g, '$1има');
		r(/\[\[юг\]\]/g, 'юг');
		r(/\[\[север\]\]/g, 'север');
		r(/\[\[запад\]\]/g, 'запад');
		r(/\[\[восток\]\]/g, 'восток');
		r(/\[\[(Р|р)ека\]\]/g, '$1ека');
		r(/\[\[(Р|р)ека\|(Р|р)ек(е|и)\]\]/g, '$2ек$3');
		r(/\[\[залив\]\]/g, 'залив');
		r(/\[\[(Р|р)учей\]\]/g, '$1учей');
		r(/\[\[озеро\]\]/g, 'озеро');
		r(/\[\[приток\]\]/g, 'приток');
		r(/\[\[остров\]\]/g, 'остров');

		//викификация
		r(/река\sв\sРоссии/g, 'река в [[Россия|России]]');
		r(/([^\(])\[\[\:([A-z][A-z])\:(.*?)\|(.*?)\]\]/g, '$1\{\{iw|$4<!-- Заголовок статьи подставлен автоматически! Пожалуйста, проверьте корректность и удалите сообщение! -->|$4|$2|$3}}');
		r(/протекает\sв\sЧеченской\sРеспублике/g, 'протекает по [[Чечня|Чечне]]');
		r(/протекает\sв\sРеспублике\sКоми/g, 'протекает по [[Республика Коми|Республике Коми]]');
		r(/протекает\sв\sРеспублике\sТатарстан/g, 'протекает по [[Татарстан]]у');
		r(/протекает\sв\sРеспублике\sБашкортостан/g, 'протекает по [[Башкортостан]]у');
		r(/протекает\sв\sЯмало-Ненецком\sАО/g, 'протекает по [[Ямало-Ненецкий автономный округ|Ямало-Ненецкому АО]]');
		r(/протекает\sв\sХанты-Мансийском\sАО/g, 'протекает по [[Ханты-Мансийский автономный округ — Югра|Ханты-Мансийскому АО]]');
		r(/протекает\sв\s\[\[ХМАО\|Ханты-Мансийском\sАО\]\]\./g, 'протекает по [[Ханты-Мансийский автономный округ — Югра|Ханты-Мансийскому АО]]');
		r(/Устье\sреки\sнаходится\sв\s([\d]*)\sкм\sпо\s(право|лево)му\sберегу\sреки\s([А-яЁё-\s]*)\./g, 'Устье реки находится в $1 км по $2му берегу реки [[' + current_mouth + '|$3]].');
		r(/>(http.+?)< *?\/ *?ref *?>/g, '>[$1]</ref>');
		r(/ +?< *?\/ *?ref *?>/g, '</ref>');
		r(/(< *?ref[^>\/]+?>) +/g, '$1');


		//латкир
		r(/{{lang-(be|ru|uk)\|([^\}]+?)}}/g, function ( line, lang, word ) {

			word = word.replace(/I/g, 'І');
			word = word.replace(/i/g, 'і');

			return '{{lang-' + lang + '|' + word + '}}';
		});
		//r(/(([^ກ])a([а-яёўґєіїj][а-яёўґєіїj])|([А-яЁёІЎіўҐЄІЇґєії])a([а-яёўґєіїj])|([А-яЁёІЎіўҐЄІЇґєії][а-яёўґєіїj])a([^ກ]))/g, '$2$4$6a$3$5$7');//дотестировать!!!
		//в начале слова (русский, белорусский, украинский, сербский)
		r(/([\s\|\=])A([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1А$2');
		r(/([\s\|\=])a([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1а$2');
		r(/([\s\|\=])B([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1В$2');
		r(/([\s\|\=])C([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1С$2');
		r(/([\s\|\=])c([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1с$2');
		r(/([\s\|\=])E([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1Е$2');
		r(/([\s\|\=])e([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1е$2');
		r(/([\s\|\=])H([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1Н$2');
		r(/([\s\|\=])I([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1І$2');
		r(/([\s\|\=])i([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1і$2');
		r(/([\s\|\=])K([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1К$2');
		r(/([\s\|\=])k([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1к$2');
		r(/([\s\|\=])M([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1М$2');
		r(/([\s\|\=])O([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1О$2');
		r(/([\s\|\=])o([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1о$2');
		r(/([\s\|\=])p([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1р$2');
		r(/([\s\|\=])T([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1Т$2');
		r(/([\s\|\=])X([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1Х$2');
		r(/([\s\|\=])x([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1х$2');
		r(/([\s\|\=])y([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1у$2');
		r(/([\s\|\=])J([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1Ј$2');
		r(/([\s\|\=])j([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1ј$2');
		r(/([\s\|\=])Ë([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1Ё$2');
		r(/([\s\|\=])ë([а-яёѣђјљњћџ][а-яёђјљњћџ])/g, '$1ё$2');

		//в середине слова (русский, белорусский, украинский, сербский)
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])a([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1а$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])c([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1с$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])e([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1е$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])i([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1і$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])j([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1ј$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])k([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1к$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])o([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1о$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])p([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1р$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])x([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1х$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])y([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1у$2');
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])ë([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1ё$2');
		//тюркские и кавказские
		r(/([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])h([А-яЁёѢѣІіЎўҐґЄєЇїЂђЈјЉљЊњЋћЏџ])/g, '$1һ$2');
		r(/([а-яёѣіўґєїђјљњћџ])I([а-яёѣіўґєїђјљњћџ])/g, '$1ӏ$2');//палочка кавказских языков

		//кирлат
		//в начале слова (английский)
		r(/([\s\|\=])А([a-z][a-z])/g, '$1A$2');
		r(/([\s\|\=])а([a-z][a-z])/g, '$1a$2');
		r(/([\s\|\=])В([a-z][a-z])/g, '$1B$2');
		r(/([\s\|\=])Е([a-z][a-z])/g, '$1E$2');
		r(/([\s\|\=])е([a-z][a-z])/g, '$1e$2');
		r(/([\s\|\=])К([a-z][a-z])/g, '$1K$2');
		r(/([\s\|\=])М([a-z][a-z])/g, '$1M$2');
		r(/([\s\|\=])Н([a-z][a-z])/g, '$1H$2');
		r(/([\s\|\=])О([a-z][a-z])/g, '$1O$2');
		r(/([\s\|\=])о([a-z][a-z])/g, '$1o$2');
		r(/([\s\|\=])Р([a-z][a-z])/g, '$1P$2');
		r(/([\s\|\=])р([a-z][a-z])/g, '$1p$2');
		r(/([\s\|\=])С([a-z][a-z])/g, '$1C$2');
		r(/([\s\|\=])с([a-z][a-z])/g, '$1c$2');
		r(/([\s\|\=])Т([a-z][a-z])/g, '$1T$2');
		r(/([\s\|\=])Х([a-z][a-z])/g, '$1X$2');
		r(/([\s\|\=])х([a-z][a-z])/g, '$1x$2');

		r(/\[(\/\/[a-z][a-z]\.wikipedia\.org)/g, '[https:$1');

		//проблемы в шаблонах
		r(/{{([Кк]онец кол|[Кк]ол-конец|[Кк]олонки\/конец|[Dd]iv col end|[Cc]olend)}}/g, '{{колонки|конец}}'); //замена устаревших
		r(/[Пп]римечания\}\}\n\{\{/g, 'примечания}}\n\n{{');
		r(/\{\{Lang/g, '{{lang');
		r(/\{\{Ref/g, '{{ref');
		r(/\{\{ref ([a-z][a-z])/g, '{{ref-$1');
		r(/{{([A-Za-z][a-z]) icon/g, function ( line, lang ) {
			return '{{ref-' + lang.toLowerCase();
		});
		r(/\{\{lang-ua/g, '{{lang-uk');
		r(/\{\{ref-ua/g, '{{ref-uk');
		r(/\{\{lang-jp/g, '{{lang-ja');
		r(/\{\{ref-jp/g, '{{ref-ja');
		r(/\{\{lang-gr\|/g, '{{lang-el|');
		r(/\{\{ref-gr\}/g, '{{ref-el}');
		r(/\(рус(ск)?\.?\)\]/g, '{{ref-ru}}]');
		r(/\(анг(л)?\.?\)\]/g, '{{ref-en}}]');
		r(/\(фр\.?\)\]/g, '{{ref-fr}}]');
		r(/\(нем\.?\)\]/g, '{{ref-de}}]');
		r(/\(укр\.?\)\]/g, '{{ref-uk}}]');
		r(/\(исп\.?\)\]/g, '{{ref-es}}]');
		r(/\(итал\.?\)\]/g, '{{ref-it}}]');
		r(/\(порт\.\)\]/g, '{{ref-pt}}]');
		r(/\[\[[Уу]краинский язык\|укр\]\]\. \'\'([А-я-і]*)\'\'/g, '{{lang-uk|$1}}');
		r(/укр\. \'\'([А-я-і]*)\'\'/g, '{{lang-uk|$1}}');

		//шаблоны
		r(/=  +/g, '= ');//форматирование параметров
		r(/ =([^ =])/g, ' = $1');//форматирование параметров
		r(/{{ *[Вв]нешние ссылки/g, '{{внешние ссылки');
		if (txt.indexOf('{{внешние ссылки}}') > -1) {
			if (categories.indexOf('Шаблон «Внешние ссылки» пуст') > -1) { r(/\n?{{внешние ссылки}}\n?/g, ''); }
		}
		r(/{{ВТ-ЭСБЕ\+\|/g, '{{ВТ-ЭСБЕ|');
		r(/{{ГВР\+/g, '{{ГВР');
		r(/{{\s*НП-Украина/g, '{{НП-Украина');//много лишних пробелов
		r(/\{\{ГИС:ПКК[^\}]+\}\}/g, '{{ГИС|к}}');
		r(/{{Реки бассейна Белого моря от западной гр}}/g, '{{Реки бассейна Белого моря от западной границы бассейна р. Иоканга (мыс Святой Нос) до восточной границы бассейна р. Нива без р. Поной}}');
		r(/(?<!==)\n(\{\{[^\{]+?\}\})\n\n\{\{нет сносок\}\}/g, '\n{{нет сносок}}\n\n$1');//поднять «нет сносок»
		r(/\{\{ *([Cc]ite gnis|[Gg]nis)/g, '{{GNIS');
		r(/\{\{GNIS\| *id *= *(\d+) *\| *name *=([^\|\}]+)/g, '{{GNIS|$1|$2');
		r(/\{\{gNIS/g, '{{GNIS');
		r(/Данные получены при помощи картографического сервиса \[\[Яндекс\.Карты\]\]\./g, '{{ГИС|y}}');

		r(/\|место *= *\{\{N. Y.\}\}/g, '|место = N. Y.');//автоподдержка
		r(/\|место *= *\{\{К\.?\}\}/g, '|место = К.');//автоподдержка
		r(/\|место *= *\{\{[Лл]\.?\}\} *(\||\n)/g, '|место = Л. $1');//автоподдержка, учёт случаев {{Л.}}-{{М.}}
		r(/\|место *= *\{\{[Мм]\.?\}\} *(\||\n)/g, '|место = М. $1');//автоподдержка, учёт случаев {{Л.}}-{{М.}}
		r(/\|место *= *\{\{Мн\.?\}\}/g, '|место = Мн.');//автоподдержка
		r(/\|место *= *\{\{Пг\.?\}\}/g, '|место = Пг.');//автоподдержка
		r(/\|место *= *\{\{СПб\.?\}\} *(\||\n)/g, '|место = СПб. $1');//автоподдержка, учёт случаев {{СПб.}}-{{М.}}

		r(/\{\{[Rr]q\|source(s)?\}\}/g, subst + 'отсутствие источников' + substclose);
		r(/\{\{[Rr]q\|refless\}\}/g, subst + 'nr' + substclose);
		r(/\{\{[Rr]q\|style\}\}/g, subst + 'стиль статьи' + substclose);
		r(/\|stub/g, '|empty');
		r(/\|wikify/g, '');
		r(/\|stress/g, '');
		r(/\|linkless/g, '');
		if (txt.indexOf('|img') > -1)
		{
			if ((txt.indexOf('.jpg') > -1) || (txt.indexOf('.JPG') > -1))
			{
				r(/\{\{[Rr]q\|img\}\}/g, '');
				r(/\|img/g, '');
			};
		}
		r(/{{[Rr]q}}/g, '');

		if (txt.indexOf('stub}}') > -1)
		{
			if (categories.indexOf('Водные объекты по алфавиту') > -1 || categories.indexOf('Природные географические объекты по алфавиту') > -1 || categories.indexOf('Административные единицы по алфавиту') > -1 || categories.indexOf('Антропогенные географические объекты по алфавиту') > -1 || categories.indexOf('Населённые пункты по алфавиту') > -1) r(/\n{{[A-z-]*stub}}/g, '');

			if (txt.indexOf('stub}}') > -1) {
				r(/stub\}\}\n\n\{\{/g, 'stub\}\}\n\{\{');

				if (confirm('убрать stub-шаблон?')) { r(/\n?{{[^\}]+stub}}\n?/g, ''); }
			}
		};

		//ссылки
		r(/http\:\/\/web\.archive\.org/g, 'https://web.archive.org');


		//даты
		r(/date *= *(\d) (января|January|Jan)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-01-0$1');
		r(/date *= *(\d\d) (января|January|Jan)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-01-$1');
		r(/date *= *(\d) (февраля|February|Feb)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-02-0$1');
		r(/date *= *(\d\d) (февраля|February|Feb)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-02-$1');
		r(/date *= *(\d) (марта|March)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-03-0$1');
		r(/date *= *(\d\d) (марта|March)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-03-$1');
		r(/date *= *(\d) (апреля|April)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-04-0$1');
		r(/date *= *(\d\d) (апреля|April)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-04-$1');
		r(/date *= *(\d) (мая|May)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-05-0$1');
		r(/date *= *(\d\d) (мая|May)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-05-$1');
		r(/date *= *(\d) (июня|June)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-06-0$1');
		r(/date *= *(\d\d) (июня|June)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-06-$1');
		r(/date *= *(\d) (июля|July)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-07-0$1');
		r(/date *= *(\d\d) (июля|July)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-07-$1');
		r(/date *= *(\d) (августа|August)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-08-0$1');
		r(/date *= *(\d\d) (августа|August)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-08-$1');
		r(/date *= *(\d) (сентября|September|Sep)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-09-0$1');
		r(/date *= *(\d\d) (сентября|September|Sep)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-09-$1');
		r(/date *= *(\d) (октября|October|Oct)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-10-0$1');
		r(/date *= *(\d\d) (октября|October|Oct)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-10-$1');
		r(/date *= *(\d) (ноября|November|Nov)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-11-0$1');
		r(/date *= *(\d\d) (ноября|November|Nov)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-11-$1');
		r(/date *= *(\d) (декабря|December)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-12-0$1');
		r(/date *= *(\d\d) (декабря|December)(?:,){0,1} ([12][09]\d\d)/g, 'date = $3-12-$1');
		r(/date *= *(\d\d)\.(\d\d)\.([12][09]\d\d)/g, 'date = $3-$2-$1');
		r(/date *= *(\d)\.(\d\d)\.([12][09]\d\d)/g, 'date = $3-$2-0$1');


		//орфография, может ломать изображения и URL
		r(/([^\w\d][0-9]+)\.([0-9]+\s)(сантиметр|сантиметра|сантиметров|см)([^\w])/g, '$1,$2$3$4');
		r(/([^\w\d][0-9]+)\.([0-9]+\s)(метр|метра|метров|м)([^\w])/g, '$1,$2$3$4');
		r(/([^\w\d][0-9]+)\.([0-9]+\s)(километр|километра|километров|км)([^\w])/g, '$1,$2$3$4');
		r(/([^\w\d][0-9]+)\.([0-9]+\s)(дюйм|дюйма|дюймов|м|км)([^\w])/g, '$1,$2$3$4');
		r(/([0-9]+,[0-9]+\s)сантиметров([^\w])/g, '$1сантиметра$2');
		r(/([0-9]+,[0-9]+\s)метров([^\w])/g, '$1метра$2');
		r(/([0-9]+,[0-9]+\s)километров([^\w])/g, '$1километра$2');
		r(/([0-9]+,[0-9]+\s)дюймов([^\w])/g, '$1дюйма$2');
		r(/(Н|н)аселенн([^я])/g, '$1аселённ$2');
		r(/(\s[Пп])оселок/g, '$1осёлок');
		r(/(Б|б)ерет\sначало/g, '$1ерёт начало');
		r(/(П|п)ротяженность/g, '$1ротяжённость');
		r(/подбассейн\sреки\s—\sПодбассейн/g, 'подбассейн реки — подбассейн');
		r(/, речной подбассейн реки\s— [Пп]одбассейн отсутствует/g, '');


		//пунктуация, может ломать изображения и URL
		r(/°\s*[CС]([\s\.\,])/g, '°C$1');//лишние пробелы и кирлат
		r(/ ([\:\;\.\,])/g, '$1');//лишние пробелы перед знаками пунктуации
		r(/\sстр\.([0-9])/g, ' стр. $1');//добавление пробелов
		r(/\sс\.([0-9])/g, ' с. $1');//добавление пробелов
		r(/\sт\.([0-9])/g, ' т. $1');//добавление пробелов
		r(/\sвып\.([0-9])/g, ' вып. $1');//добавление пробелов
		r(/\sВып\.([0-9])/g, ' Вып. $1');//добавление пробелов
		r(/\sмлн\.([а-яё])/g, ' млн $1');//добавление пробелов
		r(/\sтыс\.([а-яё])/g, ' тыс. $1');//добавление пробелов
		r(/Оз\.Карелии/g, 'Озёра Карелии');//добавление пробелов
		//r(/ ([А-яЁё])\.([А-ЯЁ][а-яё][а-яё])/g, ' $1. $2');//добавление пробелов
		//r(/([А-яЁё])\.([А-ЯЁё][а-яё][а-яё])/g, '$1. $2');//добавление пробелов


		//стиль
		r(/В\s(\[\[)?(\d\d\d\d)(\]\])?\sг\.(\s|,)/g, 'В $2 году$4');
		r(/\sв\s(\[\[)?(\d\d\d\d)(\]\])?\sг\.( |,)([^А-ЯЁ])/g, ' в $2 году$4$5');
		r(/лощадь её водосборного/g, 'лощадь водосборного');
		r(/кв(\.)?(\s)?км/g, 'км²');
		r(/куб\.(\s)?км/g, 'км³');
		r(/\/сек([^у])/g, '/с$1');//стиль
		r(/, речной подбассейн реки отсутствует/g, '');
		r(/, подбассейн у реки отсутствует/g, '');


		//типографика, может ломать изображения и URL
		r(/<sup>2<\/sup>/g, '²');
		r(/<sup>3<\/sup>/g, '³');
		r(/км2/g, 'км²');
		r(/м2/g, 'м²');
		r(/км (²|³)/g, 'км$1');
		r(/км3/g, 'км³');
		r(/м3\/с/g, 'м³/с');
		r(/ м (²|³)/g, ' м$1');
		r(/([А-яЁё])·([А-яЁё])/g, '$1⋅$2');//замена интерпункта
		r(/(\s[А-яЁё\-]+)\.\.\./g, '$1…');//замена троеточий
		r(/­/g, '');//удаление символа переноса в словах
		r(/‐/g, '-');//замена настоящего дефиса


		//разметка кода
		r(/{{iw\|([^\|\=]+)\|3=/g, '{{iw|$1||');//добавить пустой параметр
		r(/{{iw\|([^\|\=]+)\|4=/g, '{{iw|$1||en|');//добавить пустой параметр
		r(/{{iw\|([^\|\=]+)\|([^\|\=]+)\|4=/g, '{{iw|$1|$2|en|');//добавить язык
		r(/({{iw\|[^\|]+\|[^\|]*\|)(\|[^\|\}]+?}})/g, '$1en$2');//добавить язык
		r(/{{iw\|([^\|\}]+?)}}/g, '{{iw|$1||en|$1}}');//добавить язык
		r(/\{\{Карта\|/g, '{{карта|');
		r(/(?<!=) *< *ref/g, '<ref');//лишние пробелы
		r(/\s*< *\/ *ref *>/g, '</ref>');//лишние пробелы
		r(/\}\}.<\/ref>/g, '}}</ref>');//лишние символы
		r(/\| *Исток *= *-([^ ])/g, '|Исток                   = - $1');//пробел после отключения автовикификации
		r(/(\[\[Категория:[А-яЁё:-\s\(\)\[\]]*)(\[\[Категория:Притоки\s[А-яЁё-\s\(\)]*\]\]\n)/g, '$2$1');
		r(/(\[\[Категория:[А-яЁё:-\s\(\)\[\]]*)(\[\[Категория:Бассейн\s[А-яЁё-\s\(\)]*\]\]\n)/g, '$2$1');
		r(/(\[\[Категория:[А-яЁё:-\s\(\)\[\]]*)(\[\[Категория:Реки,\sвпадающие\s[А-я-\s\(\)]*\]\]\n)/g, '$2$1');
		
		// r(/({{(?:[Дд]ругие )?значения[^}]*?}}\n)([^\']+?}})\n\'\'\'/g, '$2$1\'\'\''); // перенос ш:значения под карточку (плохо совместимо с моб.устройствами)
		// r(/({{(?:[Дд]ругие )?значения[^}]*?}}\n)([^\']+?}})\n\[\[Файл/g, '$2$1[[Файл');

		r(/(По данным \[\[Государственный водный реестр\|государственного водного реестра России\]\] относится.*)([^]+== Данные водного реестра ==[^]+)(По данным|Код объекта)/g, '$2$1\n\n$3');
		r(/По\sданным\sгеоинформационной системы водохозяйственного районирования[А-я,\s\[\|\]]*(<ref\sname=\"МПР\sРоссии\">.*<\/ref>|<ref\sname=\"ГВР\"\s*\/>):\s?\n\*\sКод\sводного([А-я—\s\d]*)\n[А-я—\s\(\)\d\n\.\*]*Выпуск\sпо\sГИ\s—\s\d\n/g, 'Код$2$1.\n');
		r(/<ref name=\"МПР России\">(\{\{cite web.+card\=([\d]+).+водный реестр( РФ)?\: ([0-9А-яЁё, \(\)\.-]+)[^<]*)/g, '<ref name=\"МПР России\">{{ГВР|$2|$4}}');
		r(/< ?ref name ?= ?(\'|\")(.+)(\'|\") ?> ?< ?\/ ?ref ?>/g, '<ref name="$2"/>');
		if (txt.indexOf('<ref name=\"МПР России\">') > -1) {
			r(/Длина\sреки\sсоставляет\s(\d*)\sкм\./g, 'Длина реки составляет $1 км<ref name=\"МПР России\"/>.');
		}
		r(/<ref>{{карта\|([A-U0-9-IVX,АБ]*)}}<\/ref>/g, '<ref name=\"$1\">{{карта|$1}}<\/ref>');
		if (txt.indexOf('<ref name=\"ГВР\">') == -1) {
			r(/<ref name\=\"МПР России\"/g, '<ref name=\"ГВР\"');
		}
		if (txt.indexOf('<ref name=\"ГВР\">') == -1) {
			r(/<ref>{{ГВР\|([\d]+)(\|[^\}]+)?}}<\/ref>/g, '<ref name=\"ГВР\">{{ГВР|$1$2}}<\/ref>');
		}
		if (txt.indexOf('<ref name=\"ГИ\">') == -1) {
			r(/<ref>(\{\{ГИ\|\d+)/g, '<ref name="ГИ">$1');
		}
//		r(/==\n\n/g, '==\n');
		r(/\n\s\}\}/g, '\n\}\}');


		//оформление ГВР
		if ((txt.replace(/{{ГВР\|\d{23}/g, '') === txt)) {//код ГВР не используется
			if (txt.split('{{ГВР|').length-1 === 1) {//шаблон ГВР только один
				if (txt.replace(/\d{23}/g, '') !== txt) {//код ГВР указан в тексте
					var code = txt.match(/(\d{23})/);

					r(/\>\{\{ГВР\|\d+\|/g, '>{{ГВР|' + code[1] + '|');
				}
				else if (typeof source_code_visual_article !== 'undefined') {//есть исходный код страницы
					if (source_code_visual_article.replace(/\d{23}/g, '') !== source_code_visual_article) {//код ГВР указан в исходнике
						var code = source_code_visual_article.match(/(\d{23})/);

						r(/\>\{\{ГВР\|\d+\|/g, '>{{ГВР|' + code[1] + '|');
					}
				}
			}
		}


		//стандартизация параметров изображений
		//r(/[^\n]\[\[Файл:/g, '\n\[\[Файл:');
		r(/\|альт=([\|\]]+)/g, '$1');//пустой
		r(/\|thumbnail/g, '|мини');
		r(/\|thumb/g, '|мини');
		r(/\|left/g, '|слева');
		r(/\|right/g, '|справа');
		r(/\|center/g, '|центр');
		r(/\n([Ii]mage|[Ии]зображение|[Ff]ile|файл)\:/g, '\nФайл:');//галереи
		r(/<gallery>/g, '<gallery class="center">');//галереи

		//удаление шаблонов и лишнего кода
		r(/ ?{{([Пп]роверено|[Vv]) *\|[^\}]+}}/g, '');
		r(/{{[Бб]олванка( +)?\|( +)?.+}}/g, '');
		r(/{{[Nn]bsp}}/g, ' ');
		r(/{{нет\s(иллюстрации|иллюстраций|изображений)}}/g, '');
		r(/{{([Ss]|[Nn]obr) *\|([^\{\}]+?)}}/g, function ( line, uns0, value )//чистка избыточного шаблона
		{
			return value.replace(/[\s]+/g, ' ');
		});
		r(/{{[Пп]римечания\|2}}/g, '{{примечания}}');//параметр отключён
		r(/<!-- *Заголовок *добавлен *ботом *-->/g, '');
		r(/<!-- *Заголовок *ссылки *сгенерирован *ботом *-->/g, '');
		r(/<!-- *Bot *generated *title *-->/g, '');
		r(/<!-- *Bot *retrieved *archive *--\>/g, '');
		r(/<!-- *Staff *writer\(s\); *no *by-line\. *--\>/g, '');
		r(/<!-- *Added *by *H3llBot *--\>/g, '');
		r(/<!---? *Смотрите в \[\[Википедия:Сноски\]\] примеры использования тэгов *<ref\> *<\/ref\> *--\>/g, '');
		r(/<!-- *DASHBot *--\>/g, '');//всегда удалять
		r(/<!-- *в км² *--\>/g, '');//всегда удалять
		r(/<!-- *в км *--\>/g, '');//всегда удалять
		r(/<!-- *в м *--\>/g, '');//всегда удалять
		r(/<!-- *\* *\(дополнительные параметры координат\) *--\>/g, '');//всегда удалять
		r(/<nowiki><\/nowiki>/g, '');
		r(/<nowiki> <\/nowiki>/g, ' ');
		r(/<nowiki>\[<\/nowiki>/g, '&#91;');
		r(/<nowiki>\]<\/nowiki>/g, '&#93;');
		r(/<nowiki>\|<\/nowiki>/g, '&#124;');
		r(/\n *\| *region.+\n/g, '\n');//всегда удалять, осталось Физгео


		//хлам, разобрать по секциям выше
		r(/\[\[([^\|\]]+)/g, function ( line, value )//чистка левых \s внутри ссылок
		{
			return '[[' + value.replace(/[\s]+/g, ' ');
		});
		r(/\[\[Речная\sсистема\]\]\sреки.*?\.\s/g, '');
		r(/== Ссылки ==\n{{[A-z-]+geo-stub}}/g, '');
		r(/{{[Чч]исло\|([\d\.]+)/g, function ( line, value ) {
			return '{{число|' + value.replace('.', ',');
		});
		r(/{{[Чч]исло\|(\d)([\d,])?([\d,])?([\d,])?\|(.*?)}}/g, '$1$2$3$4 $5');
		//r(/–/g, '-');//замена среднего тире
		r(/\{\{Sfn/g, '{{sfn');//регистр
		r(/	/g, ' ');//замена табуляций


		//преобразование координат
		//Google, Yandex, Bing, SAS-Планета, Nakarte
		r(/(\| *Координаты (истока|устья|головы)? *= *)(-?\d+([\.,]\d+)?)°?,? (-?\d+([\.,]\d+)?)°?\n/g, function ( line, param, uns2, lat, uns4, lon )
		{
			return param + lat.replace(',', '.') + '/' + lon.replace(',', '.') + '\n';
		});
		//Википедия (длинный формат)
		r(/(\| *Координаты (истока|устья|головы)? *= *)(\d+(?:\.\d+)?)[/](\d+(?:\.\d+)?)[/](\d+(?:\.\d+)?)[/]([NS])[/](\d+(?:\.\d+)?)[/](\d+(?:\.\d+)?)[/](\d+(?:\.\d+)?)[/]([EW])/g, function ( uns, line, uns1, lat1, lat2, lat3, lat4, lon1, lon2, lon3, lon4 )
		{
			var lat = ( +parseFloat( (Number(lat1)*3600+Number(lat2)*60+Number(lat3))/3600 ).toFixed( 4 ));
			var lon = ( +parseFloat( (Number(lon1)*3600+Number(lon2)*60+Number(lon3))/3600 ).toFixed( 4 ));

			if (lat4 == 'S') lat = lat*-1;
			if (lon4 == 'W') lon = lon*-1;

			return line + lat + '/' + lon;
		});
		r(/(\| *Координаты (истока|устья|головы)? *= *)(\d+(?:\.\d+)?)[/](\d+(?:\.\d+)?)[/]([NS])[/](\d+(?:\.\d+)?)[/](\d+(?:\.\d+)?)[/]([EW])/g, function ( uns, line, uns1, lat1, lat2, lat3, lon1, lon2, lon3 )
		{
			var lat = ( +parseFloat( (Number(lat1)*3600+Number(lat2)*60)/3600 ).toFixed( 4 ));
			var lon = ( +parseFloat( (Number(lon1)*3600+Number(lon2)*60)/3600 ).toFixed( 4 ));

			if (lat3 == 'S') lat = lat*-1;
			if (lon3 == 'W') lon = lon*-1;

			return line + lat + '/' + lon;
		});
		r(/(\| *Координаты (истока|устья|головы)? *= *)(\d+(?:\.\d+)?)[/]([NS])[/](\d+(?:\.\d+)?)[/]([EW])/g, function ( uns, line, uns1, lat1, lat2, lon1, lon2 )
		{
			var lat = ( +parseFloat( Number(lat1) ).toFixed( 4 ));
			var lon = ( +parseFloat( Number(lon1) ).toFixed( 4 ));

			if (lat2 == 'S') lat = lat*-1;
			if (lon2 == 'W') lon = lon*-1;

			return line + lat + '/' + lon;
		});
		r(/(\| *Координаты (истока|устья|головы)? *= *)(-?\d+(?:\.\d+)?)[/](-?\d+(?:\.\d+)?)\n/g, function ( uns, line, uns1, lat, lon )
		{
			return line + +parseFloat( Number(lat) ).toFixed( 4 ) + '/' + +parseFloat( Number(lon) ).toFixed( 4 ) + '\n';
		});

		//карточка реки
		if (txt.indexOf('зона\/Вставка') == -1 && txt.indexOf('{{ЮНЕСКО') == -1) {
			r(/\n *\| *Название *= */g, '\n |Название                = ');
		}
		r(/\n *\| *Национальное название *= */g, '\n  |Национальное название  = ');
		r(/\n *\| *Изображение *= */g, '\n |Изображение             = ');
		r(/\n *\| *Подпись изображения *= */g, '\n  |Подпись изображения    = ');
		r(/\n *\| *Длина *= */g, '\n |Длина                   = ');
		r(/\n *\| *Площадь (бассейна|водосбора) *= */g, '\n |Площадь водосбора       = ');
		r(/\n *\| *Бассейн *= */g, '\n |Бассейн                 = ');
		r(/\n *\| *Расход воды *= */g, '\n |Расход воды             = ');
		r(/\n *\| *Место измерения *= */g, '\n  |Место измерения        = ');
		r(/\n *\| *Исток *= */g, '\n |Исток                   = ');
		r(/\n *\| *Местоположение истока *= */g, '\n  |Местоположение истока  = ');
		r(/\n *\| *Высота истока *= */g, '\n  |Высота истока          = ');
		r(/\n *\| *Координаты истока *= */g, '\n  |Координаты истока      = ');
		r(/\n *\| *Устье *= */g, '\n |Устье                   = ');
		r(/\n *\| *Местоположение устья *= */g, '\n  |Местоположение устья   = ');
		r(/\n *\| *Высота устья *= */g, '\n  |Высота устья           = ');
		r(/\n *\| *Координаты устья *= */g, '\n  |Координаты устья       = ');
		r(/\n *\| *Уклон реки *= */g, '\n |Уклон реки              = ');
		r(/\n *\| *Страна *= */g, '\n |Страна                  = ');
		if (txt.indexOf('{{ЮНЕСКО') == -1) {
			r(/\n *\| *Регион *= */g, '\n  |Регион                 = ');
		}
		r(/\n *\| *Район *= */g, '\n   |Район                 = ');
		r(/\n *\| *Позиционная карта *= */g, '\n |Позиционная карта       = ');
		r(/\n *\| *Позиционная карта 1 *= */g, '\n |Позиционная карта 1     = ');
		r(/\n *\| *Тип вывода для ПК *= *1([1-4])/g, '\n  |Тип вывода меток       = справа\/$1');
		r(/\n *\| *Тип вывода для ПК *= *2([1-4])/g, '\n  |Тип вывода меток       = слева\/$1');
		r(/\n *\| *Тип вывода для ПК *= *3([1-4])/g, '\n  |Тип вывода меток       = сверху\/$1');
		r(/\n *\| *Тип вывода для ПК *= *4([1-4])/g, '\n  |Тип вывода меток       = снизу\/$1');
		r(/\n *\| *Тип вывода меток *= *(справа|слева|сверху|снизу)\/1/g, '\n  |Тип вывода меток       = $1\/справа');
		r(/\n *\| *Тип вывода меток *= *(справа|слева|сверху|снизу)\/2/g, '\n  |Тип вывода меток       = $1\/слева');
		r(/\n *\| *Тип вывода меток *= *(справа|слева|сверху|снизу)\/3/g, '\n  |Тип вывода меток       = $1\/сверху');
		r(/\n *\| *Тип вывода меток *= *(справа|слева|сверху|снизу)\/4/g, '\n  |Тип вывода меток       = $1\/снизу');

		r(/\n *\| *Позиционная карта *= 0/g, '\n |Позиционная карта       = -');
		r(/\n *\| *Позиционная карта 1 *= 0/g, '\n |Позиционная карта 1     = -');

		r(/\n *\| *Страна *= *Беларусь/g, '\n |Страна                  = Белоруссия');
		r(/\n *\| *Страна *= *(КНР|Китайская Народная Республика)/g, '\n |Страна                  = Китай');
		r(/\n *\| *Страна *= *США/g, '\n |Страна                  = Соединённые Штаты Америки');
		r(/\n *\| *Страна *= *ЮАР/g, '\n |Страна                  = Южно-Африканская Республика');

		r(/\n *\| *Устье *= *река\s\[\[([А-яЁё-]*)\]\]/g, '\n |Устье                   = $1');
		r(/\n *\| *Регион *= *Республика\sСеверная\sОсетия-Алания/g, '\n  |Регион                 = Северная Осетия');
		r(/\n *\| *Регион *= *Республика\sУдмуртия/g, '\n  |Регион                 = Удмуртия');
		r(/\n *\| *Регион *= *Чувашская\sРеспублика/g, '\n  |Регион                 = Чувашия');
		r(/\n *\| *Регион *= *Чеченская\sРеспублика/g, '\n  |Регион                 = Чечня');
		r(/\n *\| *Регион *= *Республика\sТатарстан/g, '\n  |Регион                 = Татарстан');
		r(/\n *\| *Регион *= *Республика\sМарий Эл/g, '\n  |Регион                 = Марий Эл');
		r(/\n *\| *Регион *= *Камчатская\sобласть/g, '\n  |Регион                 = Камчатский край');
		r(/\n *\| *Регион *= *Ненецкий\sАО/g, '\n  |Регион                 = Ненецкий автономный округ');
		r(/\n *\| *Регион *= *Тува/g, '\n  |Регион                 = Тыва');
		r(/\n *\| *Регион *= *Карелия/g, '\n  |Регион                 = Республика Карелия');
		r(/\n *\| *Регион *= *Республика\sБашкортостан/g, '\n  |Регион                 = Башкортостан');
		r(/\n *\| *Регион *= *Кабардино-Балкарская\sРеспублика/g, '\n  |Регион                 = Кабардино-Балкария');
		r(/(\n\s*\|\s*Позиционная\sкарта\s*=.*)(\n\s*\|\s*Район\s*=.*)\n/g, '$2$1\n');

		//карточка озера
		if (txt.indexOf('Подпись изображения') == -1 && txt.indexOf('Врезка') == -1) {
			r(/\n *\| *Подпись *= */g, '\n  |Подпись изображения    = ');
		}
		r(/\n *\| *Координаты *= */g, '\n |Координаты              = ');
		r(/\n *\| *CoordScale *= */g, '\n  |CoordScale             = ');
		r(/\n *\| *Страны *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Районы *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Страны *= */g, '\n |Страна                  = ');
		r(/\n *\| *Регионы *= */g, '\n  |Регион                 = ');
		r(/\n *\| *Районы *= */g, '\n   |Район                 = ');
		r(/\n *\| *Высота над уровнем моря *= */g, '\n |Высота над уровнем моря = ');
		r(/\n *\| *Ширина *= */g, '\n |Ширина                  = ');
		if (txt.indexOf('зона\/Вставка') == -1) {
			r(/\n *\| *Площадь *= */g, '\n |Площадь                 = ');
		}
		r(/\n *\| *Объём *= */g, '\n |Объём                   = ');
		r(/\n *\| *Длина береговой линии *= */g, '\n |Длина береговой линии   = ');
		r(/\n *\| *Наибольшая глубина *= */g, '\n |Наибольшая глубина      = ');
		r(/\n *\| *Средняя глубина *= */g, '\n  |Средняя глубина        = ');
		r(/\n *\| *Тип минерализации *= */g, '\n |Тип минерализации       = ');
		r(/\n *\| *Солёность *= */g, '\n  |Солёность              = ');
		r(/\n *\| *Прозрачность *= */g, '\n |Прозрачность            = ');
		r(/\n *\| *Площадь водосбора *= */g, '\n |Площадь водосбора       = ');
		r(/\n *\| *Впадающие реки *= */g, '\n  |Впадающие реки         = ');
		r(/\n *\| *Вытекающие реки *= */g, '\n  |Вытекающие реки        = ');

		//карточка водохранилища
		r(/\n *\| *Впадающие водотоки *= */g, '\n |Впадающие водотоки      = ');
		r(/\n *\| *Вытекающие водотоки *= */g, '\n |Вытекающие водотоки     = ');
		r(/\n *\| *Год наполнения *= */g, '\n |Год наполнения          = ');
		r(/\n *\| *Высота плотины *= */g, '\n |Высота плотины          = ');

		//карточка канала
		r(/\n *\| *Голова *= */g, '\n |Голова                  = ');
		r(/\n *\| *Местоположение головы *= */g, '\n  |Местоположение головы  = ');
		r(/\n *\| *Высота головы *= */g, '\n  |Высота головы          = ');
		r(/\n *\| *Координаты головы *= */g, '\n  |Координаты головы      = ');
		r(/\n *\| *Уклон канала *= */g, '\n |Уклон канала            = ');

		//карточка водопада
		r(/\n *\| *Река *= */g, '\n |Река                    = ');
		r(/\n *\| *Высота *= */g, '\n |Высота                  = ');
		r(/\n *\| *Расход *= */g, '\n |Расход                  = ');

		//карточка ледника
		if (txt.indexOf('{{Ледник') > -1)
		{
			r(/\n *\| *Тип ледника *= */g, '\n |Тип ледника             = ');
			r(/\n *\| *Толщина *= */g, '\n |Толщина                 = ');
			r(/\n *\| *Состояние ледника *= */g, '\n |Состояние ледника       = ');
		};

		//карточка залива
		r(/\n *\| *Примечания *=.*/g, '');
		r(/\n *\| *Тип\sзалива *= */g, '\n |Тип залива              = ');
		r(/\n *\| *Вышестоящая\sакватория *= */g, '\n |Вышестоящая акватория   = ');
		r(/\n *\| *Средняя\sвеличина\sприлива *= */g, '\n |Средняя величина прилива= ');

		//карточка пролива
		r(/\n *\| *Крайний мыс *= */g, '\n |Крайние мысы            = ');
		r(/\n *\| *Крайний мыс 1 *= *\n/g, '\n');//удалять если не заполнена

		//Общие параметры
		r(/\n *\| *НП *=.*/g, '');
		r(/\n *\| *Остров *=.*/g, '');
		r(/\n *\| *Расположение *=.*/g, '');
		r(/\n *\| *s_no *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Позиционная\sкарта *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Позиционная\sкарта\s1 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Позиционная\sкарта\s2 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Категория на Викискладе *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Карта *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *Подпись\sкарты *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *CoordScale *= *\n/g, '\n');//удалять если не заполнена
		if (txt.indexOf('{{Море') == -1)
		{
			if (txt.indexOf('Регион') == -1)
			{
				r(/\n *\| *Страна *= (.*?)\n/g, '\n |Страна                  = $1\n  |Регион                 = \n');
			}

			if (txt.indexOf('Район') == -1 && txt.indexOf('{{ЮНЕСКО') == -1)
			{
				r(/\n *\| *Регион *= (.*?)\n/g, '\n  |Регион                 = $1\n   |Район                 = \n');
			}
		}
		r(/\n *\| *Примечания *=.*/g, '');

		//Карточка поселения
		r(/\n *\| *карта страны *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *карта региона *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *карта района *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *карта страны *= *<!-- альтернативная, но с такими же координатами краёв -->/g, '');
		r(/\n *\| *карта региона *= *<!-- альтернативная, но с такими же координатами краёв -->/g, '');
		r(/\n *\| *карта района *= *<!-- альтернативная, но с такими же координатами краёв -->/g, '');
		r(/\n *\| *язык сайта 2 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *язык сайта 3 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *язык сайта 4 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *язык сайта 5 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *add1n *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *add1 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *add2n *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *add2 *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *add3n *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *add3 *= *\n/g, '\n');//удалять если не заполнена

		//карточки гор
		r(/\n *\| *Хребет или массив *= */g, '\n  |Хребет или массив      = ');

		//карточка парка
		if (txt.indexOf('{{Парк') > -1 && txt.indexOf('{{Заповед') == -1)
		{
			r(/\n *\| *Тип *= */g, '\n |Тип парка               = ');
		};

		//удаление iw из издательств
		r(/\|(издательство|издание) *= *\{\{iw\|([^\|\}\(]+)[^\}]*\}\}/g, '|$1 = $2');

		//удаление archive.org из параметра страницы
		r(/\|(pages|страницы) *= *\[https:\/\/archive\.org[^ ]+ ([\d–—,-]+)\]/g, '|$1 = $2');

		//удаление google.books в wayback
		r(/ {{[Ww]ayback\|url=https:\/\/books\.google[^}]+?}}/g, '');

		//базовое оформление ссылок
		r(/{{(Недоступная ссылка)/g, '{{недоступная ссылка');
		r(/{{Wayback/g, '{{wayback');
		r(/{{([Ww]ebarchive|Архивировано)/g, '{{архивировано');
		var pos = 0;//подсчёт неоформленных ссылок
		for (var links = -1; pos != -1; links++) { pos = txt.indexOf('[http', pos+1); }
		r(/\[(http(s)?\:\/\/([^\/]+\.([0-9a-z]+))(\/[^ ^\]]+)?)( ([^\]]+))?\](\{\{ref\-([a-z]+)\}\})?([\s]*\{\{(недоступная ссылка|wayback|архивировано)[^}]*?}})?/g, function ( uns0, url, uns2, website, domain, uns5, uns6, title, uns8, reflang, dead, funcdead )
		{
			var lang = '';
			var accessdate = linetime;

			if (replace_all_link > 0 )//участник сделал выбор
			{
				if ( replace_all_link == 2 )//участник отказался
				{
					return uns0;
				}
			}
			else if (confirm('В статье обнаружены неоформленные ссылки: ' + links + ' шт. Оформить все через cite web?')) {
				replace_all_link = 1;
			}
			else {
				replace_all_link = 2;
				return uns0;
			}

			if (typeof reflang !== 'undefined') {
				lang = reflang;
			}
			else if (url.match(/\/ru\//g) !== null || url.match(/\/ru$/g) !== null)//если в url /ru/ или /ru$, ставить русский
			{
				lang = 'ru';
			}
			else if (url.match(/\/uk\//g) !== null || url.match(/\/uk$/g) !== null)//~
			{
				lang = 'uk';
			}
			else if (url.match(/\/en\//g) !== null || url.match(/\/en$/g) !== null)//~
			{
				lang = 'en';
			}
			else if (url.match(/\/de\//g) !== null || url.match(/\/de$/g) !== null)//~
			{
				lang = 'de';
			}
			else if (url.match(/\/fr\//g) !== null || url.match(/\/fr$/g) !== null)//~
			{
				lang = 'fr';
			}
			else if (url.match(/\/it\//g) !== null || url.match(/\/it$/g) !== null)//~
			{
				lang = 'it';
			}
			else if (url.match(/\/es\//g) !== null || url.match(/\/es$/g) !== null)//~
			{
				lang = 'es';
			}
			else if (url.match(/\/pl\//g) !== null || url.match(/\/pl$/g) !== null)//~
			{
				lang = 'pl';
			}
			else if (url.match(/\/bg\//g) !== null || url.match(/\/bg$/g) !== null)//~
			{
				lang = 'bg';
			}
			else if ((domain == 'de') || (domain == 'ru') || (domain == 'fr') || (domain == 'pl') || (domain == 'es') || (domain == 'it') || (domain == 'bg')) {
				lang = domain;
			}
			else if (domain == 'cz') {
				lang = 'cs';
			}
			else if (domain == 'ua' && typeof title !== 'undefined') {
				if (title.match(/[ҐґЄєІіЇї]/g) === null) {
					lang = 'ru';
				}
				else {
					lang = 'uk';
				}
			}
			else if (domain == 'rs') {
				lang = 'sr';
			}

			if (typeof title === 'undefined') {//предупреждение для ссылок без описаний
				title = '';

				alert('Внимание! У ссылки ' + url + ' не заполнено описание! Обязательно впишите его в параметр title. См. ошибку в предварительном просмотре.');
			}
			else
			{
				title = title.replace(/{{ref-[a-z][a-z]}}/g, '');//мусор в title
				title = title.replace(/\[/g, '&#91;');//спецсимвол в мнемонику
				title = title.replace(/\|/g, '&#124;');//спецсимвол в мнемонику
			}

			if (typeof dead === 'undefined')
			{
				deadparam = ' |deadlink = no';
			}
			else//не вписывать дату доступа, если ссылка мертва
			{
				accessdate = '';
				archivedate = '';

				if (funcdead == 'недоступная ссылка')
				{
					dead.replace(/(http[^}\| ]+)?.+(\d\d\d\d\-\d\d\-\d\d)?/g, function ( line, url, archivedate )
					{
						if (typeof url === 'undefined') { var url = ''; }
						if (typeof archivedate === 'undefined') { var archivedate = ''; }

						deadparam = ' |archive-url = ' + url + ' |archive-date = ' + archivedate + ' ';

						accessdate = archivedate;
						deadparam = deadparam + ' |deadlink = yes';

						return line;
					});
				}
				else if (funcdead == 'wayback')
				{
					dead.replace(/(http[^}\| ]+).+(([\d]{4})([\d]{2})([\d]{2})[\d]{6})/g, function ( line, url, datetime, year, month, day )
					{
						deadparam = ' |archive-url = ' + 'https://web.archive.org/web/' + datetime + '/' + url + ' |archive-date = ' + year + '-' + month + '-' + day + ' ';

						accessdate = year + '-' + month + '-' + day;//дата архива как дата доступа
						deadparam = deadparam + ' |deadlink = ';

						return line;
					});
				}
				else if (funcdead == 'архивировано')
				{
					dead.replace(/(http[^}\| ]+).+(\d\d\d\d\-\d\d\-\d\d)/g, function ( line, url, archivedate )
					{
						if (typeof url === 'undefined') { var url = ''; }
						if (typeof archivedate === 'undefined') { var archivedate = ''; }

						deadparam = ' |archive-url = ' + url + ' |archive-date = ' + archivedate;

						accessdate = archivedate;//дата архива как дата доступа
						deadparam = deadparam + ' |deadlink = ';

						return line;
					});
				}
			}

			url = url.replace(/\|/g, '%7C');//спецсимвол в мнемонику
			url = url.replace(/\{/g, '%7B');//спецсимвол в мнемонику
			url = url.replace(/\}/g, '%7D');//спецсимвол в мнемонику

			var line = '{{cite web|author = |url = ' + url + ' |title = ' + title + ' |lang = ' + lang + ' |website = ' + website + ' |date = |access-date = ' + accessdate + deadparam + '}}';
			return line;
		});
		if ( replace_all_link == 1 )//участник сделал выбор о замене
		{
			r(/ *на *сайте *\'\'[a-z\.\-]+\'\', *[0-9]+ *[а-я]+ *[0-9]+(<|\n)/g, '$1');
			r(/ *на *сайте *\'\'[a-z\.\-]+(\'\')?(<|\n)/g, '$2');
		}

		//упаковка wayback
		r(/}}\s*{{wayback\|url=(http[^}\| ]+).+?(([\d]{4})([\d]{2})([\d]{2})[\d]{6})\s*}}/g, function ( line, url, datetime, year, month, day )
		{
			deadparam = ' |archive-url = ' + 'https://web.archive.org/web/' + datetime + '/' + url + ' |archive-date = ' + year + '-' + month + '-' + day + ' }}';

			return deadparam;
		});


		//форматирование шаблонов АИ
		r(/\[(http[^\]]+?)\[\[([^\|\]]+?\|)?([^\]]+?)\]\]/g, '[$1$3');//ликвидация викификации внутри ссылок
		r(/\[(http(s)?:\/\/web\.archive\.org\/web\/([\d][\d][\d][\d])([\d][\d])([\d][\d])[\d]+\/(http(s)?:[^\] ]+))([^\]]+)?\]/g, '{{cite web|author = |url=$6|deadlink = |title=$8|lang = |archive-url=$1|archive-date=$3-$4-$5}}');//разворачивание web.archive.org
		r(/\[(http(s)?:\/\/www\.webcitation\.org\/[^\?]+\?url=(http(s)?:[^\] ]+))([^\]]+)?\]/g, '{{cite web|author = |url=$3|deadlink = |title=$5|lang = |archive-url=$1|archive-date=}}');//разворачивание www.webcitation.org
		r(/\[(http(s)?:\/\/archive\.(is|li|md|today)\/([\d][\d][\d][\d])([\d][\d])([\d][\d])[\d]+\/([^\] ]+))([^\]]+)?\]/g, '{{cite web|author = |url=$7|deadlink = |title=$8|lang = |archive-url=$1|archive-date=$4-$5-$6}}');//разворачивание archive.(is|li|md|today)
		r(/\[(http(s)?:\/\/archive\.(is|li|md|todai)\/[A-Za-z0-9]+) ([^\]]+?)\]/g, '{{cite web|author = |url=|deadlink = |title=$4|lang = |archive-url=$1|archive-date=}}');//разворачивание archive.(is|li|md|today)
		r(/{{[Ii]nternetquelle/g, '{{cite web');//ликвидация internetquelle
		r(/{{[Cc]ite magazine/g, '{{cite journal');//ликвидация cite magazine
		r(/{{[Cc]ite[\s]+news([^\}]*?\| *url *= *http[^\}]+?}})/g, '{{cite web$1');//ликвидация cite news
		r(/{{[Cc]ite[\s]+web/g, '{{cite web');
		r(/{{[Cc]ite[\s]+web[\s]+2/g, '{{cite web');
		r(/ *= *\?\?\?/g, ' = ');
		r(/\| *тираж *= *([0-9]+)(&nbsp;|\s)([0-9]+)/g, '|тираж = $1$3');
		r(/(title|publisher) *=(.+?)(\||[^!]\}\})/g, function ( line, title, out )//чистка избыточного шаблона в title
		{
			return line.replace(/{{!}}/g, '&#124;');
		});
		r(/\| *language *=/g, '|lang =');
		r(/\| *lang *= *([a-z][a-z])\-[A-Za-z][A-Za-z]/g, '|lang = $1');//чистка региона из языка
		r(/\| *lang *= *arm/g, '|lang = hy');
		r(/\| *lang *= *by/g, '|lang = be');
		r(/\| *lang *= *ua/g, '|lang = uk');
		r(/\| *lang *= *jp/g, '|lang = ja');
		r(/\| *lang *= *gr/g, '|lang = el');
		r(/\| *lang *= *cn/g, '|lang = zh');
		r(/\| *lang *= *English/g, '|lang = en');
		r(/\| *lang *= *German/g, '|lang = de');
		r(/\| *lang *= *French/g, '|lang = fr');
		r(/\| *lang *= *Spanish/g, '|lang = es');
		r(/\| *lang *= *Dutch/g, '|lang = nl');
		r(/\| *lang *= *Japanese/g, '|lang = ja');
		r(/({{cite web([^\}]+?))}}{{недоступная ссылка[^\}]+?}}/g, '$1|deadlink = yes}}');

		//распил архивных ссылок в Cite web
		r(/{{[Cc]ite web[^\}]*?\| *url *= *(http(s)?:\/\/web\.archive\.org\/web\/([\d][\d][\d][\d])([\d][\d])([\d][\d])[\d]+\/(http(s)?:[^ \|\}]+))[^\}]*?}}/g, function ( line, archive_url, und0, year, month, day, url ) {
			line = line.replace(/\| *deadlink *= *no/g, '|deadlink = yes');

			line = line.replace(/\| *url *=/g, '|url = ' + url + ' |archive-date = ' + year + '-' + month + '-' + day + ' |archive-url = ');

			if (line.indexOf('deadlink') == -1)
			{
				line = line.replace(/}}/g, '|deadlink = yes}}');
			};

			return line;
		});

		//форматирование шаблона Cite web
		r(/{{[Cc]ite web[^\}]+?}}/g, function ( line ) {//для сработки нужны замены выше
			line = line.replace(/\|[\s]+/g, '|');//для упрощения регулярок ниже

			//internetquelle
			line = line.replace(/\|autor *=/g, '|author =');
			line = line.replace(/\|titel *=/g, '|title =');
			line = line.replace(/\|hrsg *=/g, '|website =');
			line = line.replace(/\|offline *=/g, '|deadlink =');
			line = line.replace(/\|deadurl *=/g, '|deadlink =');
			line = line.replace(/\|zugriff *=/g, '|access-date =');
			line = line.replace(/\|zugriff-jahr *=/g, '|access-date =');
			line = line.replace(/\|archiv-datum *=/g, '|archive-date =');
			line = line.replace(/\|datum-jahr *=/g, '|year =');
			line = line.replace(/\|datum-monat *=/g, '|month =');
			line = line.replace(/\|datum-tag *=/g, '|day =');
			line = line.replace(/\|datum *=/g, '|date =');
			line = line.replace(/\|sprache *=/g, '|lang =');
			line = line.replace(/\|seiten *=/g, '|pages =');
			line = line.replace(/\|zitat *=/g, '|quote =');

			//cite web
			line = line.replace(/([А-ЯЁ]\.)([А-ЯЁ]\.)/g, '$1 $2');//неразрывный пробел в инициалах
			line = line.replace(/\|author *=\s*([А-ЯЁ]\.\s[А-ЯЁ]\.)\s([А-ЯЁ][а-яё]+)/g, '|author = $2 $1');//инициалы в конец, 1-й автор
			for (var i = 0; i < 15; i++) {
				line = line.replace(/\|author *=([^\|\}]+?)\s([А-ЯЁ]\.\s[А-ЯЁ]\.)\s([А-ЯЁ][а-яё]+)/g, '|author =$1 $3 $2');
			}

			line = line.replace(/\|work *=/g, '|website =');
//			line = line.replace(/\|language *=/g, '|lang =');
			line = line.replace(/\|datepublished *=/g, '|date =');
			line = line.replace(/\|deadlink *= *(\}|\|)/g, '|deadlink=no$1');
			line = line.replace(/\|deadlink *= *1 *\|/g, '|deadlink = yes |');
			line = line.replace(/\|deadlink *= *(403|404|project-closed|unknown-host|indeed|circular|да|unfit)/g, '|deadlink = yes');
			line = line.replace(/\|deadurl *= *yes/g, '');
			line = line.replace(/\|description *= *([\n\|\}])/g, '$1');//убрать пустые description
			line = line.replace(/\|authorlink *= *([\n\|\}])/g, '$1');//убрать пустые authorlink
			line = line.replace(/\|coauthors *= *([\n\|\}])/g, '$1');//убрать пустые coauthors
			line = line.replace(/\|format *= *([\n\|\}])/g, '$1');//убрать пустые format
			line = line.replace(/\|title *= *(Архивированная копия|Archived copy|Wayback Machine|\{title\}|アーカイブされたコピー)/g, '|title =');//очистить title
			line = line.replace(/\|website *= *web\.archive\.org/g, '|website = ');//очистить website

			line = line.replace(/\|newspaper *=/g, '|publisher =');//нет в ru.wiki
			line = line.replace(/\|publisher *= *web\.archive\.org/g, '|publisher = ');//очистить publisher

			line = line.replace(/\|website *= *http(s)?\:\/\/([^\/ \|\}]+)[^\|\} ]*/g, '|website = $2');//убрать лишние ссылки

			line = line.replace(/\|url\-status *= *live/g, '|deadlink = no');//нет в ru.wiki
			line = line.replace(/\|url\-status *= *dead/g, '|deadlink = yes');//нет в ru.wiki
			line = line.replace(/\|url\-status *= *unfit/g, '|deadlink = yes');//нет в ru.wiki
			line = line.replace(/\|url\-status *= *usurped/g, '|deadlink = yes');//нет в ru.wiki

			line = line.replace(/\|accessdate/g, '|access-date');
			line = line.replace(/\|archiveurl/g, '|archive-url');
			line = line.replace(/\|archivedate/g, '|archive-date');

			line = line.replace(/\|date *= *[Jj]anuary\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-01-$1');
			line = line.replace(/\|date *= *[Ff]ebruary\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-02-$1');
			line = line.replace(/\|date *= *[Mm]arch\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-03-$1');
			line = line.replace(/\|date *= *[Aa]pril\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-04-$1');
			line = line.replace(/\|date *= *[Mm]ay\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-05-$1');
			line = line.replace(/\|date *= *[Jj]une\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-06-$1');
			line = line.replace(/\|date *= *[Jj]uly\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-07-$1');
			line = line.replace(/\|date *= *[Aa]ugust\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-08-$1');
			line = line.replace(/\|date *= *[Ss]eptember\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-09-$1');
			line = line.replace(/\|date *= *[Oo]ctober\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-10-$1');
			line = line.replace(/\|date *= *[Nn]ovember\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-11-$1');
			line = line.replace(/\|date *= *[Dd]ecember\s([\d]+),\s([\d][\d][\d][\d])/g, '|date = $2-12-$1');

			//удалить умершие архивы webcitation.org, youtube, loadmap
			if (line.indexOf( 'webcitation.org' ) != -1 ||
				line.indexOf( 'www.youtube.com' ) != -1 ||
				line.indexOf( 'loadmap.net' ) != -1 )
			{
				line = line.replace(/\|archive\-url *= *[^\|\}]+/g, '|archive-url = ');
				line = line.replace(/\|archive\-date *= *[^\|\}]+/g, '|archive-date = ');
			}

			//вставить недостающие параметры
			if ( line.indexOf( '|author' ) === -1 ) {
				line = line.replace(/({{[Cc]ite web *)/g, '$1|author = ');
			}

			if ( line.indexOf( '|lang' ) === -1 ) {
				line = line.replace(/(\|author *=[^\n\|\}]*)([\n\|\}])/g, '$1|lang = $2');
			}
			line = line.replace(/(\|author *= \[\[[^\|]*)(\|lang = [a-z]* *)/g, '$2$1');//поправка на случай викифицированного автора

			if ( line.indexOf( '|deadlink' ) === -1 ) {
				line = line.replace(/(\|url *=[^\n\|\}]*)([\n\|\}])/g, '$1|deadlink = no $2');
			}

			if ( line.indexOf( '|archive-url' ) === -1 ) {
				line = line.replace(/(\|deadlink *=[^\n\|\}]*)([\n\|\}])/g, '$1|archive-url = $2');
			}

			if ( line.indexOf( '|archive-date' ) === -1 ) {
				line = line.replace(/(\|archive-url *=[^\n\|\}]*)([\n\|\}])/g, '$1|archive-date = $2');
			}

			var label = line.match(/\|title *= *([^\|\n\}]+)/);
			var link = line.match(/\|url *= *([^\|\n\}\?\=]+)/);

			if (label !== null && label[1].trim() !== '') {
				if (line.replace(/\|lang *= *[\|\}\n]/g, '') != line) {

					label = label[1].trim();
					link = link[1].trim();
					var label_r = label.replace(/[,\:\;\.\…\!\?\"\'’«»\№\#\&\%\s\-\–\—\(\)\{\}\[\]\|\/\\0-9IVX]/g, '');//убрать пунктуацию и цифры

					if (label_r.replace(/[A-Za-z]/g, '') === '') {
						if (confirm('В статье обнаружена веб-ссылка без указанного языка:\n' + label + '.\n' + link + '\nДобавить английский?')) {
							line = line.replace(/(\|lang *= *)/g, '$1en ');
						}
					}
					else if (label_r.replace(/[A-ZÄÖẞÜa-zäößü]/g, '') === '') {
						if (confirm('В статье обнаружена веб-ссылка без указанного языка:\n' + label + '.\n' + link + '\nДобавить немецкий?')) {
							line = line.replace(/(\|lang *= *)/g, '$1de ');
						}
					}
					else if (label_r.replace(/[A-ZÁÉÍÑÓÚÜa-záéíñóúü¿]/g, '') === '') {
						if (confirm('В статье обнаружена веб-ссылка без указанного языка:\n' + label + '.\n' + link + '\nДобавить испанский?')) {
							line = line.replace(/(\|lang *= *)/g, '$1es ');
						}
					}
					else if (label_r.replace(/[А-яЁё№]/g, '') === '') {
						if (confirm('В статье обнаружена веб-ссылка без указанного языка:\n' + label + '.\n' + link + '\nДобавить русский?')) {
							line = line.replace(/(\|lang *= *)/g, '$1ru ');
						}
					}
					else if (label_r.replace(/[А-ЩЬЮЯҐЄІЇа-щьюяґєії№]/g, '') === '') {
						if (confirm('В статье обнаружена веб-ссылка без указанного языка:\n' + label + '.\n' + link + '\nДобавить украинский?')) {
							line = line.replace(/(\|lang *= *)/g, '$1uk ');
						}
					}
					else if (label_r.replace(/[А-ЗК-ШЫ-ЯЁІЎа-зк-шы-яёіў№]/g, '') === '') {
						if (confirm('В статье обнаружена веб-ссылка без указанного языка:\n' + label + '.\n' + link + '\nДобавить белорусский?')) {
							line = line.replace(/(\|lang *= *)/g, '$1be ');
						}
					}
				}
			}

			//декодирование ссылок
			if ( ( line.indexOf( '%D' ) !== -1 || line.indexOf( '%d' ) !== -1 ) && line.indexOf( '%25' ) === -1 ) {

			//	if (confirm('Раскодировать ссылки в шаблоне Cite web? ' + line))
			//	{
					archive_url = line.match(/\|archive-url *= *([^ \n\|\}]+)/);

					try {
						archive_url_decode = decodeURI( archive_url[1] );
						archive_url_decode = archive_url_decode.replace( /%(3B|2F|2C|3A)/g, decodeURIComponent ); // декодировать ;/,:
						archive_url_decode = archive_url_decode.replace( /[ <>"\[\]\n\r]/g, encodeURIComponent ); // закодировать

						line = line.replace(archive_url[1], archive_url_decode);
					} catch ( e ) { }

					url = line.match(/\|url *= *([^ \n\|\}]+)/);

					try {
						url_decode = decodeURI( url[1] );
						url_decode = url_decode.replace( /%(3B|2F|2C|3A)/g, decodeURIComponent ); // декодировать ;/,:
						url_decode = url_decode.replace( /[ <>"\[\]\n\r]/g, encodeURIComponent ); // закодировать

						line = line.replace(url[1], url_decode);
					} catch ( e ) { }
			//	}
			}

			//подгон формата даты и чистка
			line = line.replace(/\|(access-date|date) *= *([0-9][0-9][0-9][0-9])\-([0-9])\-/g, '|$1 = $2-0$3-');
			line = line.replace(/\|(access-date|date) *= *([0-9][0-9][0-9][0-9]\-[0-9][0-9])\-([0-9])([^0-9])/g, '|$1 = $2-0$3$4');
			line = line.replace(/\|archive-date *= *([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])[0-9]+/g, '|archive-date = $1-$2-$3 ');
			line = line.replace(/\|(access-date|archive-date|date) *= *([0-9][0-9][0-9][0-9])\.([0-9][0-9])\./g, '|$1 = $2-$3-');

			//форматирование
			if (line.indexOf('{{cite web\n') == -1) {
				line = line.replace(/\|([^=\|]+)=/g, ' |$1 = ');
				line = line.replace(/\s+/g, ' ');
			};

			//раскрыть
			if (line.replace(/\{\{cite web *\n *\|/g, '') != line)
			{
				line = line.replace(/ *(\|.*?=) */g, '\n $1 ');
				line = line.replace(/\n *\n/g, '\n');
				line = line.replace(/\n *\n/g, '\n');
			}

			return line;
		});


		r(/{{[Кк]нига/g, '{{книга');
		r(/{{книга([^\}]+?)}}/g, function ( line, params ) {//для сработки нужна замена выше
			params = params.replace(/\| *volume *=/g, '|том =');
			params = params.replace(/\| *pages *=/g, '|страницы =');
			params = params.replace(/\| *columns *=/g, '|столбцы =');
			params = params.replace(/\| *allpages *=/g, '|страниц =');

			//форматирование
			if (line.indexOf('{{книга\n') == -1) {
				params = params.replace(/\|([^=\|]+)=/g, ' |$1 = ');
				params = params.replace(/\s+/g, ' ');
			};

			return '{{книга' + params + '}}';
		});
		r(/{{[Сс]татья/g, '{{статья');
		r(/{{статья([^\}]+?)}}/g, function ( line, params ) {//для сработки нужна замена выше
			//форматирование
			if (line.indexOf('{{статья\n') == -1) {
				params = params.replace(/\|([^=\|]+)=/g, ' |$1 = ');
				params = params.replace(/\s+/g, ' ');
			};

			return '{{статья' + params + '}}';
		});
		r(/{{([Ии]з БСЭ|БСЭ)}}/g, '{{Из БСЭ|статья = }}');
		r(/{{([Ии]з )?БСЭ([^123][^}]+?)}}/g, function ( line, uns0, params ) {//замена БСЭ на БСЭ3

			if (params.indexOf('издание') != -1) {//указано издание
				return line;
			};

			params = params.replace(/\| *(заглавие|title) *= */g, '|статья = ');
			params = params.replace(/\| *http[^\|\}]+/g, '');

			alert('Внимание! Устаревший шаблон ' + line + ' автоматически заменён на {{БСЭ3' + params + '}}. Проверьте наличие статьи в 3-м издании БСЭ!');

			return '{{БСЭ3' + params + '}}';
		});

		//упаковка ссылок в шаблон Книга
		//r(/{{[Кк]нига([^\}]+?)}} *{{[Ww]ayback *\| *url *= *([^\|\}]+?) *\| *date *= *([\d]+?) *}}/g, function ( line, params, url, datetime ) {
		//			params = params.replace(/\| *ссылка *= *[^\|\}\s]+/g, '|ссылка = https://web.archive.org/web/' + datetime + '/' + url);
		//
		//			return '{{книга' + params + '}}';
		//		});

		//упаковка архивов внутрь шаблона Книга
		r(/{{[Кк]нига([^\}]+?}}) *{{[Ww]ayback *\| *url *= *([^\|\}]+?) *\| *date *= *(([\d]{4})([\d]{2})([\d]{2})[\d]{6}) *}}/g, function ( line, params, url, datetime, year, month, day ) {
			params = params.replace(/\}\}/g, '|archive-url = https://web.archive.org/web/' + datetime + '/' + url + ' |archive-date = ' + year + '-' + month + '-' + day + ' }}');

			return '{{книга' + params;
		});

		//форматирование шаблона Книга
		r(/{{[Кк]нига[^\:][^\}]+?({{|}})/g, function ( line ) {

			line = line.replace(/\|[\s]+/g, '|');//для упрощения регулярок ниже

			//до исправления
			line = line.replace(/\|Страниц *=/g, '|страниц =');//косяк по Крыму
			line = line.replace(/\|заглавие *= *Реки и Оз[её]ра Крыма\.?/g, '|заглавие = Реки и озёра Крыма');//косяк по Крыму
			line = line.replace(/\|место *= *Симферополь\./g, '|место = Симферополь');//косяк по Крыму

			line = line.replace(/\|место *= *\[\[(.+?)\]\]\./g, '|место = $1');//лишняя викификация

			line = line.replace(/\|(isbn2|nodot|ref|викитека|оригинал|серия|столбцы|том|часть = \|ссылка часть|часть|ссылка часть) *= *([\n\|\}])/g, '$2');//убрать пустые

			line = line.replace(/\|место *= *Спб\.?/g, '|место = СПб.');//автоподдержка
			line = line.replace(/\|место = Л([^А-яЁёі\.])/g, '|место = Л.$1');//добавить точку
			line = line.replace(/\|место = М([^А-яЁёі\.])/g, '|место = М.$1');//добавить точку

			//замена значений параметров
			line = line.replace(/([А-ЯЁ]\.)([А-ЯЁ]\.)/g, '$1 $2');//неразрывный пробел в инициалах
			line = line.replace(/\|автор *=\s*([А-ЯЁ]\.\s[А-ЯЁ]\.)\s([А-ЯЁ][а-яё]+)/g, '|автор = $2 $1');//инициалы в конец, 1-й автор
			for (var i = 0; i < 15; i++) {
				line = line.replace(/\|автор *=([^\|\}]+?)\s([А-ЯЁ]\.\s[А-ЯЁ]\.)\s([А-ЯЁ][а-яё]+)/g, '|автор =$1 $3 $2');
			}

			//вставить недостающие параметры
			if (line.match(/\|язык *=/) === null) {
				line = line.replace(/\|заглавие/g, '|язык = |заглавие');
			}
			line = line.replace(/\|язык *= *(mis|und|[А-яЁё])?/g, '|язык = ');//вычистка кода отсутствия языка и ложного заполнения

			var label = line.match(/\|заглавие *= *([^\|\n\}]+)/);

			if (label !== null && label[1].trim() !== '') {

				if (line.replace(/\|язык *= *[\|\}\n]/g, '') != line) {

					label = label[1].trim();
					var label_r = label.replace(/[,\:\;\.\…\!\?\"\'’«»\№\#\&\%\s\-\–\—\(\)\{\}\[\]\|\/\\0-9IVX]/g, '');//убрать пунктуацию и цифры

					if (label_r.replace(/[A-Za-z]/g, '') === '') {
						if (confirm('В статье обнаружена книга без указанного языка: ' + label + '. Добавить английский?')) {
							line = line.replace(/(\|язык *= *)/g, '$1en ');
						}
					}
					else if (label_r.replace(/[A-ZÄÖẞÜa-zäößü]/g, '') === '') {
						if (confirm('В статье обнаружена книга без указанного языка: ' + label + '. Добавить немецкий?')) {
							line = line.replace(/(\|язык *= *)/g, '$1de ');
						}
					}
					else if (label_r.replace(/[A-ZÁÉÍÑÓÚÜa-záéíñóúü¿]/g, '') === '') {
						if (confirm('В статье обнаружена книга без указанного языка: ' + label + '. Добавить испанский?')) {
							line = line.replace(/(\|язык *= *)/g, '$1es ');
						}
					}
					else if (label_r.replace(/[А-яЁё№]/g, '') === '') {
						if (confirm('В статье обнаружена книга без указанного языка: ' + label + '. Добавить русский?')) {
							line = line.replace(/(\|язык *= *)/g, '$1ru ');
						}
					}
					else if (label_r.replace(/[А-ЩЬЮЯҐЄІЇа-щьюяґєії№]/g, '') === '') {
						if (confirm('В статье обнаружена книга без указанного языка: ' + label + '. Добавить украинский?')) {
							line = line.replace(/(\|язык *= *)/g, '$1uk ');
						}
					}
					else if (label_r.replace(/[А-ЗК-ШЫ-ЯЁІЎа-зк-шы-яёіў№]/g, '') === '') {
						if (confirm('В статье обнаружена книга без указанного языка: ' + label + '. Добавить белорусский?')) {
							line = line.replace(/(\|язык *= *)/g, '$1be ');
						}
					}
				}
			}

			//раскрыть
			if (line.replace(/\{\{книга *\n *\|/g, '') != line)
			{
				line = line.replace(/ *(\|.*?=) */g, '\n $1 ');
				line = line.replace(/\n *\n/g, '\n');
				line = line.replace(/\n *\n/g, '\n');
			}

			//подчистить

			//декодирование ссылок
			if ( ( line.indexOf( '%D' ) !== -1 || line.indexOf( '%d' ) !== -1 ) && line.indexOf( '%25' ) === -1 ) {

			//	if (confirm('Раскодировать ссылки в шаблоне Книга? ' + line))
			//	{
					url = line.match(/\|ссылка *= *([^ \n\|\}]+)/);

					try {
						url_decode = decodeURI( url[1] );
						url_decode = url_decode.replace( /%(3B|2F|2C|3A)/g, decodeURIComponent ); // декодировать ;/,:
						url_decode = url_decode.replace( /[ <>"\[\]\n\r]/g, encodeURIComponent ); // закодировать

						line = line.replace(url[1], url_decode);
					} catch ( e ) { }
			//	}
			}

			return line;
		});

		//форматирование шаблона УСЭ
		r(/{{УСЭ[^\}]+?}}/g, function ( line ) {

			line = line.replace(/\|[\s]+/g, '|');//для упрощения регулярок ниже

			line = line.replace(/\|Статья *=/g, '|статья =');
			line = line.replace(/\|Ссылка *=/g, '|ссылка =');
			line = line.replace(/\|Том *=/g, '|том =');
			line = line.replace(/\|Страницы *=/g, '|страницы =');

			return line;
		});

		//форматирование шаблона Статья
		r(/{{[Сс]татья[^\}]+?}}/g, function ( line ) {

			line = line.replace(/\|[\s]+/g, '|');//для упрощения регулярок ниже

			line = line.replace(/([А-ЯЁ]\.)([А-ЯЁ]\.)/g, '$1 $2');//неразрывный пробел в инициалах
			line = line.replace(/\|автор *=\s*([А-ЯЁ]\.\s[А-ЯЁ]\.)\s([А-ЯЁ][а-яё]+)/g, '|автор = $2 $1');//инициалы в конец, 1-й автор
			for (var i = 0; i < 15; i++) {
				line = line.replace(/\|автор *=([^\|\}]+?)\s([А-ЯЁ]\.\s[А-ЯЁ]\.)\s([А-ЯЁ][а-яё]+)/g, '|автор =$1 $3 $2');
			}

			//декодирование ссылок
			if ( ( line.indexOf( '%D' ) !== -1 || line.indexOf( '%d' ) !== -1 ) && line.indexOf( '%25' ) === -1 ) {

			//	if (confirm('Раскодировать ссылки в шаблоне Статья? ' + line))
			//	{
					url = line.match(/\|ссылка *= *([^ \n\|\}]+)/);

					try {
						url_decode = decodeURI( url[1] );
						url_decode = url_decode.replace( /%(3B|2F|2C|3A)/g, decodeURIComponent ); // декодировать ;/,:
						url_decode = url_decode.replace( /[ <>"\[\]\n\r]/g, encodeURIComponent ); // закодировать

						line = line.replace(url[1], url_decode);
					} catch ( e ) { }
			//	}
			}

			return line;
		});

		//упаковка ссылок в шаблон Cite book
		//r(/{{[Cc]ite book([^\}]+?)}} *{{[Ww]ayback *\| *url *= *([^\|\}]+?) *\| *date *= *([\d]+?) *}}/g, function ( line, params, url, datetime ) {
		//	params = params.replace(/\| *url *= *[^\|\}\s]+/g, '|url = https://web.archive.org/web/' + datetime + '/' + url);

		//	return '{{cite book' + params + '}}';
		//});

		//оформление шаблоном ссылки на файл с озёрами Псковской области, осталось в АТЕ
		r(/>[^<]*?priroda\.pskov\.ru\/sites\/default\/files\/Fond_vodoemov\.xls[^<]*?</g, '>{{ФВПО}}<');


		//Пользовательские функции
		for ( i in window.wfWOPlugins ) {
			if ( window.wfWOPlugins.hasOwnProperty( i ) ) {
				window.wfWOPlugins[i]( txt, r );
			}
		}
	}

	//всякие функции
	function r( r1, r2 )
	{
		txt = txt.replace( r1, r2 );
	}

	function request( URL )
	{
		var oRequest = new XMLHttpRequest();
		oRequest.open('GET', URL, false);
		oRequest.send(null);

		return oRequest.responseText;
	}
	function attention( property, statement )
	{
		var regex = new RegExp('\\|' + property + '\\s*=\\s*(\\d*,?\\d*)', '');
		var result = txt.match( regex );

		if ((result != null) && ((result[1] < 10000) || (isNaN(result[1]))))
		{
			if ((txt.split(result[1]).length - 1) == 1)
			{
				label = 1;

				return subst + 'АИ2' + statement.replace('replace', result[1]) + ' ';
			}
		}

		return '';
	}
	function wb( mouth, t )
	{
		var article = request('https://ru.wikipedia.org/w/index.php?action=raw&title=' + mouth);

		var new_mouth = article.match( /\|\s?Устье\s*=\s(.+)\n/ );

		if (new_mouth == null)
		{//озеро?
			var new_mouth = article.match( /\|\s?Вытекающие\sреки\s*=\s(.+)\n/ );

			if (new_mouth != null)
			{
				system = system + '/' + new_mouth[1];

				wb( new_mouth[1], t++);
			}
			else
			{//водохранилище
				var new_mouth = article.match( /\|\s?Вытекающие\sводотоки\s*=\s(.+)\n/ );

				if (new_mouth != null)
				{
					system = system + '/' + new_mouth[1];

					wb( new_mouth[1], t++);
				}
				else
				{
					return 0;
				}
			}
		}
		else
		{
			system = system + '/' + new_mouth[1];

			if (wb( new_mouth[1], t++) == 0)
			{
				var mouth_sea = article.match( /\|Бассейн\s*=\s(.+)\n/ );

				if (mouth_sea != null)
				{
					system = system.replace(new_mouth[1], mouth_sea[1]);
				}
			}
		}
		return 1;
	}

	function processAllText()
	{
		txt = wpTextbox1.value;

		var length = txt.length;
		processText();
		//r( /^[\n\r]+/, '' );

		if ( txt == '' ){
			if ( mw.config.get( 'wgPageName' ).indexOf('Категория:Притоки_') > -1 ){
				txt = '{{' + 'КПР}}';
			}
			else if ( mw.config.get( 'wgPageName' ).indexOf('Категория:Бассейн_') > -1 ){
				txt = '{{' + 'КБР|||}}';
			}
			else if ( mw.config.get( 'wgPageName' ).indexOf('Обсуждение_участника:') > -1 ){
				txt = request('https://ru.wikipedia.org/w/index.php?action=raw&title=Проект:Водные_объекты/Сообщения_участникам');

				txt = txt.substring(0,txt.indexOf('[[Категория'));

				label = 3;
			}

		}

		wpTextbox1.value = txt;

		//комментарий
		var comment = '';
		var comment_line = wpSummary.value;
		if (comment_line.indexOf('[[ПРО:ВО]]') == -1)
		{
			if ((comment_line.length > 0) && (comment_line.indexOf('*/ ') == -1))
			{
				comment = ', ';
			}

			if (label == 2)
			{
				comment = comment + 'восстановлена утерянная сноска с помощью скрипта [[ПРО:ВО]]';
			}
			else if (label == 3)
			{
				comment = '[[Проект:Водные объекты]]';
			}
			else if (length != txt.length)
			{
				comment = comment + 'автозамена скриптом [[ПРО:ВО]]';
			}
			else if (label == 1)
			{
				comment = comment + 'выявлено разногласие данных с помощью скрипта [[ПРО:ВО]]';
			}
			wpSummary.value = comment_line + comment;
		}

		txt = '';
		comment_line = '';

		if ( window.auto_comment &&
			window.insertSummary &&
			!document.editform.wpSection.value
		) {
			window.insertSummary( 'Скрипт ПРО:ВО' );
		}
	}

	processAllText();
}


function registerWikificatorTool() {
	registerTool( {
		name: 'wikificator-WO',
		position: 200,
		title: 'Скрипт ПРО:ВО',
		label: 'Викификатор ПРО:ВО — автоматический обработчик текста',
		callback: Wikify_WO,
		classic: {
			icon: '//upload.wikimedia.org/wikipedia/commons/9/99/Code-selected.png',
		},
		visual: {
			icon: '//upload.wikimedia.org/wikipedia/commons/9/99/Code-selected.png',
			modes: [ 'source' ],
			addRightAway: true,
		},
	} );
}

if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
    mw.loader.using( ['user.options', 'jquery.textSelection'], function () {
        if ( mw.user.options.get('usebetatoolbar') === 1 ) {
			$.when(
				mw.loader.using( 'ext.gadget.registerTool' ),
					$.ready
			).then( registerWikificatorTool );
		}
    } );
}