Subversion Repositories Applications.dictionnaire

Rev

Rev 10 | Rev 12 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 10 Rev 11
1
/*
1
/*
2
  Surligneur de mot (glossaire)
2
  Surligneur de mot (glossaire)
3
 
3
 
4
  0) tout d'abord la liste des mots est récupée (getMotsADefinitions) et stockée dans motsAyantDefinition
4
  0) tout d'abord la liste des mots est récupée (getMotsADefinitions) et stockée dans motsAyantDefinition
5
 
5
 
6
  1) chaque mot de la liste subie une transformation progressive en pattern:
6
  1) chaque mot de la liste subie une transformation progressive en pattern:
7
  * les mots de moins de 3 caractères sont inchangés (exemple: "nu")
7
  * les mots de moins de 3 caractères sont inchangés (exemple: "nu")
8
  * les mots finissant en "eux/euse" sont généricisés
8
  * les mots finissant en "eux/euse" sont généricisés
9
  * les autres mots se voit ajoutée la possibilité de matcher sur \\w{0,2}
9
  * les autres mots se voit ajoutée la possibilité de matcher sur \\w{0,2}
10
 
10
 
11
  2) puis plusieurs RegExp sont baties à partir de la liste de pattern préliminaires
11
  2) puis plusieurs RegExp sont baties à partir de la liste de pattern préliminaires
12
  * regexp_complete permet d'assurer que le mot:
12
  * regexp_complete permet d'assurer que le mot:
13
  ** commence en début de ligne
13
  ** commence en début de ligne
14
  ** suit un espace
14
  ** suit un espace
15
  ** ne suit pas un caractère
15
  ** ne suit pas un caractère
16
  [ mais ne s'assure pas que le mot ne suit PAS un caractère accentué, cf notes à propos de \\b et l'UTF-8 ]
16
  [ mais ne s'assure pas que le mot ne suit PAS un caractère accentué, cf notes à propos de \\b et l'UTF-8 ]
17
 
17
 
18
  * regexp_thin permet de s'assurer que le mot:
18
  * regexp_thin permet de s'assurer que le mot:
19
  ** ne se trouve pas déjà encapsulé dans un <span rel="" class="definition_term">X</span>
19
  ** ne se trouve pas déjà encapsulé dans un <span rel="" class="definition_term">X</span>
20
  ** ne se trouve pas comme attribut "rel" d'un <span rel="X" class="definition_term"></span>
20
  ** ne se trouve pas comme attribut "rel" d'un <span rel="X" class="definition_term"></span>
21
  ** n'est pas directement précédé d'un accent (parmis ceux utilisés dans la BDD, cf exclureSpan)
21
  ** n'est pas directement précédé d'un accent (parmis ceux utilisés dans la BDD, cf exclureSpan)
22
  ** n'est pas directement précédé d'un caractère alphabétique
22
  ** n'est pas directement précédé d'un caractère alphabétique
23
  Et tente d'extraire une partie de contexte significative (jusqu'à 24 caractère car initialement le
23
  Et tente d'extraire une partie de contexte significative (jusqu'à 24 caractère car initialement le
24
  test d'inclusion dans .definition_term était faire plus tardivement.
24
  test d'inclusion dans .definition_term était faire plus tardivement.
25
 
25
 
26
  3) remplacerDefinitions() prend la liste des nodes susceptibles de nécessiter un traitement
26
  3) remplacerDefinitions() prend la liste des nodes susceptibles de nécessiter un traitement
27
  et ignore ceux ayant déjà été traités [max_passages] fois (4 par défaut)
27
  et ignore ceux ayant déjà été traités [max_passages] fois (4 par défaut)
28
 
28
 
29
  4) pour chaque node:
29
  4) pour chaque node:
30
  * le compteur de passage est incrémenté
30
  * le compteur de passage est incrémenté
31
  * nesseciteSubstitution() est appellé
31
  * nesseciteSubstitution() est appellé
32
 
32
 
33
  == nesseciteSubstitution() ==:
33
  == nesseciteSubstitution() ==:
34
  ** Utilise regexp_thin pour extraire les mots restant à définir ainsi qu'une partie de leur contexte.
34
  ** Utilise regexp_thin pour extraire les mots restant à définir ainsi qu'une partie de leur contexte.
35
  ** Utilise regexp_complete pour extraire les mots au plus proche de leur bodures avec un moindre risque d'erreur
35
  ** Utilise regexp_complete pour extraire les mots au plus proche de leur bodures avec un moindre risque d'erreur
36
  ** exlue les faux positifs possibles de regexp_thin
36
  ** exlue les faux positifs possibles de regexp_thin
37
  ** renvoi les matches de regexp_thin (qui présente plus de contexte)
37
  ** renvoi les matches de regexp_thin (qui présente plus de contexte)
38
  =============================
38
  =============================
39
 
39
 
40
  * pour chaque correspondance retournée par nesseciteSubstitution(),
40
  * pour chaque correspondance retournée par nesseciteSubstitution(),
41
  le mot d'origine (tel que dans motsAyantDefinition)
41
  le mot d'origine (tel que dans motsAyantDefinition)
42
  est déterminé en utilisant le levenstein (un cache est mis en place, cf texte_to_mot() dans helpers.js).
42
  est déterminé en utilisant le levenstein (un cache est mis en place, cf texte_to_mot() dans helpers.js).
43
 
43
 
44
  * rechercherEtRemplacerMotParDefinition() est appelée pour effectuer la substitution dans le node
44
  * rechercherEtRemplacerMotParDefinition() est appelée pour effectuer la substitution dans le node
45
 
45
 
46
 
46
 
47
  Contraintes rencontrées:
47
  Contraintes rencontrées:
48
  1) exclure les mots déjà défini via la regexp général plutôt qu'au coup par coup.
48
  1) exclure les mots déjà défini via la regexp général plutôt qu'au coup par coup.
49
  2) vérifier les bordures
49
  2) vérifier les bordures
50
  3) vérifier bordure d'accents:
50
  3) vérifier bordure d'accents:
51
  \\b(é) dans une regexp ne peut matcher une chaîne JS UTF-8
51
  \\b(é) dans une regexp ne peut matcher une chaîne JS UTF-8
52
  http://stackoverflow.com/questions/2881445/utf-8-word-boundary-regex-in-javascript
52
  http://stackoverflow.com/questions/2881445/utf-8-word-boundary-regex-in-javascript
53
*/
53
*/
54
 
