MediaWiki:Gadget-TransQuickChange.js
Note : après aveur schapé l’ pådje, vos l’ divoz rafrister, po pleur vey les candjmints dins vosse betchteu waibe.
- Firefox / Safari : tchôkîz so Shift tot clitchant so Rafrister, ou co fjhoz Ctrl-F5 ou Ctrl-R (⌘-R so on Mac)
- Google Chrome : tchôkîz so Ctrl-Shift-R (⌘-Shift-R so on Mac)
- Internet Explorer / Edje : tchôkîz so Ctrl tot clitchant so Rafrister, ou co fjhoz Ctrl-F5
- Konqueror : clitchîz so Rafrister ou tchôkîz so F5
- Opera : alez dins Menu → Parametes (Opera → Preferinces so on Mac), pus dins Confidance et såvrité → Vudîz les dnêyes d’ vizitaedje → Imådjes et fitchîs metous el muchete.
TransQuickChange = {
buttons : {
add : '+',
cancel : '×',
change : '±'
},
messages : {
summary: 'candjmint avou [[Mediawiki:Gadget-TransQuickChange.js|TransQuickChange]]',
addBtnTitle: 'Clitchîz cial po radjouter on ratournaedje',
cancelBtnTitle: 'Clitchîz cial po rsaetchî l’ roye',
changeBtnTitle: 'Clitchîz cial po candjî l’ tite',
saveBtnTitle: 'Clitchîz cial po schaper les candjmints',
saveBtn: 'ok',
addTrans: 'radjouter on ratournaedje',
fieldTitleEmpty: 'gn a co rén vaici',
error:'Ops ! On direut bén k’ gn a-st ene aroke !',
errorLangExists: 'Ratournaedje dedja dné po c’ lingaedje !',
errorTransEmpty: 'Ratournaedje vude !',
errorLangEmpty: 'Lingaedje vude !',
errorLangUnknown: 'Lingaedje nén ricnoxhou !',
errorNoChange: 'Nou candjmint !'
},
tmptag : '<TMPRATOUR>',
error : false,
searchLangItem : function (item, field) {
var code = item[0];
var lang = item[1];
lang = $('<div>').html(lang).text(); //decode html entities
var sug_code = $("<span>").addClass('TQC-suglangcode').text(code);
var sug_lang = $("<span>").text(lang);
var sug = $("<div>").addClass('TQC-suglangitem');
sug.click(function (event){
TransQuickChange.errorClear();
if(TransQuickChange.params[code] !== undefined){
TransQuickChange.errorMsg(
TransQuickChange.messages.errorLangExists,
$(this).parents().eq(2)
);
}
$(field).val(lang).data('langcode', code);
$(field).focus();
$('.TQC-suglang').remove();
});
sug.append(sug_code,sug_lang);
return sug;
},
searchLang : function (str, field) {
if (str.length < 2) {
$('.TQC-suglang').remove();
return false;
}
var sugs = $("<div>").addClass('TQC-suglang');
sugs.mouseenter(function(){
TransQuickChange.searchLang.over = true;
});
sugs.mouseleave(function(){
TransQuickChange.searchLang.over = false;
});
str = str.toLowerCase();
langs=[];
new mw.Api().get({
format: "json",
action: "parse",
contentmodel: "wikitext",
wrapoutputclass: "",
disablelimitreport: "1",
prop: "text",
text:'{{#invoke:Lingaedje/djivêye|search_json|'+str+'}}'
}).done(function(results) {
$('.TQC-suglang').remove();
results = results.parse.text['*'];
results = results.substring(5, results.length-6);
try {
langs=JSON.parse(results);
} catch (e) {
console.log('TransQuickChange:searchLang() parsing json failed');
}
for(i=0; i<langs.length; i++){
var item = langs[i];
item = TransQuickChange.searchLangItem(item, field);
sugs.append(item);
}
if(langs.length){
$(field).after(sugs);
}
});
},
title : function (title) {
if(title !== undefined){
TransQuickChange.params[0] = title;
return;
}
return (TransQuickChange.params[0]!==undefined)
? TransQuickChange.params[0] : '';
},
splitParam : function (param) {
elems = param.split('=');
if(elems.length==1){
return param.trim();
}
else if(elems[0].indexOf('{{')!==-1){
return elems.join('=').trim();
}
else{
key = elems.shift().trim();
return [key, elems.join('=').trim()];
}
},
getParams : function () {
TransQuickChange.errorClear();
var str = TransQuickChange.template;
var params = [];
var duplicate = [];
var paramNumCount=0;
var open = 0;
var buffer = '';
str = str.substring(str.indexOf('|')+1, str.length-2);
for(i=0;i<=str.length;i++){
if($.inArray(str[i],['{','['])!==-1){open++;}
else if($.inArray(str[i],['}',']'])!==-1){open--;}
if(i == str.length || (open === 0 && str[i] == '|')){
param = TransQuickChange.splitParam(buffer);
if(typeof param == 'object'){
if(params[param[0]]!==undefined){
if(duplicate[param[0]]===undefined){
duplicate[param[0]] = 2;
}else{
duplicate[param[0]]++;
}
}
params[param[0]] = param[1];
}
else if(typeof param == 'string'){
params.push(param);
paramNumCount++;
}
buffer='';
continue;
}
buffer += str[i];
}
TransQuickChange.params = params;
if(Object.keys(duplicate).length){
for (const key in duplicate) {
TransQuickChange.errorMsg(
'Gn a '+duplicate[key]+' côps l’ paramete « '+key+' » el wikicôde',
TransQuickChange.elem.find('.TQC-transadd')
);
}
}
if(paramNumCount > 1){
TransQuickChange.errorMsg(
'Gn a '+paramNumCount+' parametes sins no el wikicôde',
TransQuickChange.elem.find('.TQC-transadd')
);
}
if(TransQuickChange.error &&
!$(TransQuickChange.elem).find('.TBox-content').is(':visible')){
$(TransQuickChange.elem).find('.TBox-content').show();
}
},
setRatour : function () {
TransQuickChange.wikicode = TransQuickChange.wikicode.replace(
TransQuickChange.tmptag,
TransQuickChange.template
);
},
getRatour : function () {
if(TransQuickChange.wikicode!==undefined){
TransQuickChange.setRatour();
}
var wikicode = TransQuickChange.wikicode;
const template = '{{ratour';
const w = TransQuickChange.index + 1;
var i=0;
var j=0;
while(i!==-1 && j!==w){
i = wikicode.indexOf(template, i+1);
if(!/^\s*\|/.test(wikicode.substring(i+template.length))){continue;}
j++;
}
if(i===-1){
return false;
}
var str = wikicode.substring(i);
var open=0;
for(j=0; j<str.length; j++){
if(str[j]=='{'){
open++;
}
else if(str[j]=='}'){
open--; if(!open){break;}
}
}
TransQuickChange.template = str.substring(0,j+1);
tmp = wikicode.substring(0,i);
tmp+=TransQuickChange.tmptag;
tmp+=wikicode.substring(i+j+1);
TransQuickChange.wikicode = tmp;
TransQuickChange.getParams();
},
parseWikicode : function (wikicode) {
if(!wikicode || wikicode === ''){
return false;
}
new mw.Api().get({
format: 'json',
action: 'parse',
contentmodel: 'wikitext',
wrapoutputclass: '',
disablelimitreport: '1',
prop: 'text',
text:wikicode,
}).done(function(results) {
results = results.parse.text['*'];
var titleWikicode = $('<div>').html(results).text().trim();
var titleHtml = $(TransQuickChange.elem).find('.TQC-titleval').text().trim();
if(titleWikicode !== '' && titleWikicode.indexOf(titleHtml)===-1){
TransQuickChange.disableForm();
}
});
},
getWikicode : function (from_title) {
if(TransQuickChange.wikicode !== undefined){
TransQuickChange.getRatour();
if(from_title){
TransQuickChange.addTitleField();
}
return true;
}
new mw.Api().get({
action: 'query',
titles: mw.config.get('wgPageName'),
prop: 'revisions',
rvprop: 'content',
formatversion: 2,
}).done(function(results) {
var content = results.query.pages[0].revisions[0].content;
if(content !== ''){
TransQuickChange.wikicode = content;
TransQuickChange.getRatour();
if(from_title){
TransQuickChange.addTitleField();
}
}
});
},
checkForm : function () {
TransQuickChange.errorClear();
var title = TransQuickChange.title();
var title_field = $(TransQuickChange.elem).find('.TQC-titleform input');
var trans_fields = $(TransQuickChange.elem).find('.TQC-trans');
var params_tmp = [];
if(title_field.length){
var title_field_val = title_field.val().trim();
if(title == title_field_val){
TransQuickChange.errorMsg(TransQuickChange.messages.errorNoChange);
}
}
if(trans_fields.length){
$(trans_fields).each(function(){
var lang = $(this).find('.TQC-langfield').val().trim();
var langcode = $(this).find('.TQC-langfield').data('langcode');
var trans = $(this).find('.TQC-transfield').val().trim();
if(lang == ""){
TransQuickChange.errorMsg(TransQuickChange.messages.errorLangEmpty,this);
}
else if(langcode === undefined || langcode ==""){
TransQuickChange.errorMsg(TransQuickChange.messages.errorLangUnknown,this);
}
else if(TransQuickChange.params[langcode] !== undefined){
TransQuickChange.errorMsg(TransQuickChange.messages.errorLangExists,this);
}
else if(trans ==""){
TransQuickChange.errorMsg(TransQuickChange.messages.errorTransEmpty,this);
}
else{
trans = '{{t+|'+langcode+'|'+trans+'}}';
params_tmp[langcode]=trans;
}
});
}
if(!TransQuickChange.error){
if(title_field_val !== undefined){
TransQuickChange.title(title_field_val);
}
if(Object.keys(params_tmp).length){
TransQuickChange.params = Object.assign(
TransQuickChange.params,
params_tmp
);
}
TransQuickChange.updateWikicode();
}
},
updateWikicode : function () {
TransQuickChange.makeTemplate();
var wikicode = TransQuickChange.wikicode;
if(wikicode.indexOf(TransQuickChange.tmptag) !== -1){
TransQuickChange.errorMsg();
console.log('TransQuickChange:updateWikicode() special tag TMPRATOUR found');
return false;
}
new mw.Api().post({
action: 'edit',
title: mw.config.get('wgPageName'),
summary: TransQuickChange.messages.summary,
text: wikicode,
token: mw.user.tokens.get('csrfToken'),
}).done(function( msg ) {
document.location.reload();
});
},
makeTemplate : function () {
var template = '{{ratour|';
for(const key in TransQuickChange.params){
var val = TransQuickChange.params[key];
if(Number.isInteger(Number.parseInt(key))){
if(key == '0'){
template += val+'\n';
continue;
}
//template += '|'+val+'\n'; NI SIEVE A RÉN
}
else{
template += '|';
template += [key,val].join(' = ');
template += '\n';
}
}
template +='}}';
TransQuickChange.wikicode = TransQuickChange.wikicode.replace(
TransQuickChange.tmptag,
template
);
},
addTitleField : function () {
if(TransQuickChange.elem === undefined){
return false;
}
var form = $('<span>').addClass('TQC-titleform');
var title = $(TransQuickChange.elem).find('.TQC-title')
var button = $('<button>').attr({
class : 'TQC-titlebtn TQC-cancelbtn',
title : TransQuickChange.messages.cancelBtnTitle,
}).text(TransQuickChange.buttons.cancel);
button.click(function(event){
TransQuickChange.getElem(this);
form.remove();
title.show();
TransQuickChange.addSaveBtn();
event.stopPropagation();
});
var field = $('<input>').attr({
type: 'text',
placeholder: TransQuickChange.messages.fieldTitleEmpty
});
if(TransQuickChange.params !== undefined){
title.hide();
field.val(TransQuickChange.title());
form.append(button, field);
form.click(function(){return false;});
title.after(form);
TransQuickChange.parseWikicode(TransQuickChange.title());
TransQuickChange.addSaveBtn();
}
},
addTransFields : function () {
if(TransQuickChange.elem === undefined){
return false;
}
var div = $('<div>').addClass('TQC-trans');
var button = $('<button>').attr({
class : 'TQC-titlebtn TQC-cancelbtn',
title : TransQuickChange.messages.cancelBtnTitle,
}).text(TransQuickChange.buttons.cancel);
button.click(function(){
$(this).parent().remove();
TransQuickChange.addSaveBtn();
});
var field_lang = $('<input>').attr({
class : 'TQC-langfield',
placeholder : 'lingaedje'
});
field_lang.keyup(TransQuickChange.keyupdelay(function (event) {
var val = $(this).val();
TransQuickChange.searchLang(val, this);
}, 500));
field_lang.focus(function(){TransQuickChange.getElem(this)});
field_lang.focusout(function(){
if(TransQuickChange.searchLang.over !== true){
$('.TQC-suglang').remove();
}
});
var field_lang_container = $('<span>').css({
position:'relative'
});
field_lang_container.append(field_lang);
var field_trans = $('<input>').attr({
class : 'TQC-transfield',
placeholder : 'ratournaedje'
});
field_trans.focus(function(){TransQuickChange.getElem(this)});
div.append(button, ' ', field_lang_container,' : ',field_trans);
$(TransQuickChange.elem).find('.TQC-transadd').before(div);
},
addSaveBtn : function () {
$('.TQC-savebtn').remove();
var save = $('<button>');
save.text(TransQuickChange.messages.saveBtn);
save.attr('title', TransQuickChange.messages.saveBtnTitle);
save.addClass('TQC-savebtn');
save.click(function(){
TransQuickChange.checkForm();
});
var form = $(TransQuickChange.elem).find('.TQC-titleform');
if($(TransQuickChange.elem).find('.TQC-trans').length){
save.css({position:'absolute',top:'5px',right:'5px'});
$(TransQuickChange.elem).find('.TQC-transcontainer').append(save);
}
else{
form.append(' ', save);
}
},
addTransBtn : function () {
$('.TBox-ratour').each(function(i) {
var div = $('<div>').addClass(['TBox-content','TQC-transcontainer']);
var div_add = $('<div>').addClass('TQC-transadd');
var button = $('<button>').attr({
class : 'TQC-addbtn',
title : TransQuickChange.messages.addBtnTitle
}).text(TransQuickChange.buttons.add);
button.click(function(){
TransQuickChange.getElem(this);
TransQuickChange.getWikicode();
TransQuickChange.addTransFields();
TransQuickChange.addSaveBtn();
return false;
});
div_add.append(button, TransQuickChange.messages.addTrans);
div.append(div_add);
if($(this).find('.TBox-content').is(':visible')){
div.css('display','none');
}
$(this).append(div);
});
},
addTitleBtn : function () {
var button = $('<button>').attr({
class : 'TQC-titlebtn',
title : TransQuickChange.messages.changeBtnTitle
}).text(TransQuickChange.buttons.change);
button.click(function(event){
TransQuickChange.getElem(this);
TransQuickChange.getWikicode(true);
event.stopPropagation();
});
$('.TQC-title').prepend(button);
},
disableForm : function () {
$(TransQuickChange.elem).find('input, button')
.prop('disabled', true);
TransQuickChange.errorMsg();
},
getElem : function (elem) {
$(elem).parents().each(function(i){
if($(this).hasClass('TBox-ratour')){
elem = $(elem).parents().eq(i);
var index = $('.TBox-ratour').index(elem);
if(TransQuickChange.index !== undefined && TransQuickChange.index != index){
TransQuickChange.reset();
}
TransQuickChange.elem = elem;
TransQuickChange.index = index;
return true;
}
});
},
reset : function () {
$(TransQuickChange.elem).find('.TQC-titleform')
.remove();
$(TransQuickChange.elem).find('.TQC-title')
.show();
$(TransQuickChange.elem).find('.TQC-trans')
.remove();
TransQuickChange.errorClear();
},
errorClear : function () {
$('.TQC-error').remove();
TransQuickChange.error=false;
},
errorMsg : function (msg, elem) {
TransQuickChange.error = true;
msg = (msg===undefined)
? TransQuickChange.messages.error
: msg;
msg = $('<span>').addClass('TQC-error').text(msg);
if(elem===undefined){
$(TransQuickChange.elem).find('.TQC-titleform').append(msg);
}
else{
$(elem).append(msg);
}
},
keyupdelay : function (fn, ms) {
var timer = 0;
return function() {
var context = this, args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args);
}, ms || 0);
};
},
init : function () {
if(!$('.TBox-ratour').length){return false;}
$('.TBox-ratour .TBox-title').wrapInner(
$('<span>').addClass('TQC-title').wrapInner(
$('<span>').addClass('TQC-titleval')
)
);
TransQuickChange.addTitleBtn();
TransQuickChange.addTransBtn();
},
};
$(document).ready(function() {
if(mw.config.get( 'wgNamespaceNumber' ) !== 10 &&
mw.config.get( 'wgAction' ) == 'view' &&
mw.config.get('wgCurRevisionId') == mw.config.get('wgRevisionId')){
TransQuickChange.init();
}
});