User:Gryllida/ExternalTranslate.js

// So that this doesn't interfere with var names of anything else if (typeof ExternalTranslate === "undefined") ExternalTranslate = {}; if (!ExternalTranslate.l18n) { ExternalTranslate.l18n = { tab: 'Translate', tab_tooltip: 'Translate this page to another language.', } } ExternalTranslate.init = function { mw.util.addPortletLink(       "p-cactions",         "javascript:ExternalTranslate.init.start;void%200;",        ExternalTranslate.l18n.tab,        "ca-orNotes",        ExternalTranslate.l18n.tab_tooltip    ); importStylesheet('User:Gryllida/ExternalTranslate.css'); };

if(!ExternalTranslate.Loader) ExternalTranslate.Loader = {};

ExternalTranslate.Loader.loadOriginal = function { // XXX Make proper use of MediaWiki API here. var page; // Retrieve HTML for the translate interface (new mw.Api).get( {       prop: 'revisions',        rvprop: 'content',        rvlimit: 1,        indexpageids: true,        titles: mw.config.get('wgPageName')    } ) .done( function ( json ) {       $.each(json.query.pages, function (pageid, page) { page = page.revisions[0]['*']; $.each(page.split("\n"), function (num, line) {               if ($.trim(line).length != 0){                    var td = $("  ");                    ExternalTranslate.DOM.markup2box(line, td);                    // XXX Localise                    tr = $('   Preview &times; +    ');                    tr.prepend(td);                    $('#table1').append(tr);                }            }); });   });    //    var apiUrl = 'https://'+$('#lang_from').val+'.'+$('#project_name').val + '.org/w/api.php?action=query&prop=revisions&rvprop=content&format=json&callback=?&titles='; //   var url = apiUrl + encodeURIComponent($('#headline_from').val); $('#preview_button').prop('disabled', false); }

ExternalTranslate.Loader.displayPreview = function { $('#field2').text(''); var markup=""; $('.copy').each(function (index, field){       if ($(field).val != ""){            ExternalTranslate.DOM.markup2box($(field).val, $('#field2'));        }    }); ExternalTranslate.DOM.markup2html2box($('#field2').text, $('#preview_cell')); }

if(!ExternalTranslate.DOM) ExternalTranslate.DOM = {};

ExternalTranslate.DOM.displaySmallPreview = function (button_obj){ var parent = $(button_obj).parent; ExternalTranslate.DOM.markup2html2box(parent.find(">:first-child").val, parent.next); }

ExternalTranslate.DOM.markup2html2box = function(markup, box){ var url = 'https://'+$('#lang_to').val+'.'+$('#project_name').val+'.org/w/api.php?action=parse&format=json&text='+encodeURIComponent(markup)+'&prop=text&format=json&callback=?'; var html; prefix = "https://"+$('#lang_to').val+'.'+$('#project_name').val+'.org'; $.getJSON(url, function(json) {       html = $($.parseHTML(json.parse.text['*']));        html.find('a').attr('href', function(i, attr) { return prefix + attr; });       html.find('img').attr('src', function(i, attr) { return 'https:' + attr; });       box.html(html);        // $(w.document.body).html(html); // popups are not usable    }); }

ExternalTranslate.DOM.markup2box = function(markup, box){ // box.text(markup).html; box.append(document.createTextNode(markup)); box.append("\n\n"); }

ExternalTranslate.DOM.deleteRow = function(button){ $(button).parent.parent.remove; }

ExternalTranslate.DOM.addRow = function(button){ $('    Preview - +    ').insertAfter($(button).parent.parent); }

if(!ExternalTranslate.Translator) ExternalTranslate.Translator = {};

ExternalTranslate.Translator.translateWord = function{ var url = "https://"; url += $('#lang_from').val; url += ".wikipedia.org/w/api.php?action=query&prop=langlinks&titles="; url += encodeURIComponent($('#word').val); url += "&redirects=&lllang="; url += $('#lang_to').val; url += "&format=json&callback=setResult"; $('#word2').html('...'); $.getScript(url); }

ExternalTranslate.init.start = function{ mw.util.$content.empty;

// Retrieve HTML for the translate interface (new mw.Api).get( {       prop: 'revisions',        rvprop: 'content',        rvlimit: 1,        indexpageids: true,        titles: 'User:Gryllida/ExternalTranslate.html'    } ) .done( function ( data ) {       var q = data.query,                id = q && q.pageids && q.pageids[0],                pg = id && q.pages && q.pages[ id ],                rv = pg && pg.revisions;        if ( rv && rv[0] && rv[0]['*'] ) {            wikitext = rv[0]['*'];            mw.util.$content.prepend(wikitext);

// Put variables // XXX DEBUG ONLY $('#project_name').val(mw.config.get('wgSiteName')); // $('#project_name').val(mw.config.get('wgSiteName')); $('#headline_from').val(mw.config.get('wgTitle')); $('#headline_from').prop('readonly', true); $('#lang_from').val(mw.config.get('wgPageContentLanguage')); $('#lang_from').prop('readonly', true);

// Enable load and preview buttons after input is complete var input = $('.required'); input.on('keyup', function {               if(input.filter(function { return $(this).val == ''; }).length > 0) { return; }                $('#load_button').prop('disabled', false);                $('#preview_button').prop('disabled', false);            });

// Enable events for buttons // XXX Could make more use of 'this'? $('#load_button').on('click',ExternalTranslate.Loader.loadOriginal); $('#preview_button').on('click',ExternalTranslate.Loader.displayPreview); $('#translateWordButton').on('click',ExternalTranslate.Translator.translateWord); $('#go_to_target_wiki').on('click',ExternalTranslate.Loader.goTarget); }   } );    // XXX    // .fail( mw.util.$content.prepend( 'The API request request failed.' ) ); }

/** * CORS cross-site editing example */ ExternalTranslate.Loader.editForeignPage = function(info) { // Custom hooks for edit success / failure (e.g., console.log) var errorHook = typeof info.error === 'function', // has error function? successHook = typeof info.success === 'function'; // has success hook? // Most "modern" browsers except IE support CORS if (!$.support.cors) { info.error('Your browser does not support CORS! Try Firefox.', 'cors'); return; }   // Get the foreign edit token $.ajax({       url: info.url, // e.g. "//ru.wikipedia.org/w/api.php"        dataType: 'json',        data: {            action: 'tokens',            type: 'edit',            format: 'json',            origin: location.origin        },        success: function (data) { // if we get the token            var params;            // Handle various possible errors (possibly not needed)            if (!(data && data.tokens && data.tokens.edittoken) && errorHook) {                info.error(data, 'token');                return;            }            params = {                format: 'json',                action: 'edit',                title: info.title,                summary: info.summary,                origin: location.origin,                assert: 'user', // must be logged in!                token: data.tokens.edittoken            };            params[info.editaction] = info.text;            $.ajax({ url: info.url, type: 'POST', dataType: 'json', data: params, xhrFields: { // CORS XHR magic withCredentials: true }           })                .done(function (data) { // Success! Run the success function passed in ``info'' if (data && data.edit && data.edit.result && data.edit.result === 'Success' && successHook) { info.success(data); } else if (errorHook) { // error, so run error hook info.error(data, 'edit'); }               })                .fail(function  { // other failure if (errorHook) { info.error(null, 'other'); }               });        },        xhrFields: { // CORS XHR magic            withCredentials: true        }    }); };

ExternalTranslate.Loader.goTarget = function{

// XXX debug only!!! // mw.config.get('wgSiteName') console.log('goTarget ...'); var url = '//' + $('#lang_to').val + "." + mw.config.get('wgSiteName') + ".org/w/api.php"; console.log(url);

ExternalTranslate.Loader.editForeignPage({   url: url,    title: $('#targetName').val,    summary: +$(,    editaction: 'text', // or prependtext, text (replace)    text: $('#field2').val,    success: function (data) {        var diff = encodeURIComponent(data.edit.newrevid),            cont = confirm('Your edit was successful! OK to view diff'),           protocol = location.href.split('//')[0];        if (cont) {            location.href = protocol + '//'+ $('#lang_to').val + "." + mw.config.get('wgSiteName') + '.org/?diff=' + diff;        }    },    error: function (data, errortype) {        alert('An error occurred! Type: ' + errortype + '; details: ' + data);       console.error(data);    } });

}; //&& wgNamespaceNumber === 0 && wgUserGroups.toString.indexOf("editor") > -1 //if (wgAction === "view" ) { $(ExternalTranslate.init); //}