MediaWiki:Gadget-wikificator.js

Материал из Каталог переславских телепередач
Перейти к навигации Перейти к поиску

Замечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Перейдите в Menu → Настройки (Opera → Настройки на Mac), а затем Безопасность → Очистить историю посещений → Кэшированные изображения и файлы
var wmCantWork = 'Викификатор не может работать в вашем браузере',
	wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?',
	wmTalkPage = 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно';
window.wfPlugins = window.wfPlugins || [];


window.Wikify = function ( input ) {
	'use strict';
	var txt = '',
		hidden = [],
		winScroll = document.documentElement.scrollTop;

	// Поверхностная проверка на то, что перед нами поле ввода
	if ( !input || !input.tagName || input.value === undefined ) {
		input = document.editform.wpTextbox1;
	}


	// FUNCTIONS

	function r( r1, r2 ) {
		txt = txt.replace( r1, r2 );
	}
	
	function processText() {
		var i,
			u = '\u00A0'; // non-breaking space
		if ( mw.config.get('wgNamespaceNumber') % 2 || mw.config.get('wgNamespaceNumber') === 4 ) { // is talk page
			var sigs = txt.match( /\d\d:\d\d, \d\d? \S{3,8} 20\d\d \(UTC\)/g );
			if ( sigs && sigs.length > 1 ) {
				alert( wmTalkPage );
				return;
			}
		}

		// Hyphens to em-dashes
		r( /(\s)-{1,3} /g, '$1— ' ); // hyphen -> —
		r( /(\d)-(\d)/g, '$1—$2' ); // -> —
		r( /(\d)--(\d)/g, '$1—$2' ); // -> —
		r( /(\d)---(\d)/g, '$1—$2' ); // -> —

		r( /«|»|“|”|„/g, '"' ); // temp

		// "" → «»
		for ( i = 1; i <= 2; i++ ) {
			r( /([\s\x02!|#'"\/([{;+\-])"([^"]*)([^\s"([{|])"([^a-zа-яё])/ig, '$1«$2$3»$4' ); // "
		}
		while ( /«[^»]*«/.test( txt ) ) {
			r( /«([^»]*)«([^»]*)»/g, '«$1„$2“' );
		}

		r( 'ёё' , '</div>\n<hr class=newtheme>\n<div class=newtheme>' );
		r( 'ёёё' , '<hr class=newtheme>\n' );

	}

	function processAllText() {
		txt = input.value;
		processText();
		r( /^[\n\r]+/, '' );
		input.value = txt;
		txt = '';
	}


	// Check regexp support
	try {
		txt = 'ая'.replace( /а/g, 'б' ).replace( /б(?=я)/, 'в' );
	} catch ( e ) {}
	if ( txt !== 'вя' ) {
		alert( wmCantWork );
		return;
	}

	input.focus();

	// Modern browsers
	if ( typeof input.selectionStart !== 'undefined' ) {
		var textScroll = input.scrollTop,
			startPos = input.selectionStart,
			endPos = input.selectionEnd;
		txt = input.value.substring( startPos, endPos );
		if ( txt === '' ) {
			processAllText();
		} else {
			processText();
			input.value = input.value.substring( 0, startPos ) +
				txt + input.value.substring( endPos );
		}
		input.selectionStart = startPos;
		input.selectionEnd = startPos + txt.length;
		input.scrollTop = textScroll;

	// IE
	} else if ( document.selection && document.selection.createRange ) {
		var range = document.selection.createRange();
		txt = range.text;
		if ( txt === '' ) {
			processAllText();
		} else {
			processText();
			range.text = txt;
			if ( range.moveStart ) {
			range.moveStart( 'character', -txt.length );
			}
			range.select();
		}

	// Other browsers
	} else if ( confirm( wmFullText ) ) {
		processAllText();
	}

	document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera
};

window.AddLinesToNames = function ( input ) {
	// получим строки в массив
	input = document.getElementById("wpTextbox1");
	var lines = input.value.split('\n');
	var TimePosition = [];
	//
	// найдём позиции
	//
	var ThemesCount = 0;
	var LineFrom = 0;
	for(var i = 0; i<lines.length; i++){
		if (lines[i] === "==Темы==") { LineFrom = i+1; }
		if (lines[i] === "==Места==") { LineTo = i-1; }
		if (lines[i] === "==Лица==") { LineFromA = i+1; }
		if (lines[i].substring(1, 6) === "{{что|") { ThemesCount = ThemesCount + 1; }
		if (lines[i] === "{{КонецПередачи}}") { LineToA = i-1; }
	}
	LineToA = LineToA - ThemesCount;
	//
	// заполняем массив времён
	//
	for (I=LineFrom; I<LineTo-1; I++){
		if ( lines[I] === "<div class=newtheme>" ){
			// проверим, есть ли время в следующей строке
			if (lines[I+1].substring(4, 5) === ":") {
				TimeStr = lines[I+1].substring(2, 7);
				TimePosition.push(TimeStr);
			} else {
				TimeStr = lines[I+2].substring(2, 7);
				TimePosition.push(TimeStr);
			}
		}
	}
	//
	// дополняем раздел имён
	//
	var N = 0;
	for (I=LineFromA; I<LineToA; I++){
		TimeStr = lines[I].substring(2, 7);
		if (TimeStr >= TimePosition[N]) {
			lines[I] = "<hr class=newtheme>\n" + lines[I];
			N = N + 1;
		}
	}
	//
	// возвращаем результат в форму
	//
	input.value = lines.join("\n");
	input.focus();
};