54
 
55
var dictionnaire = new Array();
55
var dictionnaire = new Array();
56
var motsAyantDefinition = null;
56
var motsAyantDefinition = null;
57
var mouseX = null;
57
var mouseX = null;
58
var mouseY = null;
58
var mouseY = null;
59
var active = false;
59
var active = false;
60
var set = 'p, span:not(.definition_term), td, pre, div, li';
60
var set = 'p, span:not(.definition_term), td, pre, div, li';
61
 
61
 
62
// Note: utiliser \\b plutôt que \\W pour matcher les bordures de mots
62
// Note: utiliser \\b plutôt que \\W pour matcher les bordures de mots
63
// en incluant début et fin de ligne
63
// en incluant début et fin de ligne
64
var regexp_complete = null;
64
var regexp_complete = null;
65
 
-
 
66
var regexp_context = null;
-
 
67
var regexp_thin = null;
65
var regexp_thin = null;
68
 
66
 
69
// nombre maximum de passages de la détection sur un node donné
67
// nombre maximum de passages de la détection sur un node donné
70
var max_passages = 4;
68
var max_passages = 4;
71
 
69
 
72
// echo $(mysql<<<"SELECT cle FROM definitions"|tr "[a-z,-]" o|sed -e 's/o//g' -e "s/\(.\)/\1\n/g"|sort -u)
70
// echo $(mysql<<<"SELECT cle FROM definitions"|tr "[a-z,-]" o|sed -e 's/o//g' -e "s/\(.\)/\1\n/g"|sort -u)
73
// ç é è ê î ï ô (2013/07/03)
71
// ç é è ê î ï ô (2013/07/03)
74
// TODO: http://xregexp.com/plugins/
72
// TODO: http://xregexp.com/plugins/
75
var	exclureSpan = '([^' +
73
var	exclureSpan = '([^' +
76
	'(?:class="definition_term">)' + // mot contextualisé déjà dictionnarisé
74
	'(?:class="definition_term">)' + // mot contextualisé déjà dictionnarisé
77
	'(?:rel=")' + // la valeur du rel="" d'un mot déjà dictionnarisé
75
	'(?:rel=")' + // la valeur du rel="" d'un mot déjà dictionnarisé
78
	'çéèêîïô' + // les accents, non-traités dans la regexp générale et qui ne doivent pas
76
	'çéèêîïô' + // les accents, non-traités dans la regexp générale et qui ne doivent pas
79
	// être pris pour des bordures de mots
77
	// être pris pour des bordures de mots
