Utilisateur:Abecido/romains.js
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;
}