Utilisateur:Seudo/sd commandes.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.
/*
Commandes personnelles, ajoutées dans le menu "Plus".

Peuvent être temporaires pour un livre donné.
*/

/* Nécessaire pour encoder des chaînes Unicode arbitraires en Javascript
(cf. https://developer.mozilla.org/fr/docs/Web/API/WindowBase64/btoa) */
// Chaîne ucs-2 en ascii encodé en base64
function uena(chn) {
    return window.btoa(unescape(encodeURIComponent(chn)));
}
// Ascii encodé en base64 en chaîne ucs-2
function aenu(chn) {
    return decodeURIComponent(escape(window.atob(chn)));
}

/* Livre:Lois des Francs contenant la Loi salique et la Loi ripuaire.djvu */
function typographie_loi_salique(e) {
	e.preventDefault();
	try {
		editbox = $("#wpTextbox1");
		if(! editbox.length) {
			OO.ui.alert("Cette page ne contient pas de champ d'édition");
			return;
		}
		var content = editbox.val();
		
		content = content.replace(/(\d+)ooo/g, "$1000");
		content = content.replace(/(\d+)oo/g, "$100");
		content = content.replace(/(\d+)o/g, "$10");

		content = content.replace(/éà/g, "é à");
		content = content.replace(/àp/g, "à p");

		content = content.replace(/con\s+damné/g, "condamné");

		content = content.replace(/ART[,\.\s]+([IVX]+)[,\.\s]/g, "{{c|ART. $1.}}");

		content = content.replace(/\{\{c\|\{\{c\|ART. ([IVX]+).\}\}\}\}/g, "{{c|ART. $1.}}");


		content = content.replace(/(\w) *, *(\w)/g, "$1, $2");

		editbox.val(content);
	}
	catch(exc) {
		OO.ui.alert("Erreur : " + exc);
		return;
	}
}

/* Insère du texte au niveau du curseur dans le champ d'édition */
function inserer(e, txt) {
	e.preventDefault();
	try {
		editbox = $("#wpTextbox1");
		if(! editbox.length) {
			OO.ui.alert("Cette page ne contient pas de champ d'édition");
			return;
		}
		var startPos = editbox[0].selectionStart;
		var endPos = editbox[0].selectionEnd;
		var textScroll = editbox[0].scrollTop;
		var content = editbox.val();
		var newcontent = content.substring(0, startPos) + txt + content.substring(startPos);
		editbox.val(newcontent);
		editbox[0].selectionStart = startPos;
		editbox[0].selectionEnd = editbox.selectionStart;
		editbox[0].scrollTop = textScroll;
	}
	catch(exc) {
		OO.ui.alert("Erreur : " + exc);
		return;
	}
}

/* Le moyen de parvenir, tome 1 (Béroalde de Verville, éd. 1896).djvu */
function typographie_moyen_parvenir(e) {
	e.preventDefault();
	try {
		editbox = $("#wpTextbox1");
		if(! editbox.length) {
			OO.ui.alert("Cette page ne contient pas de champ d'édition");
			return;
		}
		var content = editbox.val();
		
		/* Spécifique */
		content = content.replace(/&\./g, "&");
		content = content.replace(/ss/g, "ſſ");
		content = content.replace(/s([a-eg-rt-zâéèêîôû])/g, "ſ$1");
		content = content.replace(/nbſp/g, "nbsp");

		/* Coquilles d’OCR courantes */
		content = content.replace(/\bcelte\b/g, "cette");
		content = content.replace(/ h /g, " à ");
		editbox.val(content);
	}
	catch(exc) {
		OO.ui.alert("Erreur : " + exc);
		return;
	}
}

