MediaWiki:Common.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
// ----------------------------------------------------------------
// Code to add Auto-Translate-Button on translation-page - START
$("<div style='float:right;margin:6px'><button id='startAutoTranslate' onclick='onAutoTranslateClick();'>Auto-Translate</button>"
+"<span id='autoTranslateRunning' style='display:none' >Translation running, please wait...</span></div>")
.insertAfter(".ext-translate-language-selector");
function onAutoTranslateClick(){
var config = mw.config.get("wgForTrainingToolsAutoTranslateUrl");
if(!config) {
alert("AutoTranslateBot is currently not available. Please ask an administrator for help.");
return; //no config available -> cancel
}
var pageName = getPageNameFromTranslationPage();
showTranslationRunning(true);
console.log("Autotranslate page='"+pageName+"'");
var postArgs = { page: pageName};
mw.notify($("<p>AutoTranslateBot is automatically translating the whole worksheet. This may take a while. We hope this will give you a good start. Thank you for your patience and all your work!</p>"),
{ title: 'Processing...', type: 'info'}
);
$.post(config, postArgs)
.done( function( data ) {
mw.notify($("<p>"+data+"<br/>Click <b><a href='"+window.location+"'>here to reload this page</a></b>.</p>"), { title: 'Success!', type: 'info', autoHide: false});
showTranslationRunning(false);
})
.fail( function() {
alert('Unkown error while trying to run AutoTranslateBot! Please ask an administrator for help.');
showTranslationRunning(false);
});
}
function showTranslationRunning(isRunning){
if(isRunning){
$("#startAutoTranslate").hide();
$("#autoTranslateRunning").show();
}
else{
$("#startAutoTranslate").show();
$("#autoTranslateRunning").hide();
}
}
function getPageNameFromTranslationPage(){
var language = $(".ext-translate-target-language").attr("lang");
var urlGroupParam = new URLSearchParams(window.location.search).get("group");
var rawPage = decodeURIComponent(urlGroupParam).replaceAll(" ", "_").slice("page-".length);
return rawPage +"/"+language;
}
/* Code to add Auto-Translate-Button on translation-page - END */
// ----------------------------------------------------------------
/* Code to add CorrectBot-Button on last translations-unit - START */
//Install Button if cancel-button shows up
function waitForElement(selector, onPresent){
console.log("element '"+selector+"' missing, waiting for it...");
var element = $(selector);
if(element.length > 0){
console.log("elemen '"+selector+"' detected");
onPresent(element);
}
else{
setTimeout(function(){ waitForElement(selector, onPresent);},1000); //active wait, because we want to support jquery-selectors
}
}
waitForElement(".tux-editor-cancel-button:visible",function(cancelButton){
var button = $("<button class='mw-ui-button mw-ui-quiet' onclick='onRunCorrectBotClick(this);'>Run Correct-Bot</button>");
$(".tux-editor-cancel-button:visible").parent().append(button);
});
function onRunCorrectBotClick(button){
var pageName = getPageNameFromTranslationPage();
console.log("Autotranslate page='"+pageName+"'");
var postArgs = { page: pageName };
mw.notify($("<p>CorrectBot is working hard to make the translation even better. " +
"He's fast and should be finished within seconds, then you'll get another notification. " +
"Thank you for your patience and all your work!</p>"), { title: 'Processing...', type: 'info'});
$.post(mw.config.get('wgForTrainingToolsCorrectBotUrl'), postArgs)
.done( function( data ) {
var nothing_saved = data.indexOf('NOTHING SAVED.');
if (nothing_saved > -1) {
// CorrectBot didn't save anything. In the next line is the reason, let's get it
var reason = data.substring(nothing_saved + 14).split(/\n/, 3)[1]
mw.notify($('<p>' + reason + '<br/>' +
'You may want to look at the <a href="/CorrectBot:' + pageName +
'">previous CorrectBot report</a></p>'),
{ title: 'Nothing saved!', type: 'info', autoHide: false});
} else {
// .* doesn't match newlines, so we use the workaround [\s\S]*
var matches = data.match(/(\d+) correction[\s\S]*?(\d+) suggestion[\s\S]*?(\d+) warning/);
if (matches != null) {
mw.notify($('<p>CorrectBot did ' + matches[1] + ' corrections and had '
+ matches[2] + ' suggestions and '
+ matches[3] + ' warnings. ' +
'Please check the <a href="/CorrectBot:' + pageName +
'">CorrectBot report</a> for details.</p>'),
{ title: 'Success!', type: 'info', autoHide: false});
} else {
mw.notify($('<p>CorrectBot failed. Please contact an administrator. Log:</p><p>' + data + '</p>'),
{ title: 'Error!', type: 'info', autoHide: false});
}
}
})
.fail( function() {
alert('Unkown error while trying to run CorrectBot! Please ask an administrator for help.');
});
}
/* Code to add CorrectBot-Button on last translations-unit - END */
// ----------------------------------------------------------------
/* Code to add Apply/Edit/Discard-Buttons under Suggestions of the CorrectBot-Page - START */
var suggestionButtonsCss = "cursor:pointer;border: 1px solid currentColor;border-radius:3px;padding:2px;";
var suggestionButtonsHtml = '<tr><td/><td/><td/><td>'
+'<span onclick="applyChange(this);" style="'+suggestionButtonsCss+'color:green">✓ Apply</span> '
+'<span onclick="editChange(this);" style="'+suggestionButtonsCss+'color:black">🖉 Edit</span> '
+'<span onclick="discardChange(this)" style="'+suggestionButtonsCss+'color:red">🗙 Discard</span>'
+'</td></tr>';
var suggestionTables = [];
// Find all suggestion-tables
// As the suggestion-headline is the only indicator. Therefore we have to start from there and find only the tables between
// the Suggestion-Headline and the next one (usually "Corrections"). Note that it is <h2><span id="#Suggestions"/></h2>
var suggestionsIndex = $("#Suggestions").parent().index(); //Index of Suggestions-Headline-elements in their parents
$("#Suggestions").parent().siblings().each(function(index){
if(index <= suggestionsIndex){ return; } // Not past suggestions-headline yet -> skip
if(this.matches("table.diff")){
suggestionTables.push(this); //Relevant table for Suggestions found
}
if(this.matches("h2")){
return false; //Next headline detected. Cancel loop
}
});
// Add buttons beneath
suggestionTables.forEach(function(table){
var tbody= $(table).children("tbody")[0];
if(!tbody) return;
$(table).append(suggestionButtonsHtml);
});
// Implement buttons-functions
function discardChange(span){
var jTable = $(span).parent().closest('table'); //search table relative to given span
var jHeader = jTable.prev();
jTable.hide();
jHeader.hide();
}
function applyChange(span){
var jTable = $(span).parent().closest('table'); //search table relative to given span
var jHeader = jTable.prev();
var title = jHeader.children("span.mw-headline").attr("id"); //Current links do NOT encode the title, so no encoding here also
var text = jTable.find('.diff-addedline div').text(); //to displayed, escaped string to remove all diff-elements
var csrfToken = mw.user.tokens.get('csrfToken');
$.post("/mediawiki/api.php", { action:"edit", format:"json", title:title, text:text, token:csrfToken },
function(response){
var isSuccess = response["edit"] && response["edit"]["result"] === "Success";
if(isSuccess){
discardChange(span);
}
else{
var error = response.error ? (response.error.code+" - "+response.error.info) : "(unknown error)";
alert("Could not apply change. Wikimedia-Error: "+error);
}
})
.fail(function(jqXHR, textStatus, errorThrown){
alert("Could not apply change. Network-Error: status="+textStatus+" errorThrown="+errorThrown);
});
}
function editChange(span){
var jTable = $(span).parent().closest('table'); //search table relative to given span
var jHeader = jTable.prev();
var editLink = jHeader.find("a");
window.open(editLink.attr("href"));
}
/* Code to add Apply/Edit/Discard-Buttons under Suggestions of the CorrectBot-Page - END */
/* Any JavaScript here will be loaded for all users on every page load. */
mw.loader.load('mediawiki.diff.styles');