MediaWiki:Gadget-TransQuickChange.js

Èn årtike di Wiccionaire.

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();
  }
});