-
Notifications
You must be signed in to change notification settings - Fork 0
/
remplace_diacritiques_latins
161 lines (145 loc) · 9.54 KB
/
remplace_diacritiques_latins
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
// Function remplace_diacritiques_latins
// Ecrit en 2011 par Mathieu Saby <mathsabypro@gmail.com>
// Dans la mesure du possible et sans enfreindre la loi en vigueur, l'auteur affirme par la présente céder, abandonner, et renoncer ouvertement, pleinement, définitivement, irrévocablement et sans conditions à tous ses Droits d'Auteur et Droits Voisins sur ce logiciel, partout dans le monde. Ce logiciel est distribué sans aucune garantie.
// Vous devriez recevoir une copie de la licence CC0 1.0 universel (CC0 1.0) Transfert dans le Domaine Public avec ce logiciel. Si ce n'est pas le cas, consultez la page <http://creativecommons.org/publicdomain/zero/1.0/>.
// Le code juridique complet de la licence CC0 est inclu dans le fichier LICENCE
// Written in 2011 by Mathieu Saby
// To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty.
// You should have received a copy of the CC0 Public Domain Dedication along with this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
// The plain text of CC0 legalcode is included in LICENCE file
function remplace_diacritiques_latins (chaine) {
// Remplace les caractères latins modifiés par des diacritiques (ou accompagnés de diacritiques isolés) par des caractères latins simples.
// Valable pour le français la plupart des langues écrites en alphabet latin (langues européennes modernes + vietnamien)
// contexte d'utilisation : nettoyage d'une chaîne pour interrogation de catalogues de bibliothèques français ne supportant pas la présence de diacritiques
// exemple : éàô châu Điện Biên słowiańskie --> eao chau Dien Bien slowianskie
// limites :
// - pour accélérer le traitement, ne prend pas en compte certains caractères très rares (langues africaines), utilisés pour des langues mortes, ou pour l'alphabet phonétique international
// - ne traite pas les lettres "exotiques" qui n'ont pas d'équivalent strict dans la série [a-z] : "glottal stop", "whynn", "kra", etc., sauf les lettres islandaises Thorn et Eth, remplacées par "Th" et "D" (choix qui n'a aucune valeur officielle...)
// fonctionnement détaillé :
// supprime tous les diacritiques modificateurs : bloc des diacritiques (u0300-u036F) et des bloc des diacritiques supplémentaires (u1DC0-u1DFF)
// traite tous les caractères latins codés sur 1 octets en unicode (C0 Controls and Basic Latin, also called Basic Latin http://unicode.org/charts/PDF/U0000.pdf + C1 Controls and Latin-1 Supplement http://unicode.org/charts/PDF/U0080.pdf),
// traite une sélection de caractères sur 2 octets :
// - tout le bloc Latin Extended-A 0100–017F (http://unicode.org/charts/PDF/U0100.pdf) sauf un caractère obsolète
// - une sélection du bloc Latin Extended-B 0180–024F (http://unicode.org/charts/PDF/U0180.pdf) : lettres vietnamiennes, roumaines, slaves, livoniennes, chinoises (pinyin)
// - les lettres du bloc Latin Extended Additional 1E00–1EFF (http://unicode.org/charts/PDF/U1E00.pdf), sauf les lettres pour textes médiévaux
// Ne traite pas les caractères de l'IPA , du bloc Latin Extended-C 2C60–2C7F (http://unicode.org/charts/PDF/UA720.pdf) et du bloc Extended-D A720–A7FF (http://unicode.org/charts/PDF/UA720.pdf)
// Résout les ligatures et digrammes suivants : SS/ss ; ae/Ae ; Oe/oe ; IJ/ij ; DZ/Dz/dz ; NJ/Nj/nj ; LJ/Lj/lj
// Remarques et problèmes possibles :
// - O et o barré sont transcrits par O et o (on pourrait les transcrire également par Oe/oe)
// - en unicode, les umlaut allemands sont considérés comme des trémas -> ä, ü et ö deviennent a, u, o et non ae, ue, oe
// - les d/D barrés sont transcrits d/D (normal en Vietnamien, mais usuellement transcrit par Dj dans les langues balkaniques)
var diac_fr =[
// Tous les diacritiques codés sur un octet et Ÿ Œ œ
['a',/[\u00AA\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5]/g], // a
['A',/[\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5]/g], // A
['ae',/[\u00E6]/g], // ae
['Ae',/[\u00C6]/g], // Ae
['c',/[\u00E7]/g], // c
['C',/[\u00C7]/g], // C
['d',/[\u00F0]/g], // d
['D',/[\u00D0]/g], // D
['e',/[\u00E8\u00E9\u00EA\u00EB]/g], // e
['E',/[\u00C8\u00C9\u00CA\u00CB\u1EBA]/g], // E
['i',/[\u00EC\u00ED\u00EE\u00EF]/g], // i
['I',/[\u00CC\u00CD\u00CE\u00CF]/g], // I
['n',/[\u00F1]/g], // n
['N',/[\u00D1\u1E44]/g], // N
['o',/[\u00BA\u00F2\u00F3\u00F4\u00F5\u00F6\u00F8]/g], // o
['O',/[\u00D2\u00D3\u00D4\u00D5\u00D6\u00D8]/g], // O
['Oe',/[\u0152]/g], // Oe
['oe',/[\u0153]/g], // oe
['ss',/[\u00DF]/g], // ss
['T',/[\u1E6C]/g], // T
['Th',/[\u00DE]/g], // Th
['th',/[\u00FE]/g], // th
['u',/[\u00F9\u00FA\u00FB\u00FC\u1EE7]/g], // u
['U',/[\u00D9\u00DA\u00DB\u00DC]/g], // U
['W',/[\u1E84]/g], // W
['X',/[\u1E8C]/g], // X
['y',/[\u00FD\u00FF]/g], // y
['Y',/[\u00DD\u0178]/g], // Y
];
var diac_autres =[
// Tous les diacritiques sauf ceux codés sur un octet et Ÿ Œ œ
['A',/[\u0100\u0102\u0104\u01CD\u01FA\u0200\u0202\u023A\u1E00\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6]/g], // A
['a',/[\u0101\u0103\u0105\u01CE\u01FB\u0201\u0203\u1E01\u1E9A\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7]/g], // a
['Ae',/[\u01FC]/g], // Ae
['ae',/[\u01FD]/g], // ae
['B',/[\u1E02\u1E04\u1E06]/g], // B
['b',/[\u1E03\u1E05\u1E07]/g], // b
['C',/[\u0106\u0108\u010A\u010C\u023B\u1E08]/g], // C
['c',/[\u0107\u0109\u010B\u010D\u023C\u1E09]/g], // c
['D',/[\u010E\u0110\u1E0A\u1E0C\u1E0E\u1E10\u1E12]/g], // D
['d',/[\u010F\u0111\u1E0B\u1E0D\u1E0F\u1E11\u1E13]/g], // d
['DZ',/[\u01C4\u01F1]/g], // DZ
['DZ',/[\u01C5\u01F2]/g], // DZ
['dz',/[\u01C6\u01F3]/g], // dz
['E',/[\u0112\u0114\u0116\u0118\u011A\u0204\u0206\u0228\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6]/g], // E
['e',/[\u0113\u0115\u0117\u0119\u011B\u0205\u0207\u0229\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7]/g], // e
['f',/[\u0192\u1E1F]/g], // f
['F',/[\u1E1E]/g], // F
['G',/[\u011C\u011E\u0120\u0122\u01F4\u1E20]/g], // G
['g',/[\u011D\u011F\u0121\u0123\u01F5\u1E21]/g], // g
['H',/[\u0124\u0126\u1E22\u1E24\u1E26\u1E28\u1E2A]/g], // H
['h',/[\u0125\u0127\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E96]/g], // h
['I',/[\u0128\u012A\u012C\u012E\u0130\u01CF\u0208\u020A\u1E2C\u1E2E\u1EC8\u1ECA]/g], // I
['i',/[\u0129\u012B\u012D\u012F\u0131\u01D0\u0209\u020B\u1E2D\u1E2F\u1EC9\u1ECB]/g], // i
['IJ',/[\u0132]/g], // IJ
['ij',/[\u0133]/g], // ij
['J',/[\u0134]/g], // J
['j',/[\u0135]/g], // j
['K',/[\u0136\u1E30\u1E32\u1E34]/g], // K
['k',/[\u0137\u1E31\u1E33\u1E35]/g], // k
['L',/[\u0139\u013B\u013D\u013F\u0141\u023D\u1E36\u1E38\u1E3A\u1E3C]/g], // L
['l',/[\u013A\u013C\u013E\u0140\u0142\u1E37\u1E39\u1E3B\u1E3D]/g], // l
['LJ',/[\u01C7]/g], // LJ
['Lj',/[\u01C8]/g], // Lj
['lj',/[\u01C9]/g], // lj
['M',/[\u1E3E\u1E40\u1E42]/g], // M
['m',/[\u1E3F\u1E41\u1E43]/g], // m
['N',/[\u0143\u0145\u0147\u01F8\u1E44\u1E46\u1E48\u1E4A]/g], // N
['n',/[\u0144\u0146\u0148\u01F9\u1E45\u1E47\u1E49\u1E4B]/g], // n
['NJ',/[\u01CA]/g], // NJ
['Nj',/[\u01CB]/g], // Nj
['nj',/[\u01CC]/g], // nj
['O',/[\u014C\u014E\u0150\u01A0\u01D1\u01FE\u020C\u020E\u022A\u022C\u022E\u0230\u1E4C\u1E4E\u1E50\u1E52\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2]/g], // O
['o',/[\u014D\u014F\u0151\u01A1\u01D2\u01FF\u020D\u020F\u022B\u022D\u022F\u0231\u1E4D\u1E4F\u1E51\u1E53\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3]/g], // o
['P',/[\u1E54\u1E56]/g], // P
['p',/[\u1E55\u1E57]/g], // p
['R',/[\u0154\u0156\u0158\u0210\u0212\u1E58\u1E5A\u1E5C\u1E5E]/g], // R
['r',/[\u0155\u0157\u0159\u0211\u0213\u1E59\u1E5B\u1E5D\u1E5F]/g], // r
['S',/[\u015A\u015C\u015E\u0160\u0218\u1E60\u1E62\u1E64\u1E66\u1E68]/g], // S
['s',/[\u015B\u015D\u015F\u0161\u017F\u0219\u023F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E9B]/g], // s
['SS',/[\u1E9E]/g], // SS
['T',/[\u0162\u0164\u0166\u021A\u023E\u1E6A\u1E6C\u1E6E\u1E70]/g], // T
['t',/[\u0163\u0165\u0167\u021B\u1E6B\u1E6D\u1E6F\u1E71\u1E97]/g], // t
['U',/[\u0168\u016A\u016C\u016E\u0170\u0172\u01AF\u01D3\u01D5\u01D7\u01D9\u01DB\u0214\u0216\u1E72\u1E74\u1E76\u1E78\u1E7A\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0]/g], // U
['u',/[\u0169\u016B\u016D\u016F\u0171\u0173\u01B0\u01D4\u01D6\u01D8\u01DA\u01DC\u0215\u0217\u1E73\u1E75\u1E77\u1E79\u1E7B\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1]/g], // u
['V',/[\u1E7C\u1E7E]/g], // V
['v',/[\u1E7D\u1E7F]/g], // v
['W',/[\u0174\u1E80\u1E82\u1E84\u1E86\u1E88]/g], // W
['w',/[\u0175\u1E81\u1E83\u1E85\u1E87\u1E89\u1E98]/g], // w
['X',/[\u1E8A\u1E8C]/g], // X
['x',/[\u1E8B\u1E8D]/g], // x
['Y',/[\u0176\u0232\u1E8E\u1EF2\u1EF4\u1EF6\u1EF8]/g], // Y
['y',/[\u0177\u0233\u1E8F\u1E99\u1EF3\u1EF5\u1EF7\u1EF9]/g], // y
['Z',/[\u0179\u017B\u017D\u1E90\u1E92\u1E94]/g], // Z
['z',/[\u017A\u017C\u017E\u0240\u1E91\u1E93\u1E95]/g] // z
];
// suppression des signes diacritiques isolés
var diac_seuls = /[\u0300-\u036F\u1DC0-\u1DFF]/g; // bloc des diacritiques et des bloc des diacritiques suppléments
chaine = chaine.replace(diac_seuls,'');
// traitement en deux étapes, pour accélerer le traitement des chaînes sans caractères codés sur deux octets
// suppression des signes diacritiques sur 1 octet + 3 lettres pour le français français
for (var i = 0; i < diac_fr.length; i++) {
chaine = chaine.replace(diac_fr[i][1],diac_fr[i][0]);
}
// suppression des signes diacritiques sur 2 octets, uniquement s'il y en a
var car_etendus = /[\u0100-\u1EFE]/g;
if (car_etendus.test (chaine)) {
for (var i = 0; i < diac_autres.length; i++) {
chaine = chaine.replace(diac_autres[i][1],diac_autres[i][0]);
}
}
return chaine;
}