MediaWiki:Gadget-wikificator.js: различия между версиями

Материал из Каталог переславских телепередач
Перейти к навигации Перейти к поиску
Строка 197: Строка 197:
 
document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera
 
document.documentElement.scrollTop = winScroll; // scroll back, for IE/Opera
 
};
 
};
 
 
// Toolbar buttons
 
 
var addOldToolbarButton = function () {
 
var $toolbar = $( '#gadget-toolbar' );
 
if ( !$toolbar.length ) {
 
$toolbar = $( '#toolbar' );
 
}
 
$( '<div>' )
 
.addClass( 'mw-toolbar-editbutton' )
 
.attr( 'alt', 'Викификатор' )
 
.attr( 'title', 'Викификатор — автоматический обработчик текста' )
 
.css( {
 
'width': '69px',
 
'backgroundImage': 'url(//upload.wikimedia.org/wikipedia/commons/3/38/Button_wikify.png)'
 
} )
 
.appendTo( $toolbar )
 
.on( 'click', Wikify );
 
};
 
 
var addNewToolbarButton = function () {
 
$( '#wpTextbox1' ).wikiEditor( 'addToToolbar', {
 
'section': 'main',
 
'group': 'gadgets',
 
'tools': {
 
'wikif': {
 
label: 'Викификатор — автоматический обработчик текста',
 
type: 'button',
 
icon: '//upload.wikimedia.org/wikipedia/commons/0/06/Wikify-toolbutton.png',
 
action: {
 
type: 'callback',
 
execute: Wikify
 
}
 
}
 
}
 
} );
 
 
mw.hook( 'wikieditor.toolbar.wikificator' ).fire();
 
 
};
 
 
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.wikiEditor' ),
 
$.ready
 
).then( function () {
 
mw.hook( 'wikieditor.toolbar.gadgetsgroup' ).add( addNewToolbarButton );
 
} );
 
} else {
 
mw.loader.using( 'mediawiki.toolbar', function () {
 
$( addOldToolbarButton );
 
});
 
}
 
} );
 
}
 
  
 
}() );
 
}() );

Версия 23:33, 25 февраля 2018

( function () {

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 hide( re ) {
		r( re, function ( s ) {
			return '\x01' + hidden.push( s ) + '\x02';
		} );
	}

	function hideTag ( tag ) {
		hide( new RegExp( '<' + tag + '( [^>]+)?>[\\s\\S]+?<\\/' + tag + '>', 'gi' ) );
	}

	function hideTemplates() {
		hide( /\{\{([^{]\{?)+?\}\}/g );
		var pos = 0,
			stack = [],
			tpl,
			left,
			right;
		while ( true ) {
			left = txt.indexOf( '{{', pos );
			right = txt.indexOf( '}}', pos );
			if ( left === -1 && right === -1 && !stack.length ) {
				break;
			}
			if ( left !== -1 && ( left < right || right === -1 ) ) {
				stack.push( left );
				pos = left + 2;
			} else {
				left = stack.pop();
				if ( typeof left === 'undefined' ) {
					if ( right === -1 ) {
						pos += 2;
						continue;
					} else {
						left = 0;
					}
				}
				if ( right === -1 ) {
					right = txt.length;
				}
				right += 2;
				tpl = txt.substring( left, right );
				txt = txt.substring( 0, left ) +
					'\x01' + hidden.push( tpl ) + '\x02' +
					txt.substr( right );
				pos = right - tpl.length;
			}
		}
	}
	
	function processLink(link, left, right) {
		left = $.trim(left.replace(/[ _\u00A0]+/g, ' '));
		if (left.match(/^(?:Категория|Файл) ?:/)) {
			return '[[' + left + '|' + right + ']]';
		}
		right = $.trim(right.replace(/ {2,}/g, ' '));
		var inLink = right.substr(0, left.length);
		var afterLink = right.substr(left.length);
		var uniLeft = left.substr(0, 1).toUpperCase() + left.substr(1);
		var uniRight = (right.substr(0, 1).toUpperCase() + right.substr(1)).replace(/[_\u00A0]/g, ' ');
		if (uniRight.indexOf(uniLeft) === 0 && afterLink.match(/^[a-zа-яё]*$/)) {
			return '[[' + inLink + ']]' + afterLink;
		} else {
			return '[[' + left + '|' + right + ']]';
		}
	}

	function processText() {
		var i,
			u = '\u00A0'; // non-breaking space
		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 -> &mdash;
		r( /(\d)--(\d)/g, '$1—$2' ); // -> &mdash;

		// Plugins
		for ( i in window.wfPlugins ) {
			if ( window.wfPlugins.hasOwnProperty( i ) ) {
				window.wfPlugins[i]( txt, r );
			}
		}

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

		function unhide( s, num ) {
			return hidden[ num - 1 ];
		}
		while ( txt.match( /\x01\d+\x02/ ) ) {
			r( /\x01(\d+)\x02/g, unhide );
		}
		txt = txt.substr( 1, txt.length - 2 );
	}

	function processAllText() {
		txt = input.value;
		processText();
		r( /^[\n\r]+/, '' );
		input.value = txt;
		txt = '';
		if ( window.auto_comment &&
			window.insertSummary &&
			!document.editform.wpSection.value
		) {
			window.insertSummary( 'викификатор' );
		}
	}


	// 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
};

}() );