Wikisłownikarz:Peter Bowman/add-translations.js
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 );