80
	'\\w' +
78
	'\\w' +
81
	']|^){1,24}';
79
	']|^){1,24}';
82
 
80
 
83
 
-
 
84
function supprimerAccents(str) { 
-
 
85
    var rExps=[ 
-
 
86
		{re:/[\xC0-\xC6]/g, ch:'A'}, 
-
 
87
		{re:/[\xE0-\xE6]/g, ch:'a'}, 
-
 
88
		{re:/[\xC8-\xCB]/g, ch:'E'}, 
-
 
89
		{re:/[\xE8-\xEB]/g, ch:'e'}, 
-
 
90
		{re:/[\xCC-\xCF]/g, ch:'I'}, 
-
 
91
		{re:/[\xEC-\xEF]/g, ch:'i'}, 
-
 
92
		{re:/[\xD2-\xD6]/g, ch:'O'}, 
-
 
93
		{re:/[\xF2-\xF6]/g, ch:'o'}, 
-
 
94
		{re:/[\xD9-\xDC]/g, ch:'U'}, 
-
 
95
		{re:/[\xF9-\xFC]/g, ch:'u'}, 
-
 
96
		{re:/[\xD1]/g, ch:'N'}, 
-
 
97
		{re:/[\xF1]/g, ch:'n'} ]; 
-
 
98
    for(var i=0, len=rExps.length; i<len; i++) 
-
 
99
        str=str.replace(rExps[i].re, rExps[i].ch);
-
 
100
    return str; 
-
 
101
};
-
 
102
 
-
 
103
// c'est moche mais le mauvais support de l'unicode dans 
-
 
104
// javascript ne me permet pas de faire mieux
-
 
105
function etendreChaineAccents(str) {
-
 
106
    return str.replace('a',"(a|à|á|â|ã|ä|å)")
-
 
107
		.replace('e',"(e|è|é|ê|ë)")
-
 
108
		.replace('i',"(i|ì|í|î|ï)")
-
 
109
		.replace('o',"(o|ò|ó|ô|õ|ö)")
-
 
110
		.replace('u',"(u|ù|ú|û|ü)")
-
 
111
		.replace('y',"(ýÿ)")
-
 
112
		.replace('a',"(a|à|á|â|ã|ä|å)")
-
 
113
		.replace('æ',"(ae|æ)")
-
 
114
		.replace('ç',"(ç|c)")
-
 
115
		.replace('ñ',"(ñ|n)") 
-
 
116
		.replace('œ',"(œ|oe)");  
-
 
117
}
-
 
118
 
81
 
119
function afficherLienDefinitions() {
82
function afficherLienDefinitions() {
120
	html = '<div id="conteneur_activation_definition"><a href="#">rechercher les définitions</a></div>';
83
	html = '<div id="conteneur_activation_definition"><a href="#">rechercher les définitions</a></div>';
121
	$('#conteneur_activation_definition').live('click', function(event) {
84
	$('#conteneur_activation_definition').live('click', function(event) {
122
		event.preventDefault();
85
		event.preventDefault();
123
		//supprimerToutesDefinitions();
86
		//supprimerToutesDefinitions();
124
		if(motsAyantDefinition == null) {
87
		if(motsAyantDefinition == null) {
125
			getMotsADefinitions();
88
			getMotsADefinitions();
126
			ajouterListenerDefinitions();
89
			ajouterListenerDefinitions();
127
		} else {
90
		} else {
128
			$(set).remplacerDefinitions(motsAyantDefinition);
91
			$(set).remplacerDefinitions(motsAyantDefinition);
129
		}
92
		}
130
	});
93
	});
131
	$('body').append(html);
94
	$('body').append(html);
132
}
95
}
133
 
-
 
134
function normaliserMotPourRecherche(str) {
-
 
135
	str = supprimerAccents(str);
-
 
136
	str = etendreChaineAccents(str);
-
 
137
	return str;
-
 
138
}
-
 
139
 
96
 
