Wikisłownikarz:Peter Bowman/add-translations.js

Z Wikisłownika – wolnego słownika wielojęzycznego
Wersja z dnia 00:25, 23 kwi 2014 autorstwa Peter Bowman (dyskusja | edycje) (N)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
( function( mw, $ ) {
	var gadget = window.add_translations = {};
	
	var pageTitle, pageContent, pageDraft, api;
	var $transl, $defs;
	
	gadget.init = function( lang ) {
		$transl = $( 'dt.lang-pl.fldt-tlumaczenia' );
		$defs   = $( 'dd.lang-pl.fldt-znaczenia' );
		
		if ( $transl.length === 0 || $defs.length === 0 )
			return;
		
		this.lang = lang;
		this.defn = [];
		this.index = 0;
		this.langs = [];
		
		var err = false;
		
		$defs.each( function() {
			var def = $( this ).children( 'dfn' ).text();
			var m = def.match( /^(\(.*?\)) .*/ );
			
			if ( m[ 0 ] && m[ 1 ] ) {
				gadget.defn.push( m[ 1 ] );
			} else {
				err = true;
				return false;
			}
		} );
		
		if ( err )
			return;
		
		mw.loader.using( [ 'mediawiki.api', 'mediawiki.api.edit' ], function() {
			api = new mw.Api();
		} );
		
		pageTitle = mw.config.get( 'wgPageName' );
		
		api.get( {
			action: 'query',
			prop:   'revisions',
			format: 'json',
			rvprop: 'content',
			titles:  pageTitle
		} )
		.done( function( data ) {
			var id = mw.config.get( 'wgArticleId' );
			pageContent = data.query.pages[ id ].revisions[ 0 ][ '*' ];
		} )
		.done( analyzePage );
	};
	
	function analyzePage() {
		var a = pageContent.indexOf( ' ({{język polski' );
		var b = pageContent.indexOf( '\n== ', a );
		
		if ( a == -1 )
			return;
		
		var langSection = pageContent.substring( 0, ( b != -1 ) ? b : pageContent.length );
		var a2 = langSection.indexOf( '{{tłumaczenia}}\n', a );
		b = langSection.indexOf( '{{źródła}}', a2 );
		
		if ( a2 == -1 || b == -1 )
			return;
		
		var translations = langSection.substring( 0, b );
		var a3 = translations.indexOf( '\n* ', a2 );
		
		if ( a3 != -1 ) {
			var langlist = translations.substring( a3 + 1, b );
			var m = langlist.match( /[^\n]+/g );
			var langs = [];
			
			for ( var i = 0; i < m.length; i++ ) {
				var res = m[ i ].match( /^\* ([^:]+): .*/ );
				
				if ( res && res[ 1 ] && res[ 1 ] != gadget.lang )
					langs.push( res[ 1 ] );
				else
					return;
			}
			
			gadget.langs = langs;
			
			var targetLang = '* ' + getLangPos( langs ) + ': ';
			var a4 = translations.indexOf( targetLang, a3 );
			
			gadget.index = translations.indexOf( '\n', a4 ) + 1;
		} else {
			gadget.index = b;
		}
		
		createMenu();
	}
	
	function getLangPos( langs ) {
		var abc = 'aąbcćdeęfghijklłmnńoópqrsśtuvwxyzźż';
		var target = gadget.lang;
		var index = -1;
		
		outer:
		for ( var n = 0; n < langs.length; n++ ) {
			var lang = langs[ n ];
			
			inner:
			for ( var _char = 0; _char < lang.length; _char++ ) {
				var p1 = abc.indexOf( target[ _char ] );
				var p2 = abc.indexOf( lang[ _char ] );
				
				if ( p1 > p2 ) {
					index++;
					continue outer;
				} else if ( p1 === p2 ) {
					continue inner;
				} else {
					break outer;
				}
			}
		}
		
		return langs[ index ];
	}
	
	function createMenu() {
		var $button = $( '<small>' )
			.text( '(dodaj)' )
			.attr( 'id', 'transl-addbutton' )
			.css( {
				'cursor':      'pointer',
				'font-weight': 'normal',
				'padding':     '0 0 0 5px'
			} );
		
		var $changes = $( '<div>' )
			.css( {
				'margin':         '5px',
				'vertical-align': 'middle',
				'display':        'inline-block'
			} );
		
		for ( var i = 0; i < gadget.defn.length; i++ ) {
			$( '<div>' )
				.attr( 'title', gadget.defn[ i ] )
				.append( [
					gadget.defn[ i ],
					$( '<input>' )
						.attr( {
							'type': 'text',
							'size': 70
						} )
						.css( 'margin', '0 5px' ),
					$( '<input>' )
						.attr( {
							'type': 'text',
							'size': 1
						} )
				] )
				.appendTo( $changes );
		}
		
		var $preview = $( '<div>' )
			.css( {
				'display':    'block',
				'width':      '100%',
				'text-align': 'center',
				'margin':     '10px'
			} )
			.html( '<b>Podgląd zmian</b><br><tt class="transl-preview"></tt>' );
			
		var transl;
		
		var $apply = $( '<input>' )
			.attr( {
				'type':  'submit',
				'value': 'Pokaż zmiany'
			} )
			.css( {
				'margin':  '10px 0',
				'display': 'block'
			} )
			.click( function( evt ) {
				evt.preventDefault();
				var out = [];
				$changes
					.children()
					.each( function() {
						var $this = $( this );
						var $inputs = $this.children();
						var text = $inputs.first().val();
						var tmpl = $inputs.last().val();
						
						if ( !text )
							return true;
						
						out.push(
							$this.attr( 'title' ) +
							text.replace( / ?([^,]+)/g, ' [[$1]]' ) +
							( tmpl ? ' {{' + tmpl + '}}' : '' )
						);
					} );
				
				transl = gadget.lang + ': ' + out.join( '; ' ) + '\n';
				pageDraft = pageContent.substring( 0, gadget.index ) +
					'* ' + transl +
					pageContent.substring( gadget.index, pageContent.length );
					
				$preview.children( 'tt' ).text( '* ' + transl );
			} );
			
		var $submit = $( '<input>' )
			.attr( {
				'type':  'submit',
				'value': 'Zapisz'
			} )
			.css( {
				'margin':  '10px 0',
				'display': 'block'
			} )
			.click( function( evt ) {
				evt.preventDefault();
				api.postWithEditToken( {
					action:    'edit',
					title:     pageTitle,
					text:      pageDraft,
					summary:   '(skrypt) dodano tłumaczenie na ' + transl,
					watchlist: 'watch'
				} )
				.done( function() {
					window.location.reload();
				} );
			} );
		
		var $editbox = $( '<div>' )
			.attr( 'id', 'transl-editor' )
			.css( {
				'width':            '100%',
				'border':           '1px solid black',
				'background-color': '#F9F9F9',
				'margin-top':       '5px',
				'font-weight':      'normal',
				'display':          'none'
			} )
			.append( [
				$( '<div>' )
					.html( 'tłumaczysz<br><b>' + gadget.lang + '</b>' )
					.css( {
						'text-align':     'center',
						'vertical-align': 'middle',
						'margin':         '5px',
						'display':        'inline-block'
					} ),
				$changes,
				$( '<div>' )
					.css( {
						'text-align':     'center',
						'vertical-align': 'middle',
						'margin':         '5px',
						'display':        'inline-block'
					} )
					.append( $apply, $submit ),
				$preview
			] );
			
		$transl
			.append( [
				$( '<div>' )
					.attr( 'id', 'transl-buttons' )
					.css( {
						'display': 'inline',
						'margin':  '0 5px'
					} )
					.append( $button ),
				$editbox
			] )
			.children( 'span#transl' )
			.css( 'display', 'inline' );
		
		$button.click( function() {
			$editbox.toggle();
		} );
	}
} ) ( mediaWiki, jQuery );