Участник:Jack who built the house/proceedToArchive.js

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
/**
 * proceedToArchive.js — 12.12.2017
 * By Jack who built the house
 */

var proceedToArchiveRunned = true;

mw.loader.using('mediawiki.util').then(function() {
	function processAnchor(fragment) {
		function dotToPercent(code) {
			return code.replace(/\.([0-9A-F][0-9A-F])/g, '%$1'); 
		}
		
		fragment = fragment
			.replace(/(^|[^0-9A-F\.])(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/g, '$1$2,$3,$4,$5') // hide IP
			.replace(/\.F[0-4]\.[89AB][\dA-F]\.[89AB][\dA-F]\.[89AB][\dA-F]/g, dotToPercent)  // The codes were borrowed from
			.replace(/\.E[\dA-F]\.[89AB][\dA-F]\.[89AB][\dA-F]/g, dotToPercent)               // [[MediaWiki:Gadget-urldecoder.js]]
			.replace(/\.[CD][\dA-F]\.[89AB][\dA-F]/g, dotToPercent)
			.replace(/\.[2-7][0-9A-F]/g, function (code) {
				var ch = decodeURIComponent(dotToPercent(code));
				if ('!"#$%&\'()*+,/;<=>?@\\^`~'.indexOf(ch) !== -1) 
					return dotToPercent(code);
				else
					return code;
			})
			.replace(/(^|[^0-9A-F\.])(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/g, '$1$2.$3.$4.$5') // restore IP
			.replace(/_/g, ' ');
		
		try {
			fragment = decodeURIComponent(fragment);
		} catch (e) {
			return;
		}
		
		return $.trim(fragment);
	}
	
	function dialog() {
		var messageDialog = new OO.ui.MessageDialog();
		var windowManager = new OO.ui.WindowManager();
		$('body').append(windowManager.$element);
		windowManager.addWindows([messageDialog]);
	
		// Configure the message dialog.
		windowManager.openWindow(messageDialog, {
			message: $('<div style="text-align:center;"><p style="margin-top:0;"><span style="color:#c61313;">Тема не найдена.</span> Она могла быть переименована или уйти в архив.</p><p style="font-size:125%;">Поискать в архиве?</p></div>'),
			actions: [
				{ label: 'Да', action: 'yes' },
				{ label: 'Нет', action: 'no' }
			],
		}).closed.then(function (data) {
			if (data && data.action === 'yes') {
				var heading = processAnchor(fragment).replace(/"/g, '');
				var archivePrefix = '';
				var PAGE_TITLE = mw.config.get('wgTitle');
				if (PAGE_TITLE.indexOf('Форум/') === 0) {
					if (PAGE_TITLE.indexOf('Форум/Географический') === 0)
						archivePrefix = 'Форум/Географический/Архивы';
					else
						archivePrefix = 'Форум/Архив/' + PAGE_TITLE.substr(6);
				} else {
					archivePrefix = PAGE_TITLE;
				}
				var searchQuery = '"' + heading + '" prefix:' + mw.config.get('wgFormattedNamespaces')[NAMESPACE_NUMBER] + ':' + archivePrefix;
				var url = mw.util.getUrl('Служебная:Поиск', {
					profile: 'default',
					fulltext: 'Search',
					search: searchQuery,
				});
				location.assign(mw.config.get('wgServer') + url);
			}
		});
	}
	
	var NAMESPACE_NUMBER = mw.config.get('wgNamespaceNumber');
	var fragment = location.hash.substr(1);
	var decodedFragment;
	try {
		decodedFragment = decodeURIComponent(fragment);
	} catch (e) {
		console.error(e.stack);
	}
	var escapedFragment = $.escapeSelector(fragment);
	var escapedDecodedFragment = decodedFragment && $.escapeSelector(decodedFragment);
	
	// страницы обсуждения и пространства «Википедия», кроме страниц номинаций, для которых нет архивов
	if (!window.proceedToArchiveHasRun &&  // Чтобы не было двух экземпляров
		(NAMESPACE_NUMBER % 2 === 1 || NAMESPACE_NUMBER === 4) &&
		mw.config.get('wgIsArticle') &&
		mw.config.get('wgPageName').indexOf('Архив') === -1 &&
		!mw.config.get('wgPageName').match(/^Википедия:(К_удалению|К_восстановлению|К_переименованию|К_объединению|К_разделению|К_улучшению)\//) &&
		!mw.util.getParamValue('oldid') &&
		!mw.util.getParamValue('diff') &&
		fragment &&
		decodedFragment &&
		fragment.search(/^\d{12}/) === -1 &&
		fragment !== 'Преамбула' &&
		fragment !== encodeURIComponent('Преамбула') &&
		!fragment.startsWith('/media/') &&
		!$(':target').length &&
		!$('a[name="' + escapedDecodedFragment + '"]').length &&
		!$('span[id="' + escapedDecodedFragment + '"]').length &&
		!$('a[name="' + escapedFragment + '"]').length &&
		!$('span[id="' + escapedFragment + '"]').length &&
		$('#mw-content-text:contains("(UTC)")').length
	) {
		window.proceedToArchiveHasRun = true;
		mw.loader.using([ 'oojs-ui' ], function () {
			dialog();
		});
	}
}());