Utilisateur:Seudo/caracteres-speciaux.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.
/*
 Pour utiliser ce script :
- recopier le script dans votre espace utilisateur (par exemple sous le nom User:toto/caracteres-speciaux.js)
- rajouter la ligne suivante dans votre fichier common.js :
     importScript('User:toto/caracteres-speciaux.js')
Vous pouvez aussi importer directement ce script, mais ce n'est pas prudent car je me réserve la possibilité de le modifier ou renommer à tout moment.

Ce script  remplace certains caractères spéciaux au cours de la frappe, dans les champs d'édition. Exemples :
 - les apostrophes droites sont remplacées par des apostrophes courbes (sauf s'il y en a plusieurs à la suite), ... par …, 'oe par œ (idem pour 'ae ,'OE, 'AE), $nb par  
 - si le texte est précédé de {{lang|grc|, les caractères latins sont remplacés par des caractères grecs proches ;
 - une aide aussi pour les textes anciens en français : $s devient ſ, notamment.

Règles générales pour le grec ancien :
- / et \ sont utilisés pour les esprits doux (ἀ) et rude (ἁ)
- ', ~ et ` sont utilisés pour les accents toniques (ά, ᾶ, ὰ)
- , est utilisé pour le "iota muet" (en-dessous de certaines lettres)
Ils peuvent se combiner jusqu'à trois diacritiques (d'abord l'esprit, puis l'accent tonique, puis le iota muet et enfin la lettre) :
   /a   => ἀ
   /'a  => ἄ
   /',a => ᾄ
Toutes les diacritiques simples, doubles et triples sont gérées (s'il en manque encore, c'est facile de compléter).

 Uniquement sous firefox.
 Auteur: ThomasV
 Modifié par Seudo :
 - correction de bug (sous Windows/Firefox en tout cas)
 - ajout de raccourcis pour le grec : le texte à l'intérieur d'une balise {{lang|grc|...}} est automatiquement converti en alphabet grec : "a" devient "α", "'a" devient "ά", etc.
 - autres ajouts
 - ajout d'aides à l'initialisation de la page : positionnement de l'ascenseur pour faire apparaître le champ d'édition en entier (désactivé car trop lent)
*/

/* Options (mettre true pour les raccourcis qu'on souhaite utiliser) */
raccourcis_grec = true;   // lettres grecques dans un bloc {{lang|grc|...}}
raccourcis_autres = true; // æ œ ſ … ’

/* Renvoit le code de langue courant si on est dans un passage {{lang|xxx|...}}} */
function getLang(str, startPos) {
	if(startPos < 2)
		return "";
	var idx = startPos - 1;
	var c = str.charAt(idx);
	var c_prec = (idx === 0 ? "" : str.charAt(idx-1));
	var balise = "";
	var lang = "";
	var in_lang = false;
	var in_balise = false;
	while(c != "\n" && idx > 0) {
		if(c == "}" && c_prec == "}")
			return ""; // On est hors d'une balise langue

		if(in_lang) {
			if(c == "|")
				in_lang = false;
			else
				lang = c + lang;
		}
		else if(in_balise) {
			if(c == "{") {
				if(balise == "lang")
				  return lang;
				else
				  lang = "";
			}
			else
				balise = c + balise;
		}
		else if(c == "|") {
			in_lang = true;
			in_balise = true;
		}

		idx = idx - 1;
		c = str.charAt(idx);
		c_prec = (idx === 0 ? "" : str.charAt(idx-1));
	}
	return ""; // Pas de langue sur la ligne courante
}

MAIN_NS = 0;
USER_NS = 2;
WIKISOURCE_NS = 4;
HELP_NS = 12;
AUTEUR_NS = 102;
PAGE_NS = 104;
LIVRE_NS = 112;

