Участник:X0stark69/wikificator+.js: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Содержимое удалено Содержимое добавлено
м fix
загрузка после ext.gadget.registerTool
Строка 1180: Строка 1180:
}
}


if ( $.inArray( mw.config.get( 'wgAction' ), ['edit', 'submit'] ) !== -1 ) {
registerWikificatorTool();
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 );
}
} );
}

Версия от 11:55, 3 декабря 2019

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

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');

		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"');

		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 км.}}');
			r(/\n\[\[Категория:Реки\sпо\sалфавиту\]\]/g, '');
		};
		added = added + attention('Объём', '|Объём воды — replace км³.}}');
		added = added + attention('Площадь', '|Площадь поверхности — replace км².}}');
		added = added + attention('Расход воды', '|Средний расход воды — replace м³/с.}}');
		if (current_mouth_altitude != '0')
		{
			added = added + attention('Высота устья', '|Высота устья — replace м над уровнем моря.}}');
		}
		added = added + attention('Высота истока', '|Высота истока — replace м над уровнем моря.}}');
		added = added + attention('Площадь бассейна', '|Площадь водосборного бассейна — replace км².}}');
		added = added + attention('Площадь водосбора', '|Площадь водосборного бассейна — replace км².}}');
		added = added + attention('Высота над уровнем моря', '|Высота над уровнем моря — replace м.}}');
		added = added + attention('Уклон реки', '|Уклон реки — replace м/км.}}');

		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(/\|Бассейн\s*=([А-яЁёA-z0-9\/\(\)\s\-]*)\n/g, function ( line, bassin )
		{
			if (current_mouth_altitude == '0')
			{
				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=Участник:Мастер_теней/wikificator%2B/' + type);
		});

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

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

			if (type == 'ci' || type == 'cite' || type == 'са' || type == 'сайт')
			{
				return '{{cite web\n |author      = \n |url         = \n |title       = \n |date        = \n |website     = \n |publisher   = \n |accessdate  = ' + linetime + ' \n |lang        = \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');
		});


		//избыточная викификация
		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(/\[\[([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(/\s\[\[\:([A-z][A-z])\:(.*?)\|(.*?)\]\]/g, ' \{\{iw|$3<!-- Заголовок статьи подставлен автоматически! Пожалуйста, проверьте корректность и удалите сообщение! -->|$3|$1|$2}}');
		r(/протекает\sв\sПермском\sкрае/g, 'протекает по [[Пермский край|Пермскому краю]]');
		r(/протекает\sв\sЧелябинской\sобласти/g, 'протекает по [[Челябинская область|Челябинской области]]');
		r(/протекает в Томской области/g, 'протекает по [[Томская область|Томской области]]');
		r(/протекает в Омской области/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АО/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(/{{([Ss]|[Nn]obr) *\|([^\{\}]+?)}}/g, function ( line, uns0, value )//чистка избыточного шаблона
		{
			return value.replace(/[\s]+/g, ' ');
		});
		r(/\[\[([^\|\]]+)/g, function ( line, value )//чистка левых \s внутри ссылок
		{
			return '[[' + value.replace(/[\s]+/g, ' ');
		});
		r(/{{[Nn]bsp}}/g, ' ');
		r(/{{[Тт]аз}}\n/g, '');
		r(/{{[Лл]овать и Пола}}\n/g, '');
		r(/{{[Мм]ста без р. Шлина от истока до Вышневолоцкого}}\n/g, '');
		r(/\[\[Речная\sсистема\]\]\sреки.*?\.\s/g, '');
		r(/== Ссылки ==\n{{[A-z-]+-geo-stub}}/g, '');
		r(/{{[Nn]um *\|(\d)([\d\.])?([\d\.])?([\d\.])?\|(.*?)}}/g, '$1$2$3$4 $5');
		r(/ ?{{([Пп]роверено|[Vv]) *\|[^\}]+}}/g, '');
		r(/\n{{Водный реестр}}/g, '\n\* {{Водный реестр}}');
		r(/\== Ссылки ==\n\*?\s?{{Водный реестр}}\n\n/g, '');
		r(/\*\s{{[Вв]одный реестр}}\n/g, '');
		r(/\==\sСм.\sтакже\s==\n\*?\s*\[\[Реки\sГермании\]\]\n\n/g, '');
		r(/\[\[Категория:Реки\s[А-я-\s]*бассейнового\sокруга\]\]\n/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(/<nowiki><\/nowiki>/g, '');
		r(/<nowiki> <\/nowiki>/g, ' ');
		r(/<nowiki>\[<\/nowiki>/g, '&#91;');
		r(/<nowiki>\]<\/nowiki>/g, '&#93;');
		r(/<nowiki>\|<\/nowiki>/g, '&#124;');
		r(/(По данным \[\[Государственный водный реестр\|государственного водного реестра России\]\] относится.*)([^]+== Данные водного реестра ==[^]+)(По данным|Код объекта)/g, '$2$1\n\n$3');
		r(/По\sданным\sгеоинформационной системы водохозяйственного районирования[А-я,\s\[\|\]]*(<ref\sname=\"МПР\sРоссии\">.*<\/ref>):\s?\n\*\sКод\sводного([А-я—\s\d]*)\n[А-я—\s\(\)\d\n\.\*]*Выпуск\sпо\sГИ\s—\s\d\n/g, 'Код$2$1.\n');
		r(/, речной подбассейн реки\s— [Пп]одбассейн отсутствует/g, '');
		r(/, речной подбассейн реки отсутствует/g, '');
		r(/, подбассейн у реки отсутствует/g, '');
		r(/(http:\/\/textual.ru\/gvr\/index\.php\?card=[\d]*).*?loc=/g, '$1');
		r(/<ref name=\"МПР России\">(\{\{cite web.+card\=([\d]+).+водный реестр( РФ)?\: ([0-9А-яЁё, \(\)\.-]+)[^<]*)/g, '<ref name=\"МПР России\">{{ГВР|$2|$4}}');
		r(/< ?ref name ?= ?(\'|\")(.+)(\'|\") ?> ?< ?\/ ?ref ?>/g, '<ref name="$2"/>');

		//проблемы в шаблонах
		r(/{{([Кк]ол|[Dd]iv col|[Cc]olbegin)(\|)?([\d])?}}/g, '{{колонки$2$3}}');
		r(/{{([Кк]онец кол|[Кк]ол-конец|[Кк]олонки\/конец|[Dd]iv col end|[Cc]olend)}}/g, '{{колонки|конец}}');
		r(/{{([Нн]е АИ|[Нн]еаи|[Нн]еавторитетный источник\?|[Нн]еавторитетный источник|авторитетность\?)/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(/{{lang-(be|ru|uk)\|([^\}]+?)}}/g, function ( line, lang, word ) {

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

			return '{{lang-' + lang + '|' + word + '}}';
		});

		r(/\{\{[Rr]q\|source(s)?\}\}/g, subst + 'отсутствие источников' + substclose);
		r(/\{\{[Rr]q\|refless\}\}/g, '\{\{нет сносок\}\}');
		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('geo-stub}}') > -1)
		{
			var size = txt.replace( /{{((.|\n)*}})[\n]*\'\'\'/g, '' );

			if (size.length > 2000) 
			{
				r(/\n{{[A-z-]*geo-stub}}/g, '');
			}

			r(/stub\}\}\n\n\{\{/g, 'stub\}\}\n\{\{');
		};
		r(/{{[Сс]тиль( +)?\|( +)?.+}}/g, '{{стиль}}');//выпил даты
		r(/{{[Rr]efless}}/g, '{{нет сносок}}');
		r(/{{[Нн]ет сносок( +)?\|( +)?.+}}/g, '{{нет сносок}}');//выпил даты
		r(/{{[Бб]олванка( +)?\|( +)?.+}}/g, '');
		r(/{{[Ww]ide image/g, '{{панорама');
		r(/{{Нет/g, '{{нет');
		r(/{{нет\sисточников/g, '{{нет ссылок');
		r(/{{нет\s(иллюстрации|иллюстраций|изображений)}}/g, '');

		//cite web и другие шаблоны АИ
		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=yes|title=$8|lang = |archiveurl=$1|archivedate=$3-$4-$5}}');//разворачивание web.archive.org 
		r(/\[(http(s)?:\/\/www\.webcitation\.org\/[^\?]+\?url=(http(s)?:[^\] ]+))([^\]]+)?\]/g, '{{cite web|author = |url=$3|deadlink=yes|title=$5|lang = |archiveurl=$1|archivedate=}}');//разворачивание 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=yes|title=$8|lang = |archiveurl=$1|archivedate=$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=yes|title=$4|lang = |archiveurl=$1|archivedate=}}');//разворачивание 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]w/g, '{{cite web');
		r(/{{[Cc]iteweb/g, '{{cite web');
		r(/{{[Cc]ite[\s]+web/g, '{{cite web');
		r(/{{[Cc]ite[\s]+web[\s]+2/g, '{{cite web');
		r(/{{(Недоступная ссылка|[Мм][ёе]ртвая ссылка|[Бб]итая ссылка|[Dd]eadlink|[Dd]ead link)/g, '{{недоступная ссылка');
		r(/{{Wayback/g, '{{wayback');
		r(/{{([Ww]ebarchive|Архивировано)/g, '{{архивировано');
		r(/ *= *\?\?\?/g, ' = ');
		r(/\| *тираж *= *([0-9]+)(&nbsp;|\s)([0-9]+)/g, '|тираж = $1$3');
		if (txt.indexOf('Архивированная копия') != -1 || txt.indexOf('{title}') != -1 || txt.indexOf('アーカイブされたコピー') != -1 ) {
			r(/\| *title *= *(Архивированная копия|{title}|アーカイブされたコピー)/g, '|title = ');
			alert('Внимание! У одной из ссылок не заполнено описание! Пожалуйста, впишите его в параметр title. См. ошибку в предварительном просмотре.');
		};
		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 *= *Dutch/g, '|lang = nl');
		r(/\| *lang *= *Japanese/g, '|lang = ja');
		r(/({{cite web([^\}]+?))}}{{недоступная ссылка[^\}]+?}}/g, '$1|deadlink = yes}}');
		r(/{{cite web([^\}]+?)}}/g, function ( line, params ) {//для сработки нужна замена выше
			params = params.replace(/\| *archive-url *=/g, '|archiveurl =');
			params = params.replace(/\| *archive-date *=/g, '|archivedate =');
			params = params.replace(/\| *access-date *=/g, '|accessdate =');
			params = params.replace(/\| *work *=/g, '|website =');
//			params = params.replace(/\| *language *=/g, '|lang =');
			params = params.replace(/\| *datepublished *=/g, '|date =');
			params = params.replace(/\| *deadlink *= *(\}|\|)/g, '|deadlink=no$1');
			params = params.replace(/\| *deadlink *= *1 *\|/g, '|deadlink = yes |');
			params = params.replace(/\| *deadlink *= *(403|404|project-closed|unknown-host|indeed|circular|да)/g, '|deadlink = yes');
			params = params.replace(/\| *deadurl *= *yes/g, '');

			//internetquelle
			params = params.replace(/\| *autor *=/g, '|author =');
			params = params.replace(/\| *titel *=/g, '|title =');
			params = params.replace(/\| *hrsg *=/g, '|website =');
			params = params.replace(/\| *offline *=/g, '|deadlink =');
			params = params.replace(/\| *deadurl *=/g, '|deadlink =');
			params = params.replace(/\| *zugriff *=/g, '|accessdate =');
			params = params.replace(/\| *zugriff-jahr *=/g, '|accessdate =');
			params = params.replace(/\| *archiv-datum *=/g, '|archivedate =');
			params = params.replace(/\| *datum-jahr *=/g, '|year =');
			params = params.replace(/\| *datum-monat *=/g, '|month =');
			params = params.replace(/\| *datum-tag *=/g, '|day =');
			params = params.replace(/\| *datum *=/g, '|date =');
			params = params.replace(/\| *sprache *=/g, '|lang =');
			params = params.replace(/\| *seiten *=/g, '|pages =');
			params = params.replace(/\| *zitat *=/g, '|quote =');
			
			//форматирование
			if (line.indexOf('{{cite web\n') == -1) {
				params = params.replace(/\|([^=\|]+)=/g, ' |$1 = ');
				params = params.replace(/\s+/g, ' ');
			};

			return '{{cite web' + params + '}}';
		});
		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(/\| *archiveurl *= *[^\|]+?maps.rosreestr.ru\/Portal[^\}]+?}/g, '}');
		r(/\| *url *= *http(s)?\:\/\/maps.rosreestr.ru\/Portal(Online)?\/\?l=/g, '|url = https://pkk5.rosreestr.ru/#z=');
		r(/\[http(s)?\:\/\/maps.rosreestr.ru\/Portal(Online)?\/\?l=/g, '[https://pkk5.rosreestr.ru/#z=');
		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');


		//стиль и типографика
		r(/В\s(\[\[)?(\d\d\d\d)(\]\])?\sг\.(\s|,)/g, 'В $2 году$4');
		r(/\sв\s(\[\[)?(\d\d\d\d)(\]\])?\sг\.( |,)([^А-ЯЁ])/g, ' в $2 году$4$5');
		r(/{{[Нн][Пп][2345]\|/g, '{{iw|');
		r(/{{[Ii][w][2345]\|/g, '{{iw|');
		r(/{{[Нн]е\sпереведено\|/g, '{{iw|');
		r(/{{[Нн]е\sпереведено\s[2345]\|/g, '{{iw|');
		r(/({{iw\|[^\|]+\|[^\|]*\|)(\|[^\|\}]+?}})/g, '$1en$2');
		r(/{{iw\|([^\|\}]+?)}}/g, '{{iw|$1||en|$1}}');
		r(/<sup>2<\/sup>/g, '²');
		r(/<sup>3<\/sup>/g, '³');
		r(/кв(\.)?(\s)?км/g, 'км²');
		r(/км2/g, 'км²');
		r(/м2/g, 'м²');
		r(/км (²|³)/g, 'км$1');
		r(/км3/g, 'км³');
		r(/куб\.(\s)?км/g, 'км³');
		r(/м3\/с/g, 'м³/с');
		r(/ м (²|³)/g, ' м$1');
		r(/\{\{[Кк]ол\|/g, '\{\{колонки');
		r(/\{\{Карта\|/g, '\{\{карта\|');
		r(/\{\{Orphan.*?\}\}/g, '\{\{изолированная статья\}\}');
		r(/\{\{([Нн]ормативный\sконтроль|[Аа]вторитетный\sконтроль|[Бб]иблиоинформация|[Сс]сылки|[Вв][Сс]|[Ии]дентификаторы|Внешние\sссылки|[Aa]uthority control|[Nn]ormdaten|[Ee]xternal\slinks)\}\}/g, '{{внешние ссылки}}');
		r(/<ref>{{карта\|([A-U0-9-IVX,АБ]*)}}<\/ref>/g, '<ref name=\"$1\">{{карта|$1}}<\/ref>');
		r(/(Н|н)аселенн([^я])/g, '$1аселённ$2');
		r(/(П|п)оселок/g, '$1осёлок');
		r(/(Б|б)ерет\sначало/g, '$1ерёт начало');
		r(/лощадь её водосборного/g, 'лощадь водосборного');
		r(/(П|п)ротяженность/g, '$1ротяжённость');
		r(/подбассейн\sреки\s—\sПодбассейн/g, 'подбассейн реки — подбассейн');
		r(/\[\[[Уу]краинский язык\|укр\]\]\. \'\'([А-я-і]*)\'\'/g, '{{lang-uk|$1}}');
		r(/укр\. \'\'([А-я-і]*)\'\'/g, '{{lang-uk|$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(/{{[Oo]theruses/g, '{{значения');
		r(/({{([Дд]ругие )?[Зз]начения[^}]*?}}\n)([^\']+?}})\n\'\'\'/g, '$3$1\'\'\'');
		if (txt.indexOf('<ref name=\"МПР России\">') > -1) {
			r(/Длина\sреки\sсоставляет\s(\d*)\sкм\./g, 'Длина реки составляет $1 км<ref name=\"МПР России\"/>.');
		};
		if (txt.indexOf('<ref name=\"ГВР\">') == -1) {
			r(/<ref name\=\"МПР России\"/g, '<ref name=\"ГВР\"');
		};
		if (txt.indexOf('<ref name=\"ГВР\">') == -1) {
			r(/<ref>{{ГВР\|([\d]*)(\|[А-я-\s]*)?}}<\/ref>/g, '<ref name=\"ГВР\">{{ГВР|$1$2}}<\/ref>');
		};
		if (txt.indexOf('<gallery') == -1) {//убрать разрывы строк
			r(/([^\s])[\n]([а-яё]+)/g, '$1 $2');
			r(/[,][\n]([А-ЯЁ][а-яё]+)/g, ', $1');
			r(/([a-z]+)[\n]([a-z]+)/g, '$1 $2');
		};
		r(/==\n\n/g, '==\n');
		r(/\n\n\n/g, '\n\n');
		r(/\n\n\n/g, '\n\n');
		r(/\n\s\}\}/g, '\n\}\}');
		r(/\}\}\n\n\'\'\'/g, '}}\n\'\'\'');
		

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


		//преобразование координат
		//Google, Yandex, Bing, SAS-Планета
		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';
		});

		//карточка реки
		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 |Позиционная карта       = ');
		r(/\n *\| *Позиционная карта 1 *= */g, '\n |Позиционная карта 1     = ');
		r(/\n *\| *Тип вывода для ПК *= */g, '\n  |Тип вывода для ПК      = ');
	
		r(/\n *\| *Страна *= *Беларусь/g, '\n |Страна                  = Белоруссия');
		r(/\n *\| *Страна *= *КНР/g, '\n |Страна                  = Китайская Народная Республика');
		r(/\n *\| *Страна *= *Китай(\/|\n)/g, '\n |Страна                  = Китайская Народная Республика$1');
		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) {
			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 |Ширина                  = ');
		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, '\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для\sсортировки *=.*/g, '');
		r(/\n *\| *Тип\sзалива *= */g, '\n |Тип залива              = ');
		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');//удалять если не заполнена
		r(/([ ]+)?\|([ ]+)?Вместо (региона|района).+\n/g, '');//всегда удалять
		if (txt.indexOf('{{Море') == -1) 
		{
			if (txt.indexOf('Регион') == -1) 
			{
				r(/\n *\| *Страна *= (.*?)\n/g, '\n |Страна                  = $1\n  |Регион                 = \n');
			}

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

		//Карточка поселения
//		r(/([ ]+)?\|([ ]+)?CoordAddon.+\n/g, '');//всегда удалять, уже в викификаторе
//		r(/([ ]+)?\|([ ]+)?ЯндексКарта.+\n/g, '');//всегда удалять, уже в викификаторе
//		r(/\n *\| *размер карты страны.+\n/g, '\n');//всегда удалять, уже в викификаторе
//		r(/\n *\| *размер карты региона.+\n/g, '\n');//всегда удалять, уже в викификаторе
//		r(/\n *\| *размер карты района.+\n/g, '\n');//всегда удалять, уже в викификаторе
		r(/\n *\| *карта страны *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *карта региона *= *\n/g, '\n');//удалять если не заполнена
		r(/\n *\| *карта района *= *\n/g, '\n');//удалять если не заполнена
		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) 
		{
			r(/\n *\| *Тип *= */g, '\n |Тип парка               = ');
		};

		//базовое оформление ссылок
		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 = ' |archiveurl = ' + url + ' |archivedate = ' + archivedate + ' ';
						
						accessdate = archivedate;

						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 = ' |archiveurl = ' + 'http://web.archive.org/web/' + datetime + '/' + url + ' |archivedate = ' + year + '-' + month + '-' + day + ' ';

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

						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 = ' |archiveurl = ' + url + ' |archivedate = ' + archivedate;

						accessdate = archivedate;//дата архива как дата доступа

						return line;
					});
				}

				deadparam = deadparam + ' |deadlink = yes ';
			}

			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 = |accessdate = ' + 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');
		}

		//Пользовательские функции
		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',
		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 );
		}
    } );
}