Utilisateur:Validze/CreerCastets.js
Apparence
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.
/***********************************************************************************************************/
/* Diverses fonctions d'aide à la correction des pages de Castets - La Chanson des quatre fils Aymon, 1909 */
/* */
/* Auteur : ArséniureDeGallium */
/* Licence : CC-BY-SA 4.0 */
/***********************************************************************************************************/
// --------------------------------------------------------------------------------------------
// Ajout des liens dans l'onglet après "renommer" & cie
// --------------------------------------------------------------------------------------------
if ( document.getElementById('wpTextbox1') ) {
addOnloadHook(CrCastet_AddLink);
}
function CrCastet_AddLink(){
CommonWikt_AddTabMenu("javascript:CrCastet_InitPage();", "Castets : initialiser page");
CommonWikt_AddTabMenu("javascript:CrCastet_TransNotes();", "Castets : insérer les notes");
}
// --------------------------------------------------------------------------------------------
// Commande à utiliser à la création de la page, avant toute autre chose
// Mettre le curseur au début de la première ligne de note avant de la lancer
// --------------------------------------------------------------------------------------------
function CrCastet_InitPage(){
var tb = document.getElementById("wpTextbox1");
// séparation de la partie avant le curseur (le poème) et
// de la partie après (les notes) au point d'insertion du curseur
// ! le curseur doit séparer le texte et les notes !
var CursPos = tb.selectionStart;
if ((CursPos!==tb.selectionEnd)||(CursPos===0)){
alert("Le curseur n'est pas positionné de façon crédible. Abandon de la fonction.")
return;
}
var txtAvant = tb.value.substring(0, CursPos); //le poème
var txtApres = tb.value.substring(CursPos); //les notes
// initialisation du processus
var txt; //variable contenant le résultat final
var txtSplit; //var temp contenant la liste des lignes à traiter
var lig; //var temp contenant la ligne en cours de traitement
var ligPrec; //var temp contenant la ligne précédemment traitée
// Traitement du poème hors notes
// NB : on commence à k=1 car la 1re ligne (k=0) est habituellement non pertinente
txtSplit = txtAvant.split("\n"); // séparation en lignes individuelles
txt = "<poem>\n"; //remplacement de la ligne k=0
for (var k=1; k<txtSplit.length; k++){
//Ligne à traiter débarassée de ses espaces finaux
lig = txtSplit[k].trim();
if (lig.length===0){ continue; } // si vide, passer à la suivante
//Apostrophes correctes (LOL)
lig = lig.replace( /\'/g, "’" );
//Ajout espace avant ponctuations ;:?! (\S = tout sauf espace)
lig = lig.replace( /(\S)([\;\:\?\!])/g, "$1 $2" );
//Ajout des {{NumVers}} dans le poème
//Chaque remplacement exclut de fait le suivant, puisque la ligne commence alors par {{
lig = lig.replace( /^(\d+)\s*/, "{{NumVers|$1}}" ); // numérotation Castets seule
lig = lig.replace( /^M\.\s*(\d+)\s+(\d+)\s*/, "{{NumVers|M.$1 $2|-5em}}" ); // numérotation M. & Castets
lig = lig.replace( /^M\.\s*(\d+)\s*/, "{{NumVers|M. $1}}" ); // numérotation M. seule
//Chiffres "romains" à la mode de l'époque (ne traite pas tous les cas)
lig = lig.replace( /\.([ivxIVX]+)\./g, "{{rom|.$1.|}}" ); //il faudrait ivx.toUpperCase() mais comment faire ?
//Ajout au résultat
txt = txt + lig + "\n";
}
//fin poème + séparateur provisoire pour aider à la relecture
txt = txt + "</poem>\n";
if (txtApres.length===0){return;} //rien après => ignorer
txt = txt + "----\n";
//notes de Castets
txtSplit = txtApres.split("\n"); // séparation en lignes individuelles
ligPrec = "";
for (var k=0; k<txtSplit.length; k++){
//Ligne à traiter débarassée de ses espaces finaux
lig = txtSplit[k].trim();
if (lig.length===0){ continue; } // si vide, passer à la suivante
//Apostrophes correctes
lig = lig.replace( /\'/g, "’" );
//Selon que la ligne commence ou non par un n° de ligne (au moins deux digits),
// commencer une nouvelle ligne du document final, ou la concaténer pour plus tard.
//Le but est d'ajouter les balises <ref> et </ref> au bon endroit,
// alors que les sauts de lignes inutiles sont courants dans ce scan.
if ( /^\d\d/.test(lig) ){
//Ajout au résultat de la ligne précédente, avec balise </ref>
if (ligPrec.length>0) { txt = txt + ligPrec + "</ref>\n"; }
//Début de la prochaine ligne, avec balise <ref>
// (avec ajout de l'espace fréquemment manquant après le n° de ligne)
lig = "<ref>" + lig.replace( /^(\d+)\s*/, "$1 " );
ligPrec = lig;
//
}else{
//Cumul du texte pour la prochaine fois
ligPrec = ligPrec + " " + lig;
}
}
//Ajouter le dernier
if (ligPrec.length>0) { txt = txt + ligPrec + "</ref>\n"; }
// màj de la boite d'édition
tb.value = txt;
document.getElementById('wpSummary').value = "Page initialisée grâce à [[Utilisateur:ArséniureDeGallium/CreerCastets.js]].";
}
// --------------------------------------------------------------------------------------------
//Transfert des notes de Castet dans le poème à la bonne ligne
// --------------------------------------------------------------------------------------------
function CrCastet_TransNotes(){
var tb = document.getElementById("wpTextbox1");
var txtSplit = tb.value.split("\n");
// initialisation du processus
var lig; //var temp contenant la ligne en cours de traitement
var nv;
// * calcul du n° du premier vers,
// * détection de la ligne de séparation insérée par CrCastet_InitPage()
var FinPoem = 0; //n° ligne de ----
var NumVers1 = 0; //n° de vers de la 1re ligne
for (var k=1; k<txtSplit.length-1; k++){ //la ligne 0 contient <poem>, ---- n'est pas censé être la dernière
lig = txtSplit[k];
if (NumVers1===0){ //détection n° vers
nv = /^\{\{NumVers\|(\d+)/.exec(lig);
if (nv){
NumVers1 = parseInt(nv[1],10) - k; //n° vers de la ligne 0
}
}
if (lig==="----"){
FinPoem = k; break;
}
}
if (FinPoem===0){
alert("Notes non trouvée après une ligne de séparation."); return;
}
//Traitement des lignes après la séparation, qui sont les notes
var cible;
var ListeNotes = [];
for (k=FinPoem+1; k<txtSplit.length; k++){
//Ligne à traiter débarassée de ses espaces superflus
lig = txtSplit[k].trim();
//Si ligne pas vide
if (lig.length>0){
//Récup n° vers en début note
nv = /^\<ref\>(\d+)/.exec(lig);
cible = parseInt(nv[1],10) - NumVers1;
ListeNotes.push(nv[1]); //pour affichage à la fin
//Texte de la note ajouté à la fin du vers
txtSplit[cible] = txtSplit[cible] + lig;
}
}
//Création du texte
var txt = "";
for (k=0; k<FinPoem; k++){
lig = txtSplit[k];
txt = txt + lig + "\n";
}
// màj de la boite d'édition
tb.value = txt;
document.getElementById('wpSummary').value = "Notes placées.";
alert( "1er vers de la page : " + (NumVers1+1) + "\nNotes : " + ListeNotes );
}