/* Raccourcis claviers personnalisés */
function keycheck() {
    /* Exclut certaines terminaisons */
    pageName = mw.config.get('wgPageName');
    if(pageName.slice(-3) == ".js" || pageName.slice(-4) == ".css")
       return;

	tb = document.getElementById("wpTextbox1");
    /* Actif seulement dans l’espace principal et l’espace Page */
    /* alert(mw.config.get('wgNamespaceNumber')); */
	if(tb && [MAIN_NS, MAIN_NS + 1, USER_NS, USER_NS + 1,
              WIKISOURCE_NS, WIKISOURCE_NS  + 1,
              HELP_NS, HELP_NS + 1, AUTEUR_NS, AUTEUR_NS +  1,
              PAGE_NS, PAGE_NS + 1, LIVRE_NS, LIVRE_NS + 1].includes(mw.config.get('wgNamespaceNumber'))) {
		// tb.onkeyup = function(e) {
		tb.addEventListener("keyup", function(e) {
			var key = (window.event) ? event.key : e.key;
			var charCode = key.charCodeAt(0);
			startPos = tb.selectionStart;
			endPos = tb.selectionEnd;
			if(endPos == startPos && ((charCode >= 65 && charCode <= 90)
				|| (charCode >= 97 && charCode <= 122) || charCode == 39
				|| charCode == 45 || charCode == 46) ) {
				m1 = tb.value.substring(startPos - 1, startPos);
				m2 = tb.value.substring(startPos - 2, startPos);
				m3 = tb.value.substring(startPos - 3, startPos);
				m4 = tb.value.substring(startPos - 4, startPos);
				m2_futur = tb.value.substring(startPos - 1, startPos+1);
				f = tb.value.substring(startPos);

				var lang = getLang(tb.value, startPos);

				do_replace = false;
                is_commentaire = false;

				// Raccourcis de quatre caractères
				if(!do_replace) {
					i = 4;
					m = m4;
					if(lang == "grc" && raccourcis_grec) {
						// Diacritiques triples : \',a => ᾅ
						dia = m.substring(0, 3);
						lettre = m.substring(3, 4);
						corr_lettre = {"a": "ᾂ", "A": "ᾊ", "h": "ᾒ", "H": "ᾚ",
									   "w": "ᾢ", "W": "ᾪ"};
						corr_dia = {"/`,": 0, "\\`,": 1, "/',": 2, "\\',": 3, "~/,": 4, "~\\,": 5};
						if(dia in corr_dia && lettre in corr_lettre) {
							m = String.fromCharCode(corr_lettre[lettre].charCodeAt() + corr_dia[dia]);
							do_replace = true;
						}
					}
				}

				// Raccourcis de trois caractères
				if(!do_replace) {
					i = 3;
					m = m3;
					if(lang == "grc") {
                        if(raccourcis_grec) {
							// Diacritiques doubles : \'a => ἅ
							dia = m.substring(0, 2);
							lettre = m.substring(2, 3);
							tout = m.substring(0, 3);
							corr_lettre = {"a": "ἂ", "A": "Ἂ",  "e": "ἒ", "E": "Ἒ",
										   "h": "ἢ", "H": "Ἢ", "i": "ἲ", "I": "Ἲ",
										   "o": "ὂ", "O": "Ὂ", "y": "ὒ", "Y": "Ὓ",
										   "w": "ὢ", "W": "Ὢ"};
							corr_dia = {"/`": 0, "\\`": 1, "/'": 2, "\\'": 3, "~/": 4, "~\\": 5};
							corr_lettre2 = {"a": "ᾀ", "A": "ᾈ", "h": "ᾐ", "H": "ᾘ",
										   "w": "ᾠ", "W": "ᾨ"};
							corr_dia2 = {"/,": 0, "\\,": 1};
							corr3 = {"`,a": "ᾲ", "',a": "ᾴ", "~,a": "ᾷ",
									 "`,h": "ῂ", "',h": "ῄ", "~,h": "ῇ",
									 "`¨i": "ῒ", "'¨i": "ΐ", "~¨i": "ῗ",
									 "`¨y": "ῢ", "'¨y": "ΰ", "~¨y": "ῧ",
									 "`,w": "ῲ", "',w": "ῴ", "~,w": "ῷ"};
							if(dia in corr_dia && lettre in corr_lettre) {
								m = String.fromCharCode(corr_lettre[lettre].charCodeAt() + corr_dia[dia]);
								do_replace = true;
							}
							else if(dia in corr_dia2 && lettre in corr_lettre2) {
								m = String.fromCharCode(corr_lettre2[lettre].charCodeAt() + corr_dia2[dia]);
								do_replace = true;
							}
							else if(tout in corr3) {
								m = corr3[tout];
								do_replace = true;
							}
						}
					}
					else if(raccourcis_autres) {
						// Caractères français et typographie
						corr = {
							"$oe" : "œ", "$OE" : "Œ", "$ae" : "æ", "$AE" : "Æ",
							"$nb" : "&nbsp;", "..." : "…"
						};
						if (m in corr) {
							m = corr[m];
							do_replace = true;
						}
						else if(m == "!--") {
							is_commentaire = true;
						}
					}
				}

				// Raccourcis de deux caractères
				if(!do_replace) {
					i = 2;
					m = m2;
					if(lang == "grc") {
						if(raccourcis_grec) {
							// D'abord de manière systématique, les diacritiques avec les esprits
							// (accents courbes gauche et droit) :
							// /a => ἀ
							// \a => ἁ
							esprits_lettres = {
								"a": "ἀ", "A": "Ἀ", "e": "ἐ", "E": "Ἐ",
								"h": "ἠ", "H": "Ἠ", "i": "ἰ", "I": "Ἰ",
								"o": "ὀ", "O": "Ὁ", "y": "ὐ", "w": "ὠ",
								"W": "Ὠ", "r": "ῤ",
							};
							if(['/', '\\'].includes(m[0]) && m[1] in esprits_lettres) {
								if(m[0] == "/")
									m = esprits_lettres[m[1]];
								else
									m = String.fromCharCode(esprits_lettres[m[1]].charCodeAt(0) + 1);
								do_replace = true;
							}
							else {
								// Diverses lettres au cas par cas
								corr = {
									"'A" : "Ά", "'a" : "ά", "`a" : "ὰ", "~a" : "ᾶ",
									"'E" : "Έ", "'e" : "έ",
									"'H" : "Ή", "'h" : "ή", "`h" : "ἡ", "~h" : "ῆ",
									"'T" : "Θ", "'t" : "θ",
									"'I" : "Ί", "'i" : "ί", "`i" : "ὶ", "~i" : "ῖ",
									"'O" : "Ό", "'o" : "ό", "`o" : "ὸ",
									"'p" : "ῤ",
									"'s" : "ς",
									"'Y" : "Ύ", "'y" : "ύ", "`y" : "ὺ", "~y" : "ῦ",
									"'K" : "Χ", "'k" : "χ",
									"PI" : "Π", "pi" : "π", "PH" : "Φ", "ph" : "φ", "PS" : "Ψ", "ps" : "ψ",
									"'W" : "Ώ", "'w" : "ώ", "`w" : "ὼ", "~w" : "ῶ",
									",a" : "ᾳ", ",A" : "ᾼ", ",h" : "ῃ", ",H" : "ῌ", ",w" : "ῳ", ",W" : "ῼ",
									};
								if (m in corr) {
									m = corr[m];
									do_replace = true;
								}
							}
						}
					}
					else if(raccourcis_autres) {
						corr = {
							"$b" : "ß", "$s" : "ſ",
							"`A" : "À", "`E" : "È", "`U" : "Ù",
							"~a" : "ã", "~e" : "ẽ", "~i" : "ĩ", "~o" : "õ", "~u" : "ũ",
							"~n" : "ñ", "~p" : "ꝑ", "~q" : "q̃",
						};
						if (m in corr) {
							m = corr[m];
							do_replace = true;
						}
						else if(m == "--" && is_commentaire == false) {
							m = "— ";
							do_replace = true;
						}
					}
				}

				if(!do_replace) {
					if(lang == "grc") {
					}
					else if(raccourcis_autres) {
						i = 2;
						m = m2;
						if(m[1] == "'") {
							if(m[0] == "’")
								m = "''";
							else if(m[0] != "'" && m2_futur != "''")
								m = m[0] + "’";
							do_replace = true;
						}
						else if(m == "’’") {
							m = "''";
							do_replace = true;
						}
					}
				}

				if(!do_replace) {
					if(lang == "grc") {
						if(raccourcis_grec) {
							i = 1;
							m = m1;
							corr = {
								"A": "Α", "a": "α", "B": "Β", "b": "β", "G": "Γ", "g": "γ",
								"D": "Δ", "d": "δ", "E": "Ε", "e": "ε", "Z": "Ζ", "z": "ζ",
								"H": "Η", "h": "η", "I": "Ι", "i": "ι", "K": "Κ", "k": "κ",
								"L": "Λ", "l": "λ", "M": "Μ", "m": "μ", "N": "Ν", "n": "ν",
								"O": "Ο", "o": "ο", "R": "Ρ", "r": "ρ", "S": "Σ", "s": "σ",
								"T": "Τ", "t": "τ", "Y": "Υ", "y": "υ", "X": "Ξ", "x": "ξ",
								"W": "Ω", "w": "ω",
							};
							if (m in corr) {
								m = corr[m];
								do_replace = true;
							}
						}
					}
				}

				if(do_replace) {
					var textScroll = tb.scrollTop;
					h = tb.value.substring(0, startPos - i);
					tb.value = h + m + f;
					tb.selectionStart = startPos - i + m.length;
					tb.selectionEnd = tb.selectionStart;
					tb.scrollTop = textScroll;
				}
			 }
		})
	}
}

$(document).ready(keycheck);