Mise en route du suivi.
[aidenligne_francais_universite.git] / ecrire / inc / surligne.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14 //
15 if (!defined("_ECRIRE_INC_VERSION")) return;
16
17 // Ces commentaires vont etre substitue's en mode recherche
18 // voir les champs SURLIGNE dans inc-index-squel
19
20 define("MARQUEUR_SURLIGNE", '!-- debut_surligneconditionnel -->');
21 define("MARQUEUR_FSURLIGNE", '!-- finde_surligneconditionnel -->');
22
23 // http://doc.spip.org/@surligner_sans_accents
24 function surligner_sans_accents ($mot) {
25 $accents =
26 /* A */ chr(192).chr(193).chr(194).chr(195).chr(196).chr(197).
27 /* a */ chr(224).chr(225).chr(226).chr(227).chr(228).chr(229).
28 /* O */ chr(210).chr(211).chr(212).chr(213).chr(214).chr(216).
29 /* o */ chr(242).chr(243).chr(244).chr(245).chr(246).chr(248).
30 /* E */ chr(200).chr(201).chr(202).chr(203).
31 /* e */ chr(232).chr(233).chr(234).chr(235).
32 /* Cc */ chr(199).chr(231).
33 /* I */ chr(204).chr(205).chr(206).chr(207).
34 /* i */ chr(236).chr(237).chr(238).chr(239).
35 /* U */ chr(217).chr(218).chr(219).chr(220).
36 /* u */ chr(249).chr(250).chr(251).chr(252).
37 /* yNn */ chr(255).chr(209).chr(241);
38
39 if ($GLOBALS['meta']['charset'] == 'utf-8') {
40 include_spip('inc/charsets');
41 $mot = unicode2charset(utf_8_to_unicode($mot), 'iso-8859-1');
42 }
43
44 return strtr($mot, $accents, "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn");
45 }
46
47 // tres sale
48 // http://doc.spip.org/@split_by_char
49 function split_by_char($str) {
50 $len = strlen($str);
51 $streturn = array();
52 for ($i=0; $i<$len; $i++) {
53 $streturn[$i] = substr($str, $i, 1);
54 }
55 return $streturn;
56 }
57
58 // http://doc.spip.org/@surligner_regexp_accents
59 function surligner_regexp_accents ($mot) {
60 $accents_regexp = array(
61 "a" => "[a".chr(224).chr(225).chr(226).chr(227).chr(228).chr(229). chr(192).chr(193).chr(194).chr(195).chr(196).chr(197)."]",
62 "o" => "[o".chr(242).chr(243).chr(244).chr(245).chr(246).chr(248). chr(210).chr(211).chr(212).chr(213).chr(214).chr(216)."]",
63 "e" => "[e".chr(232).chr(233).chr(234).chr(235). chr(200).chr(201).chr(202).chr(203)."]",
64 "c" => "[c".chr(199).chr(231)."]",
65 "i" => "[i".chr(236).chr(237).chr(238).chr(239). chr(204).chr(205).chr(206).chr(207)."]",
66 "u" => "[u".chr(249).chr(250).chr(251).chr(252). chr(217).chr(218).chr(219).chr(220)."]",
67 "y" => "[y".chr(255)."]",
68 "n" => "[n".chr(209).chr(241)."]"
69 );
70
71 $mot = surligner_sans_accents ($mot);
72 if ($GLOBALS['meta']['charset'] == 'utf-8') {
73 while(list($k,$s) = each ($accents_regexp)) {
74 $accents_regexp_utf8[$k] = "(".join("|", split_by_char(preg_replace(',[\]\[],','',$accents_regexp[$k]))).")";
75 }
76 $mot = strtr(strtolower($mot), $accents_regexp_utf8);
77 $mot = importer_charset($mot, 'iso-8859-1');
78 } else
79 $mot = strtr(strtolower($mot), $accents_regexp);
80
81 return $mot;
82 }
83
84
85 // mettre en rouge les mots passes dans $var_recherche
86 // http://doc.spip.org/@surligner_mots
87 function surligner_mots($page, $mots) {
88 global $nombre_surligne;
89 include_spip('inc/texte'); // pour le reglage de $nombre_surligne
90 tester_variable('nombre_surligne', 4);
91
92 // Remplacer les caracteres potentiellement accentues dans la chaine
93 // de recherche par les choix correspondants en syntaxe regexp (!)
94 $mots = preg_split(',\s+,ms', $mots);
95
96 foreach ($mots as $mot) {
97 if (strlen($mot) >= 2) {
98 $mot = surligner_regexp_accents(preg_quote(str_replace('/', '', $mot)));
99 $mots_surligne[] = $mot;
100 }
101 }
102
103 if (!$mots_surligne) return $page;
104
105 $regexp = '/((^|>)([^<]*[^[:alnum:]_<\x80-\xFF])?)(('
106 . join('|', $mots_surligne)
107 . ')[[:alnum:]_\x80-\xFF]*?)/Uis';
108
109 // en cas de surlignement limite' (champs #SURLIGNE),
110 // le compilateur a inse're' les balises de surlignement
111 // sur toute la zone; reste a` raffiner.
112 // On boucle pour le cas ou` il y a plusieurs zones
113
114 $p = strpos($page, MARQUEUR_SURLIGNE);
115 if ($p !== false) {
116 $debut = '';
117 while ($p) {
118 $debut .= substr($page, 0, $p-1);
119 $page = substr($page, $p+strlen(MARQUEUR_SURLIGNE));
120 if (!$q = strpos($page,MARQUEUR_FSURLIGNE))
121 $q = 1+strlen($page);
122 $debut .= trouve_surligne(substr($page, 0, $q-1), $regexp);
123 $page = substr($page, $q+strlen(MARQUEUR_FSURLIGNE));
124 $p = strpos($page,MARQUEUR_SURLIGNE);
125 }
126 return $debut . $page;
127 } else {
128 // pour toute la page: ignorer ce qui est avant </head> ou <body>
129 $re = '/<\/head>|<body[^>]*>/i';
130 if (preg_match($re, $page, $exp)) {
131 $debut = substr($page, 0, strpos($page, $exp[0])+strlen($exp[0]));
132 $page = substr($page, strlen($debut));
133 } else
134 $debut = '';
135 return $debut . trouve_surligne($page, $regexp);
136 }
137 }
138
139 // http://doc.spip.org/@trouve_surligne
140 function trouve_surligne($page, $regexp) {
141 // Remplacer une occurrence de mot maxi par espace inter-tag
142 // (max 1 par paragraphe, sauf italiques etc.)
143 // se limiter a 4 remplacements pour ne pas bouffer le CPU ;
144 // traiter <textarea...>....</textarea> comme un tag.
145 global $nombre_surligne;
146 $page = preg_replace('/(<textarea[^>]*>)([^<>]*)(<\/textarea>)/Uis', '\1<<SPIP\2>>\3', $page);
147 $page = preg_replace($regexp, '\1<span class="spip_surligne">\4</span>', $page, $nombre_surligne);
148 $page = preg_replace('/(<textarea[^>]*>)<<SPIP([^<>]*)>>(<\/textarea>)/Uis', '\1\2\3', $page);
149 return $page ;
150 }
151
152 ?>