140
$.fn.remplacerDefinitions = function(mots) {
97
$.fn.remplacerDefinitions = function(mots) {
141
    this.each(function() {
98
    this.each(function() {
142
        $(this).contents().filter(function() {
99
        $(this).contents().filter(function() {
143
        	return (this.nodeType == 3 && ! (($(this).data("count") || 0) > max_passages));
100
        	return (this.nodeType == 3 && ! (($(this).data("count") || 0) > max_passages));
144
        }).each(function() {
101
        }).each(function() {
145
			$(this).data("count", ($(this).data("count") || 0) + 1);
102
			$(this).data("count", ($(this).data("count") || 0) + 1);
146
			ttexte = texte = $(this).text();
103
			ttexte = texte = $(this).text();
147
			matches_list = nesseciteSubstitution(texte)[0];
104
			matches_list = nesseciteSubstitution(texte)[0];
148
			if(!matches_list) return true; // TODO: data("count") = max_passages ?
105
			if(!matches_list) return true; // TODO: data("count") = max_passages ?
149
 
106
 
150
			for(i in matches_list) {
107
			for(i in matches_list) {
151
				couple = matches_list[i];
108
				couple = matches_list[i];
152
				mot_contextualise = couple[2];
109
				mot_contextualise = couple[2];
153
				cle = texte_to_mot(mot_contextualise);
110
				cle = texte_to_mot(mot_contextualise);
154
 
111
 
155
				if(! (ttexte = rechercherEtRemplacerMotParDefinition(texte, cle, couple))) break;
112
				if(! (ttexte = rechercherEtRemplacerMotParDefinition(texte, cle, couple))) break;
156
				texte = ttexte;
113
				texte = ttexte;
157
			}
114
			}
158
			$(this).replaceWith(texte);
115
			$(this).replaceWith(texte);
159
		});
116
		});
160
	});
117
	});
161
	return this;
118
	return this;
162
}
119
}
163
 
120
 
164
function rechercherEtRemplacerMotParDefinition(texte, mot, couple) {
121
function rechercherEtRemplacerMotParDefinition(texte, mot, couple) {
165
	var full_contexte = couple[0],
122
	var full_contexte = couple[0],
166
	prefix_solo = couple[1],
123
	prefix_solo = couple[1],
167
	mot_contextualise = couple[2];
124
	mot_contextualise = couple[2];
168
 
125
 
169
	// cf exclureSpan
126
	// cf exclureSpan
170
	if(new RegExp('((?:class="definition_term">)|(?:rel=")|(?:[çéèêîïô]))(' + mot + "\\w{0,2}" + ')' + "\\b", "ig").test(full_contexte)) return;
127
	if(new RegExp('((?:class="definition_term">)|(?:rel=")|(?:[çéèêîïô]))(' + mot + "\\w{0,2}" + ')' + "\\b", "ig").test(full_contexte)) return;
171
 
128
 
172
	templateMotADefinition = formaterTemplateMotADefinition(mot_contextualise, mot);
129
	templateMotADefinition = formaterTemplateMotADefinition(mot_contextualise, mot);
173
	bloc_replace = full_contexte.replace(mot_contextualise, templateMotADefinition);
130
	bloc_replace = full_contexte.replace(mot_contextualise, templateMotADefinition);
174
	return texte.replace(full_contexte, bloc_replace);
131
	return texte.replace(full_contexte, bloc_replace);
175
}
132
}
176
 
133
 
177
 
134
 
178
function nesseciteSubstitution(texte) {
135
function nesseciteSubstitution(texte) {
179
	var liste = [], liste_complete = [];
136
	var liste = [], liste_complete = [];
180
 
137
 
181
	// regexp d'extraction du contexte, sans limite aux bords de "mot",
138
	// regexp d'extraction du contexte, sans limite aux bords de "mot",
182
	// peu amener des faux positifs, et notamment ne pas matcher au mieux.
139
	// peu amener des faux positifs, et notamment ne pas matcher au mieux.
183
	// Eg: subsessiles match "sessile" et non "subsessile".
140
	// Eg: subsessiles match "sessile" et non "subsessile".
184
	while( (matches_c = regexp_thin.exec(texte)) ) {
141
	while( (matches_c = regexp_thin.exec(texte)) ) liste.push(matches_c);
185
		//liste.push(getUnique(clean(matches_c)));
-
 
186
		liste.push(matches_c);
-
 
187
	}
-
 
188
 
-
 
189
	if(liste.length == 0) return [null];
142
	if(liste.length == 0) return [null];
190
 
143
 
191
	// regexp de validation des bordure de mots, ne conserve que des matches correct
144
	// regexp de validation des bordure de mots, ne conserve que des matches correct
192
	// vis-à-vis de la bordure gauche
145
	// vis-à-vis de la bordure gauche
193
	while( (matches_c = regexp_complete.exec(texte)) ) {
146
	while( (matches_c = regexp_complete.exec(texte)) ) liste_complete.push(matches_c[1]);
194
		liste_complete.push(matches_c[1]);
-
 
195
	}
-
 
196
 
147
 
197
	// si une match n'est pas dans le tableau des mots autorisés (indexOf)
148
	// si une match n'est pas dans le tableau des mots autorisés (indexOf)
198
	for(var i = 0; i < liste.length; i++) {
149
	for(var i = 0; i < liste.length; i++) {
199
		if($.inArray(liste[i][2], liste_complete) == -1) liste.splice(i, 1);
150
		if($.inArray(liste[i][2], liste_complete) == -1) liste.splice(i, 1);
200
	}
151
	}
201
 
152
 
202
	return [liste, liste_complete]
153
	return [liste, liste_complete]
203
}
154
}
204
 