/* Traité de Porphyre, touchant l'abstinence de la chair des animaux.djvu */
function typographie_porphyre(e) {
	e.preventDefault();
	try {
		editbox = $("#wpTextbox1");
		if(! editbox.length) {
			OO.ui.alert("Cette page ne contient pas de champ d'édition");
			return;
		}
		var content = editbox.val();
		
		/* Ponctuation */
		content = content.replace(/(&?\w+)([;:?!])/g, function(str, m, n) {
			if(m[0] == "&")
				return str;
			else
				return m + " " + n;
		})
		content = content.replace(/ +,/g, ",");
 
		/* Apostrophe française */
		content = content.replace(/(^|[^'])'([^']|$)/g, "$1’$2"); /* Seulement une apostrophe */

		/* Spécifique Porphyre */
		/* content = content.replace(/\banima(l|ux)\b/g, "Anima$1"); */
		content = content.replace(/\bsait\b/g, "ſçait");
		content = content.replace(/ ;/g, " ;");
		content = content.replace(/\bdieux\b/g, "Dieux");
		content = content.replace(/([\w])aient\b/g, "$1oient");
		content = content.replace(/([a-eg-z])ait\b/g, "$1oit");
		content = content.replace(/\blois\b/g, "loix");
		content = content.replace(/ents\b/g, "ens");
		content = content.replace(/âme(s?)\b/g, "ame$1");
		content = content.replace(/ss/g, "ſſ");
		content = content.replace(/s([a-eg-rt-zâéèêîôû])/g, "ſ$1");
		content = content.replace(/nbſp/g, "nbsp");
		content = content.replace(/\bet\b/g, "&");

		/* Coquilles d’OCR courantes */
		content = content.replace(/\bcelte\b/g, "cette");
		content = content.replace(/ h /g, " à ");
		editbox.val(content);
	}
	catch(exc) {
		OO.ui.alert("Erreur : " + exc);
		return;
	}
}

/* Corrections typographiques de base */
function typographie(e) {
	e.preventDefault();
	try {
		editbox = $("#wpTextbox1");
		if(! editbox.length) {
			OO.ui.alert("Cette page ne contient pas de champ d'édition");
			return;
		}
		var content = editbox.val();
		
		/* On encode ce qui est entre [[...]], {{...}} ou <...> pour éviter des fausses corrections. */
		content = content.replace(/(?:\[.*?\]|\{\{.*?\}\}|<code>.*?<\/code>|<nowiki>.*?<\/nowiki>|<[^>]+>|https?:|ftps?:)/g, function(m) {
			return "@@BASE64(" + uena(m) + ")";
		});

		
		/* Ponctuation, sauf dans une entité HTML */
		content = content.replace(/&\w+;| [;:?!]|([;:?!])/g, function(m) {
		    return(m.match('^[;:?!]$') ? " " + m : m);
		});
 
		/* Apostrophe française (sauf dans une mise en forme italique ou grasse, 
			cf. le remarquable http://www.rexegg.com/regex-best-trick.html) */
		content = content.replace(/''+|(')/g, function(m) { 
			return (m == "'" ? "’" : m);
		});
		// content = content.replace(/(^|[^'])'([^']|$)/g, "$1’$2"); /* Seulement une apostrophe */

		/* Mon système de remplacement automatique de caractères anciens ne fonctionne pas toujours */
		content = content.replace(/\$s/g, "ſ");

		/* Espaces insécables */
		content = content.replace(/(M+\.|Mmes?|Mlles?|Mgr) +/g, "$1&nbsp;");
		content = content.replace(/(\d+) (\d\d\d)/g, "$1&nbsp;$2");

		/* Coquilles d’OCR courantes */
		content = content.replace(/\bcelte\b/g, "cette");
		content = content.replace(/ h /g, " à ");
		
		/* Décodage de ce qui a été encodé */
		content = content.replace(/@@BASE64\(([^\)]+)\)/g, function(m, n) {
			return(aenu(n));
		});

		editbox.val(content);
	}
	catch(exc) {
		OO.ui.alert("Erreur : " + exc);
		return;
	}
}

/* Insère un appel de note dans les Vies de Vasari */
function vasari_appel_note(e) {
	OO.ui.prompt('Numéro de la note', {
		textInput: {
			placeholder: 'Numéro'
		}
	}).done(function(result) {
		if(result !== null) {
			txt = "&nbsp;{{refl|" + result + "|nosup|num=(" + result + ")}}";
			inserer(e, txt);
		}
	});
}

function addCommande(libelle, id, desc, fn) {
	mw.util.addPortletLink("p-cactions",
		"#",
		libelle,
		id,
		desc);

	$('#' + id).on('click', function(e) {
		fn(e);
	});
}

function addCommandeInsererTexte(libelle, id, desc, txt) {
	mw.util.addPortletLink("p-cactions",
		"#",
		libelle,
		id,
		desc);

	$('#' + id).on('click', function(e) {
		inserer(e, txt);
	});
}

$(function($) {
/* Ouvrage terminé :
	addCommande("Typo Porphyre", 
		"sd-typoporphyre", 
		"Typographie Porphyre", 
		typographie_porphyre);
	addCommande("Typo Loi salique", 
		"sd-typosalique", 
		"Loi salique", 
		typographie_loi_salique);
	addCommande("Typo parvenir", 
		"sd-typoparvenir", 
		"Moyen de parvenir", 
		typographie_moyen_parvenir);
*/
	addCommandeInsererTexte("Pétrarque intertitre", 
		"sd-petrarque-intertitre", 
		"Pétrarque - Insérer un titre de sonnet ou de canzone",
		"\n{{t3|SONNET .}}\n{{interligne|1em}}\n{{c|.|fs=90%}}\n{{interligne|1em}}\n");	
   addCommande("Typo", 
		"sd-typo", 
		"Typographie générale", 
		typographie);
	addCommande("Vasari appel note", 
		"sd-vasari-appel-note", 
		"Vasari - appel de note",
		vasari_appel_note);
	addCommandeInsererTexte("Vasari notes", 
		"sd-vasari-notes", 
		"Vasari - Intégrer les notes",
		"\n{{interligne|2em}}\n[[File :Vasari - Vies des peintres - separateur.jpg|70px|center]]\n{{interligne|3em}}\n\n{{c| NOTES.|fs=120%|lh=2}}\n{{brn|2}}\n\n{{Refa|1|(1)}} ");
	addCommandeInsererTexte("Vasari séparateur", 
		"sd-vasari-separateur", 
		"Vasari - Insère le séparateur entre texte et commentaire",
		"{{brn|2}}\n[[File :Vasari - Vies des peintres - separateur simple.jpg|center|65px]]\n{{brn|2}}\n");
    addCommandeInsererTexte("Ripa section", 
		"sd-ripa-section", 
		"Iconologie de Cesare Ripa - Insère un séparateur et le titre d’une nouvelle section", 
        "## fin ##\n<hr />\n## l_automne ##\n{{t3|{{uc|L’avtomne}}.}}\n{{PM|I|L}} ");
});