24c8531632d03285123c3c7887894f68e29e290f
[lhc/web/www.git] / www / ecrire / inc / surligne.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2017 *
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 * Gestion du surlignage des mots d'une recherche
15 *
16 * @package SPIP\Core\Surligne
17 **/
18 if (!defined('_ECRIRE_INC_VERSION')) {
19 return;
20 }
21
22 /**
23 * Ancien marqueur de début de surlignement
24 *
25 * @see balise_DEBUT_SURLIGNE_dist()
26 * @deprecated N'a plus d'effet
27 **/
28 define('MARQUEUR_SURLIGNE', 'debut_surligneconditionnel');
29 /**
30 * Ancien marqueur de fin de surlignement
31 *
32 * @see balise_FIN_SURLIGNE_dist()
33 * @deprecated N'a plus d'effet
34 **/
35 define('MARQUEUR_FSURLIGNE', 'finde_surligneconditionnel');
36
37
38 /**
39 * Ajoute au HTML un script JS surlignant une recherche indiquée et/ou issue des réferers
40 *
41 * Ajoute à la page HTML, seulement si des mots de recherches sont présents,
42 * — soit transmis, soit dans un réferer de moteur de recherche —
43 * un script qui s'occupera de les surligner. Le script est placé dans
44 * le head HTML si le texte en possède un, sinon à la fin.
45 *
46 * @param string $page
47 * Page HTML
48 * @param string $surcharge_surligne
49 * Mots à surligner transmis
50 * @return string
51 * Page HTML
52 **/
53 function surligner_mots($page, $surcharge_surligne = '') {
54 $surlignejs_engines = array(
55 array(
56 "," . str_replace(array("/", "."), array("\/", "\."), $GLOBALS['meta']['adresse_site']) . ",i",
57 ",recherche=([^&]+),i"
58 ), //SPIP
59 array(",^http://(www\.)?google\.,i", ",q=([^&]+),i"), // Google
60 array(",^http://(www\.)?search\.yahoo\.,i", ",p=([^&]+),i"), // Yahoo
61 array(",^http://(www\.)?search\.msn\.,i", ",q=([^&]+),i"), // MSN
62 array(",^http://(www\.)?search\.live\.,i", ",query=([^&]+),i"), // MSN Live
63 array(",^http://(www\.)?search\.aol\.,i", ",userQuery=([^&]+),i"), // AOL
64 array(",^http://(www\.)?ask\.com,i", ",q=([^&]+),i"), // Ask.com
65 array(",^http://(www\.)?altavista\.,i", ",q=([^&]+),i"), // AltaVista
66 array(",^http://(www\.)?feedster\.,i", ",q=([^&]+),i"), // Feedster
67 array(",^http://(www\.)?search\.lycos\.,i", ",q=([^&]+),i"), // Lycos
68 array(",^http://(www\.)?alltheweb\.,i", ",q=([^&]+),i"), // AllTheWeb
69 array(",^http://(www\.)?technorati\.com,i", ",([^\?\/]+)(?:\?.*)$,i"), // Technorati
70 );
71
72
73 $ref = $_SERVER['HTTP_REFERER'];
74 //avoid a js injection
75 if ($surcharge_surligne) {
76 $surcharge_surligne = preg_replace(",(?<!\\\\)((?:(?>\\\\){2})*)('),", "$1\\\\$2", $surcharge_surligne);
77 $surcharge_surligne = str_replace("\\", "\\\\", $surcharge_surligne);
78 if ($GLOBALS['meta']['charset'] == 'utf-8') {
79 include_spip('inc/charsets');
80 if (!is_utf8($surcharge_surligne)) {
81 $surcharge_surligne = utf8_encode($surcharge_surligne);
82 }
83 }
84 $surcharge_surligne = preg_replace(',\*$,', '', trim($surcharge_surligne)); # supprimer un * final
85 }
86 foreach ($surlignejs_engines as $engine) {
87 if ($surcharge_surligne || (preg_match($engine[0], $ref) && preg_match($engine[1], $ref))) {
88
89 //good referrer found or var_recherche is not null
90 include_spip('inc/filtres');
91 $script = "
92 <script type='text/javascript' src='" . url_absolue(find_in_path('javascript/SearchHighlight.js')) . "'></script>
93 <script type='text/javascript'>/*<![CDATA[*/
94 if (window.jQuery)
95 (function(\$){\$(function(){
96 \$(document).SearchHighlight({
97 tag_name:'" . (html5_permis() ? 'mark' : 'span') . "',
98 style_name:'spip_surligne',
99 exact:'whole',
100 style_name_suffix:false,
101 engines:[/^" . str_replace(array("/", "."), array("\/", "\."), $GLOBALS['meta']['adresse_site']) . "/i,/recherche=([^&]+)/i],
102 highlight:'.surlignable',
103 nohighlight:'.pas_surlignable'" .
104 ($surcharge_surligne ? ",
105 keys:'$surcharge_surligne'" : "") . ",
106 min_length: 3
107 })
108 });
109 })(jQuery);
110 /*]]>*/</script>
111 ";
112 // on l'insere juste avant </head>, sinon tout en bas
113 if (is_null($l = strpos($page, '</head>'))) {
114 $l = strlen($page);
115 }
116 $page = substr_replace($page, $script, $l, 0);
117 break;
118 }
119 }
120
121 return $page;
122 }