Utilisateur:ArséniureDeGallium/CreerCastets.js

La bibliothèque libre.

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 (^ = début ligne)
		//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)
		//Chaque remplacement exclut de fait le suivant, enfin j'espère
		lig = lig.replace( /\.([ivxIVX]+)\./g, "{{rom|.$1.|}}" ); //il faudrait ivx.toUpperCase() mais comment faire ?
		lig = lig.replace( /\.1\./g, "{{rom|.I.|1}}" ); //erreur fréquente de l'OCR
		lig = lig.replace( /\.11\./g, "{{rom|.II.|2}}" ); //erreur fréquente de l'OCR
		lig = lig.replace( /\.111\./g, "{{rom|.III.|3}}" ); //erreur fréquente de l'OCR
		lig = lig.replace( /\.1111\./g, "{{rom|.IIII.|4}}" ); //erreur fréquente de l'OCR

		//Ajout au résultat
		txt = txt + lig + "\n";
	}
	
	//fin poème
	txt = txt + "</poem>\n";
	if (txtApres.length===0){ //rien après => ignorer
		// màj de la boite d'édition et fin
		tb.value = txt;
		document.getElementById('wpSummary').value = "Page initialisée par le script de GaAs (pas de notes).";
		return;
	}

	//séparateur provisoire pour aider à la relecture
	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 par le script de GaAs.";
}

// --------------------------------------------------------------------------------------------
//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.substring(0,4)==="----"){
			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 par le script de GaAs.";
	alert( "1er vers de la page : " + (NumVers1+1) + "\nNotes : " + ListeNotes );
}