-
 
205
 
155
 
206
function getMotsADefinitions() {
156
function getMotsADefinitions() {
207
	$.ajax({
157
	$.ajax({
208
		url: URL_BASE_SERVICE+'mots/', // provient de dictionnaire.config.js
158
		url: URL_BASE_SERVICE+'mots/', // provient de dictionnaire.config.js
209
		success: function(data) {
159
		success: function(data) {
210
			motsAyantDefinition = data;
160
			motsAyantDefinition = data;
211
			batirRegexp(motsAyantDefinition);
161
			batirRegexp(motsAyantDefinition);
212
			$(set).remplacerDefinitions(motsAyantDefinition);
162
			$(set).remplacerDefinitions(motsAyantDefinition);
213
 
-
 
214
		},
163
		},
215
		dataType: "JSON",
164
		dataType: "JSON",
216
		global: false
165
		global: false
217
	});
166
	});
218
}
167
}
219
 
168
 
220
function batirRegexp(mots) {
169
function batirRegexp(mots) {
221
	var restr = '';
170
	var restr = '';
222
	$.each(mots, function(index, mot) {
171
	$.each(mots, function(index, mot) {
223
		if(restr != '') restr += '|';
172
		if(restr != '') restr += '|';
224
 
173
 
225
		if(mot.length < 3) {
174
		if(mot.length < 3) {
226
			restr += mot;
175
			restr += mot;
227
		}
176
		}
228
		// gestion masculin/féminin en "eux/euse"
177
		// gestion masculin/féminin en "eux/euse"
229
		else if(mot.substr(-1) == 'x') {
178
		else if(mot.substr(-1) == 'x') {
230
			restr += mot.slice(0, -1) + "(?:x|se|ses)";
179
			restr += mot.slice(0, -1) + "(?:x|se|ses)";
231
		}
180
		}
232
		else if(mot.substr(-4) == 'euse') { // TODO: fix DB
181
		else if(mot.substr(-4) == 'euse') { // TODO: fix DB
233
			restr += mot.slice(0, -2) + "(?:x|se|ses)";
182
			restr += mot.slice(0, -2) + "(?:x|se|ses)";
234
		}
183
		}
235
		else
184
		else
236
			restr += mot + "\\w{0,2}";
185
			restr += mot + "\\w{0,2}";
237
	});
186
	});
238
 
187
 
239
	regexp_complete = new RegExp("(?:\\s|^|\\W)(" + restr + ")\\b", "ig"); // accents
188
	regexp_complete = new RegExp("(?:\\s|^|\\W)(" + restr + ")\\b", "ig"); // accents
240
	regexp_thin = new RegExp(exclureSpan + "(" + restr + ")\\b", "ig");
189
	regexp_thin = new RegExp(exclureSpan + "(" + restr + ")\\b", "ig");
241
}
190
}
242
 
191
 
243
function formaterTemplateMotADefinition(motOriginal, motSimplifie) {
192
function formaterTemplateMotADefinition(motOriginal, motSimplifie) {
244
	definitionHtml = '<span rel="'+motSimplifie+'" class="definition_term">'
193
	definitionHtml = '<span rel="'+motSimplifie+'" class="definition_term">'
245
		+motOriginal+
194
		+motOriginal+
246
		'</span>';
195
		'</span>';
247
	return definitionHtml;
196
	return definitionHtml;
248
}
197
}
249
 
198
 
250
function ajouterListenerDefinitions() {
199
function ajouterListenerDefinitions() {
251
	$('.definition_term').live('mouseover mouseout', function(event) {
200
	$('.definition_term').live('mouseover mouseout', function(event) {
252
		if (event.type == 'mouseover') {
201
		if (event.type == 'mouseover') {
253
			event.preventDefault();
202
			event.preventDefault();
254
			afficherDefinition($(this));
203
			afficherDefinition($(this));
255
		} else {
204
		} else {
256
			cacherPopupsDefinitions();
205
			cacherPopupsDefinitions();
257
		}
206
		}
258
	});
207
	});
259
}
208
}
260
 
