MediaWiki:Gadget-wikificator.js

Straipsnis ėš Vikipedėjės, encikluopedėjės žemaitėškā.

Diemesė: ėšsauguojus Tamstā gal prireiktė ėšvalītė Tamstas naršīklės rėnktovė, kū paveizėtomėt pakeitėmus. Mozilla / Safari / Konqueror: laikīdami Shift pasėrinkėt Atsiōstė ėš nauja, a paspauskėt Ctrl-Shift-R (sėstemuo Apple Mac Cmd-Shift-R); IE: laikīdamė Ctrl paspauskėt Atnaujėntė, o paspauskėt Ctrl-F5; Konqueror: paprastiausē paspauskėt Perkrautė mīgtoka, o paspauskėt F5; Opera nauduotuojam gal prireiktė pėlnā ėšvalītė anū rėnktovė Rakondā→Nustatīmā.

// <nowiki>
( function () {

var wmFullText = 'Викификатор обработает ВЕСЬ текст на этой странице. Продолжить?',
	wmTalkPage = 'Викификатор не обрабатывает страницы обсуждения целиком.\n\nВыделите ваше сообщение — обработано будет только оно';
window.wfPlugins = window.wfPlugins || [];
window.wfPluginsT = window.wfPluginsT || [];


// Function takes an input or text as an argument. If it is absent, it uses $( '#wpTextbox1' )
// as an input.
window.Wikify = function ( inputOrText ) {
	'use strict';

	var $input, text, caretPosition, textScroll,
		txt = '',
		hidden = [],
		winScroll = document.documentElement.scrollTop,
		$CodeMirrorVscrollbar = $( '.CodeMirror-vscrollbar' );

	// Check what's in the first parameter
	if ( typeof inputOrText === 'string' ) {
		text = inputOrText;
	} else {
		$input = $( ( inputOrText &&
				( ( inputOrText.nodeType && inputOrText.value !== undefined ) || // node
					( inputOrText.prop && inputOrText.prop( 'nodeType' ) ) // jQuery object
				)
			) ?
			inputOrText :
			'#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;
			}
		}

		hideTag( 'nowiki' );
		hideTag( 'pre' );
		hideTag( 'source' );
		hideTag( 'syntaxhighlight' );
		hideTag( 'templatedata' );

		hideTag( 'code' );
		hideTag( 'kbd' );
		hideTag( 'tt' );

		hideTag( 'graph' );
		hideTag( 'hiero' );
		hideTag( 'math' );
		hideTag( 'timeline' );
		hideTag( 'chem' );
		hideTag( 'score' );
		hideTag( 'categorytree' );
		hideTag( 'inputbox' );
		hideTag( 'mapframe' );
		hideTag( 'maplink' );


// r(/( |\n|\r)+\{\{(·|•|\*)\}\}/g, '{{$2}}'); //before {{·/•/*}}, usually in templates
for (var i=1; i<=4; i++)
  hide(/\{\{[^\{\}]*?\}\}/g)//templates
hide(/^ .*/mg)
hide(/(https?|ftp|news|nntp|telnet|irc|gopher):\/\/[^\s\[\]<>"]+ ?/gi)
hide(/^#(redirect|nukreipimas)/i)
hideTag('gallery')

r(/ +(\n|\r)/g,'$1')// naikinami tarpai eilutės gale
txt = '\n'+txt+'\n'

//LINKS
r(/(\[\[:?)(category|kategorija):( *)/ig, '$1Kateguorėjė:') 
r(/(\[\[:?)(image|vaizdas|file):( *)/ig, '$1Abruozdielis:')

r(/(\(|\s)(\[\[[12]?\d{3}\]\]|[12]?\d{3})[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[12]?\d{3}\]\]|[12]?\d{3})(\W)(?![^\[\]]*\]\])/g, '$1$2–$4$5')
r(/(\[\[[12]?\d{3}\]\]) ?(m\.)/g, '$1'+u+'$2')
r(/(\(|\s)(\[\[[IVX]{1,5}\]\]|[IVX]{1,5})[\u00A0 ]?(-{1,3}|–|—) ?(\[\[[IVX]{1,5}\]\]|[IVX]{1,5})(\W)/g, '$1$2–$4$5')
hide(/\[\[[^\]\|]+/g)//links

//TAGS
r(/<<(\S.+\S)>>/g, '„$1“') //<< >>
r(/(sup>|sub>|\s)-(\d)/g, '$1-$2') //minus
r(/&sup2;/gi, '²')
r(/&sup3;/gi, '³')
r(/<(b|strong)>(.*?)<\/(b|strong)>/gi,"'''$2'''")
r(/<(i|em)>(.*?)<\/(i|em)>/gi,"''$2''")
r(/^<hr ?\/?>/gim, '----')
r(/<\/?(hr|br)( [^\/>]+?)? ?\/?>/gi, '<$1$2 />')


// r(/(\n== *[a-zа-я\s\.:]+ *==\n+)<references *\/>/ig,'$1{\{примечания}}')
hide(/<[a-z][^>]*?>/gi)

hide(/^({\||\|-).*/mg)//table/row def
hide(/(^\||^!|!!|\|\|) *[a-z]+=[^|]+\|(?!\|)/mgi)//cell style
hide(/\| +/g)//formatted cell

r(/[ \t]+/g,' ')//double spaces

// Headings
r(/^(=+)[ \t\f\v]*(.*?)[ \t\f\v]*=+$/gm, '$1 $2 $1') //add spaces inside
r(/([^\r\n])(\r?\n==.*==\r?\n)/g, '$1\n$2') //add empty line before
r(/^== (.+)[.:] ==$/gm, '== $1 ==')

// Brūkšnys
r(/(&nbsp;|\s)-{1,3} /g, '$1– ') // hyphen -> &mdash;
r(/(\d)--(\d)/g, '$1–$2') // -> &mdash;

// Raidės
r(/aa/gi,'ā')
r(/AA/gi,'Ā')
r(/ee/gi,'ē')
r(/EE/gi,'ē')
r(/y/gi,'ī')
r(/Y/gi,'Ī')
r(/oo/gi,'ō')
r(/OO/gi,'Ō')
r(/ėė/gi,'ė̄')
r(/ĖĖ/gi,'Ė̄')


// Entities etc. → Unicode chars
r(/&#x([0-9a-f]{1,4});/gi, function(n,a){return String.fromCharCode(eval('0x'+a.substr(-4)))})  //&#x301;
r(/&copy;/gi,'©')
r(/&reg;/gi,'®')
r(/&sect;/gi,'§')
r(/&euro;/gi,'€')
r(/&yen;/gi,'¥')
r(/&pound;/gi,'£')
r(/&deg;/g,'°')
r(/\(tm\)|&trade;/gi,'™')
r(/\.\.\.|&hellip;/g,'…')
r(/\+-(?!\+|-)|&plusmn;/g,'±')
r(/~=/g,'≈')
r(/\^2(\D)/g,'²$1')
r(/\^3(\D)/g,'³$1')
r(/&((la|ra|bd|ld)quo|quot);/g,'"')
r(/([\wа-яА-ЯёЁ])'([\wа-яА-ЯёЁ])/g,'$1’$2') //'
r(/№№/g,'№')

// Insert/delete spaces
r(/(\d)(?:[\u00A0 ]|\&nbsp\;)?((?:(?:m|c|d|k|M)?m|[km]g|in|W)(?:²|³)?\.?)(?=[,;. ]| "?[a-ząčęėįšųūž])/g, '$1'+u+'$2')
hide(/\&nbsp\;/g)
r(/^([#*:]+)[ \t\f\v]*(?!\{\|)([^ \t\f\v*#:;])/gm, '$1 $2') //space after #*: unless before table
r(/(\S) (-{1,3}|—|–) (\S)/g, '$1'+u+'– $3')
r(/([\"\)\]a-ząčęėįšųūž“]|\sm|\sd) ?(\.|\!|\?|…) ?([„\(\[\"A-ZĄČĘĖĮŠŲŪŽ])/g, '$1$2 $3')
r(/([\)\"a-ząčęėįšųūž\]“]) *([,;:]) ?([„\(\[\"a-ząčęėįšųūž])/g, '$1$2 $3')
r(/\( +/g, '('); r(/ +\)/g, ')') //inside ()

//Kabutės
//"" → «»
for (var i=1; i<=3; i++)
 r(/"([^\s"][^"]*[^\s"])"/ig, '„$1“') //"

//Temperature
r(/([\s\d=≈≠≤≥<>—("'|])([+±−-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])C)(?=[\s"').,;!?|])/gm, '$1$2'+u+'°C') //'
r(/([\s\d=≈≠≤≥<>—("'|])([+±−-]?\d+?(?:[.,]\d+?)?)(([ °^*]| [°^*])F)(?=[\s"').,;|!?])/gm, '$1$2'+u+'°F') //'

txt=txt.substr(1, txt.length-2)
if ('0'.replace('0','$$') == '$') ////$ in replacing string is special, except in IE
 for (var i=0; i<hidden.length; i++) hidden[i] = hidden[i].replace(/\$/g, '$$$$')
while (hidden.length>0) 
 r('\x01'+hidden.length+'\x02', hidden.pop())

 if (txt_old != txt)
   document.editform.wpSummary.value += ' [[Vikipedija:Vikifikatuorios|soriedīta]]'

}

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(RegExp('<' + tag + '( [^>]+)?>[\\s\\S]+?<\\/' + tag + '>','gi')) }

}

/ MAIN CODE

	if ( $input ) {
		$input.focus();
		
		caretPosition = $input.textSelection( 'getCaretPosition', { startAndEnd: true } );
		if ( caretPosition ) {
			textScroll = ( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input )
				.scrollTop();
			if ( caretPosition[0] === caretPosition[1] ) {
				processAllText();
			} else {
				txt = $input.textSelection( 'getSelection' );
				processText();
				// replaceSelection doesn't work with MediaWiki 1.30 in case this gadget is loaded
				// from other wiki
				$input.textSelection( 'encapsulateSelection', {
					replace: true,
					peri: txt
				} );
				// In CodeMirror, the selection isn't preserved, so we do it explicitly
				$input.textSelection( 'setSelection', {
					start: caretPosition[0],
					end: caretPosition[0] + txt.length
				} );
			}
			( $CodeMirrorVscrollbar.length ? $CodeMirrorVscrollbar : $input )
				.scrollTop( textScroll );
		// If something went wrong
		} else if ( confirm( wmFullText ) ) {
			processAllText();
		}
	} else {
		processAllText();
		return text;
	}

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


/* 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': mw.config.get( 'wgServerName' ) === 'bat-smg.wikipedia.org' ? 'gadgets' : 'insert',
		'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 () {
				if ( mw.config.get( 'wgServerName' ) === 'bat-smg.wikipedia.org' ) {
					mw.hook( 'wikieditor.toolbar.gadgetsgroup' ).add( addNewToolbarButton );
				} else {
					addNewToolbarButton();
				}
			} );
		} else {
			mw.hook( 'legacy.toolbar.ready' ).add( function () {
				$( addOldToolbarButton );
			});
		}
	} );
}


/* VisualEditor code */

window.createVEWikificatorTool = function () {
	// Create and register a command
	function WikifyCommand() {
		WikifyCommand.parent.call( this, 'wikificator' );
	}
	OO.inheritClass( WikifyCommand, ve.ui.Command );

	// Forbid the command from being executed in the visual mode
	WikifyCommand.prototype.isExecutable = function () {
		var surface = ve.init.target.getSurface();
		return surface && surface.getMode() === 'source';
	};

	WikifyCommand.prototype.execute = function ( surface ) {
		Wikify();
		return true;
	};

	if ( ve.ui.wikitextCommandRegistry ) {
		ve.ui.wikitextCommandRegistry.register( new WikifyCommand() );
	}

	// Create and register a tool
	function WikificatorTool() {
		WikificatorTool.parent.apply( this, arguments );
	}
	OO.inheritClass( WikificatorTool, ve.ui.Tool );

	WikificatorTool.static.name = 'wikificator';
	WikificatorTool.static.group = 'utility';
	WikificatorTool.static.title = 'Викификатор';
	WikificatorTool.static.icon = 'wikify';
	WikificatorTool.static.commandName = 'wikificator';
	WikificatorTool.static.autoAddToCatchall = false;
	WikificatorTool.static.deactivateOnSelect = false;

	WikificatorTool.prototype.onUpdateState = function () {
		WikificatorTool.parent.prototype.onUpdateState.apply( this, arguments );
		this.setActive( false );
	};

	ve.ui.toolFactory.register( WikificatorTool );
};

}() );
// </nowiki>