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" : " ", "..." : "…"
};
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);