209
 
261
function afficherDefinition(element) {
210
function afficherDefinition(element) {
262
	mot = element.attr('rel');
211
	mot = element.attr('rel');
263
	if(dictionnaire[mot] != null) {
212
	if(dictionnaire[mot] != null) {
264
		element.after(formaterDefinition(element));
213
		element.after(formaterDefinition(element));
265
		afficherPopupDefinition();
214
		afficherPopupDefinition();
266
	} else {
215
	} else {
267
		chargerDefinitionDistante(element);
216
		chargerDefinitionDistante(element);
268
	}
217
	}
269
}
218
}
270
 
219
 
271
function chargerDefinitionDistante(element) {
220
function chargerDefinitionDistante(element) {
272
	date = new Date();
221
	date = new Date();
273
	mot = element.attr('rel');
222
	mot = element.attr('rel');
274
	$.ajax({
223
	$.ajax({
275
		url: URL_BASE_SERVICE+'def/'+mot, // provient de dictionnaire.config.js
224
		url: URL_BASE_SERVICE+'def/'+mot, // provient de dictionnaire.config.js
276
		success: function(data) {
225
		success: function(data) {
277
			retour = data;
226
			retour = data;
278
			definition = retour.valeur;
227
			definition = retour.valeur;
279
			dictionnaire[mot] = definition;
228
			dictionnaire[mot] = definition;
280
			element.after(formaterDefinition(element));
229
			element.after(formaterDefinition(element));
281
			afficherPopupDefinition();
230
			afficherPopupDefinition();
282
		},
231
		},
283
		dataType: "JSON",
232
		dataType: "JSON",
284
		global: false
233
		global: false,
-
 
234
		async: false
285
	});
235
	});
286
}
236
}
287
 
237
 
288
function afficherPopupDefinition() {
238
function afficherPopupDefinition() {
289
	$(".definition_container").css({'top':mouseY + 20,'left':mouseX - 10}).fadeIn('slow');
239
	$(".definition_container").css({'top':mouseY + 20,'left':mouseX - 10}).fadeIn('slow');
290
}
240
}
291
 
241
 
292
function cacherPopupsDefinitions() {
242
function cacherPopupsDefinitions() {
293
	$(".definition_container").remove();
243
	$(".definition_container").remove();
294
}
244
}
295
 
245
 
296
function formaterDefinition(element) {	
246
function formaterDefinition(element) {	
297
	mot = element.attr('rel');
247
	mot = element.attr('rel');
298
	data = dictionnaire[mot];
248
	data = dictionnaire[mot];
299
	defHtml = '<div class="definition_container">'+
249
	defHtml = '<div class="definition_container">'+
300
		'<span class="definition_container_fleche"></span>'+
250
		'<span class="definition_container_fleche"></span>'+
301
		'<span class="definition">'+data+'</span>'+
251
		'<span class="definition">'+data+'</span>'+
302
		'</div>';
252
		'</div>';
303
	return defHtml;
253
	return defHtml;
304
}
254
}
305
 
255
 
306
function supprimerToutesDefinitions() {
256
function supprimerToutesDefinitions() {
307
	$('.definition_term').each(function() {
257
	$('.definition_term').each(function() {
308
		$(this).replaceWith($(this).html());
258
		$(this).replaceWith($(this).html());
309
	});
259
	});
310
	cacherPopupsDefinitions();
260
	cacherPopupsDefinitions();
311
}
261
}
312
 
262
 
313
$(document).bind('mousemove', function(e){
263
$(document).bind('mousemove', function(e){
314
	mouseX = e.pageX;
264
	mouseX = e.pageX;
315
    mouseY = e.pageY - $(window).scrollTop();
265
    mouseY = e.pageY - $(window).scrollTop();
316
});
266
});
317
 
267
 
318
$(document).ready(function() {
268
$(document).ready(function() {
319
	$.getScript(URL_BASE_SERVICE + "../../../scripts/helpers.js");
269
	$.getScript(URL_BASE_SERVICE + "../../../scripts/helpers.js");
320
	getMotsADefinitions();
270
	getMotsADefinitions();
321
	ajouterListenerDefinitions();
271
	ajouterListenerDefinitions();
322
	afficherLienDefinitions();
272
	afficherLienDefinitions();
323
});
273
});