Note : après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : Maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ou Ctrl-R (⌘-R sur un Mac) ;
  • Google Chrome : Appuyez sur Ctrl-Maj-R (⌘-Shift-R sur un Mac) ;
  • Internet Explorer : Maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5 ;
  • Opera : Allez dans Menu → Settings (Opera → Préférences sur un Mac) et ensuite à Confidentialité & sécurité → Effacer les données d'exploration → Images et fichiers en cache.
// formatage automatique des nombres romains avec {{rom-maj}} et {{rom}}
// Conditions : nombre romain précédé et suivit par : espace, point, parenthère, saut de ligne, début de ligne, virgule, point-virgule.
// A l'exception des nombres I, V, X, L, C, D, et M  qui fournissent trop de faux positifs.
// Le lancement se fait par le choix "Romains" ajouté dans le menu en haut à droite de la page.
// LIMITATION : Valeur maximale 4099. au delà ça devient compliqué, et je n'ai pas rencontré sur wikisource
function romain(str,type){
  var notfin=1;
  var offset=0;
  var startori = $('#wpTextbox1').prop("selectionStart");
  var endori = $('#wpTextbox1').prop("selectionEnd");
  // tableau des valeurs des nombres romaine 'élémentaire'
  var nombrer={"M":1000, "D":500, "C":100, "L":50, "X":10, "V":5, "I":1};  
  var nombrerl={"m":1000, "d":500, "c":100, "l":50, "x":10, "v":5, "i":1};
  // Nombre à exclure, trop de faux positifs.
  var exclus=':mi:di:dix:mm:cl:ci:';
// chargement du texte original dans une variable de travail wstr
wstr=str+" ";
//Traitement des nombres romains en majuscule {{rom-maj}}
while(result = wstr.substring(offset,wstr.length).match(/(^[XDLMIVC]+|[ ,;\.\(][IVXLCDM]+$|[ ,;\.\(][IVXLCDM]+)[ ,;\.\)\n$]/m)){
    // on supprime les caractères suivant et précédent.
    var nombre = result[0].match(/[IVXLCDM]+/)[0];
	// position dans le texte pour la prochaine recherche
	offset = offset+result.index + result.length;
	// On ne traite pas les nombre I V X L C D et M, trop de faux positif
	// on exclus aussi les mots se trouvant dans la chaine exclus
	re_nombre=new RegExp('\:'+nombre+'\:','i');
	if(type!="var"){
		if((nombre.length == 1) || (exclus.match(re_nombre))){continue}
	}
	// Convertion en décimale de la chaine retrouvée.
	var valeur = 0;	
	for(var i = 0; i < nombre.length - 1 ;  i++){
	  if(nombrer[nombre[i]] < nombrer[nombre[i+1]]){	
	    valeur = valeur - parseInt(nombrer[nombre[i]]);
	  } else {
	    valeur = valeur + parseInt(nombrer[nombre[i]]);
	  }
        }
        valeur = valeur + nombrer[nombre[nombre.length - 1]];
    // on controle si la chaine détectée est un nombre romain bien formé
    // Si chaine retrouvée = nombre décimal calculé converti en nombre romain
	if(nombre != calculrom(valeur)){continue}
	// remplacement du nombre par {{rom-maj|nombre romain|nombre décimale}}	
	chainenew ="$1{{rom-maj|"+nombre+"|"+valeur+"}}$2";
	chainexpr = new RegExp("([ ,;\.\(\n$])"+nombre+"([ ,;\.\)\n$])","m");
	wstr = wstr.replace(chainexpr,chainenew);	
	// on ajoute 10 à l'offset pour tenir compte de l'insertion de '{{rom-maj|"
	offset = offset + 10;
}
// traitement des nombre romaine en minuscule {{rom}} 
offset=0;
while(result = wstr.substring(offset,wstr.length).match(/[ ;,\.\(\n$][xdlmivc]+[ ,;\.\n\$)]/m)){
    nombre = result[0].match(/[ivxlcdm]+/)[0];
	offset = offset+result.index + result.length;
    re_nombre=new RegExp('\:'+nombre+'\:','i');
    if(type!="var"){
		if((nombre.length == 1) || (exclus.match(re_nombre))){continue}
    }
	valeur = 0;	
	for(i = 0; i < nombre.length - 1 ;  i++){	
	  if(nombrer[nombre[i].toUpperCase()] < nombrer[nombre[i+1].toUpperCase()]){	
	    valeur = valeur - parseInt(nombrer[nombre[i].toUpperCase()]);
	  } else {
	    valeur = valeur + parseInt(nombrer[nombre[i].toUpperCase()]);
	  }
        }
        valeur = valeur + nombrer[nombre[nombre.length - 1].toUpperCase()];
    if(nombre.toUpperCase() != calculrom(valeur)){continue}
	chainenew ="$1{{rom|"+nombre+"|"+valeur+"}}$2";
	chainexpr = new RegExp("([ ,;\.\(\n$])"+nombre+"([ ,;\.\)\n$])","m");
	wstr = wstr.replace(chainexpr,chainenew);
	offset = offset + 6;
}

// Romains, le retour
$('#wpTextbox1').prop("selectionStart",parseInt(startori));
$('#wpTextbox1').prop("selectionEnd",parseInt(endori));
return wstr.substring(0,wstr.length-1);		
}
// fonction appelée quand on clique sur le bouton 'Romain'
function appelromain() {
    
    // position du curseur dans le texte
    var start = $('#wpTextbox1').prop("selectionStart");
    var end = $('#wpTextbox1').prop("selectionEnd");
    var txt = $("#wpTextbox1").val();
    $("#wpTextbox1").val(romain(txt));
    // on remet le curseur en place
    $('#wpTextbox1').focus();
    $('#wpTextbox1').prop("selectionStart",parseInt(start));
    $('#wpTextbox1').prop("selectionEnd",parseInt(end));
}
// ajout d'un choix 'Romain' au menu en haut à droite de la page
$(function () {
  if(document.forms.editform) {
    var myPortletlink=mw.util.addPortletLink( 'p-personal', '#',
	'Romain', 'ca-romain',	'mise en forme rom-maj'
    );
// Bind click handler
    $( myPortletlink ).click( function ( e ) {
	e.preventDefault();
	// doSomeStuff();
	appelromain();
    });
  }
});
// conversion d'un nombre décimal en nombre romain
function calculrom(nbr){  
	var tabconv={'M':1000, 'CM':900, 'D':500, 'CD':400, 'C':100, 'XC':90, 'L':50, 'XL':40, 'X':10, 'IX':9, 'V':5, 'IV':4, 'I':1};
	var wnbr = nbr;
	var result="";
    for(var key in tabconv){
    	while( wnbr >= tabconv[key]){
    		wnbr -= tabconv[key];
    		result += key;
    	}
    }
    return result;
}