[ Index ] |
|
Code source de Serendipity 1.2 |
1 <?php # $Id: serendipity_event_searchhighlight.php 1789 2007-07-20 09:14:33Z garvinhicking $ 2 3 /**********************************/ 4 /* Authored by Tom Sommer, 2004 */ 5 /**********************************/ 6 7 8 if (IN_serendipity !== true) { 9 die ("Don't hack!"); 10 } 11 12 // Probe for a language include with constants. Still include defines later on, if some constants were missing 13 $probelang = dirname(__FILE__) . '/' . $serendipity['charset'] . 'lang_' . $serendipity['lang'] . '.inc.php'; 14 if (file_exists($probelang)) { 15 include $probelang; 16 } 17 18 include dirname(__FILE__) . '/lang_en.inc.php'; 19 20 class serendipity_event_searchhighlight extends serendipity_event 21 { 22 var $title = PLUGIN_EVENT_SEARCHHIGHLIGHT_NAME; 23 24 function introspect(&$propbag) 25 { 26 global $serendipity; 27 28 $propbag->add('name', PLUGIN_EVENT_SEARCHHIGHLIGHT_NAME); 29 $propbag->add('description', PLUGIN_EVENT_SEARCHHIGHLIGHT_DESC); 30 $propbag->add('stackable', false); 31 $propbag->add('author', 'Tom Sommer'); 32 $propbag->add('version', '1.4'); 33 $propbag->add('requirements', array( 34 'serendipity' => '0.8', 35 'smarty' => '2.6.7', 36 'php' => '4.1.0' 37 )); 38 $propbag->add('event_hooks', array('frontend_display' => true, 'css' => true)); 39 $propbag->add('groups', array('FRONTEND_EXTERNAL_SERVICES')); 40 41 $this->markup_elements = array( 42 array( 43 'name' => 'ENTRY_BODY', 44 'element' => 'body', 45 ), 46 array( 47 'name' => 'EXTENDED_BODY', 48 'element' => 'extended', 49 ), 50 array( 51 'name' => 'COMMENT', 52 'element' => 'comment', 53 ), 54 array( 55 'name' => 'HTML_NUGGET', 56 'element' => 'html_nugget', 57 ) 58 ); 59 60 $conf_array = array(); 61 foreach($this->markup_elements as $element) { 62 $conf_array[] = $element['name']; 63 } 64 $propbag->add('configuration', $conf_array); 65 } 66 67 68 function generate_content(&$title) { 69 $title = $this->title; 70 } 71 72 73 function introspect_config_item($name, &$propbag) 74 { 75 $propbag->add('type', 'boolean'); 76 $propbag->add('name', constant($name)); 77 $propbag->add('description', sprintf(APPLY_MARKUP_TO, constant($name))); 78 $propbag->add('default', 'true'); 79 return true; 80 } 81 82 function loadConstants() { 83 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_NONE', 0); 84 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_GOOGLE', 1); 85 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_YAHOO', 2); 86 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_LYCOS', 3); 87 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_MSN', 4); 88 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_ALTAVISTA', 5); 89 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_AOL_DE', 6); 90 define('PLUGIN_EVENT_SEARCHHIGHLIGHT_AOL_COM', 7); 91 } 92 93 function getSearchEngine() { 94 $url = parse_url($this->uri); 95 96 /* Patterns should be placed in the order in which they are most likely to occur */ 97 if ( preg_match('@^(www\.)?google\.@i', $url['host']) ) { 98 return PLUGIN_EVENT_SEARCHHIGHLIGHT_GOOGLE; 99 } 100 if ( preg_match('@^search\.yahoo\.@i', $url['host']) ) { 101 return PLUGIN_EVENT_SEARCHHIGHLIGHT_YAHOO; 102 } 103 if ( preg_match('@^search\.lycos\.@i', $url['host']) ) { 104 return PLUGIN_EVENT_SEARCHHIGHLIGHT_LYCOS; 105 } 106 if ( preg_match('@^search\.msn\.@i', $url['host']) ) { 107 return PLUGIN_EVENT_SEARCHHIGHLIGHT_MSN; 108 } 109 if ( preg_match('@^(www\.)?altavista\.@i', $url['host']) ) { 110 return PLUGIN_EVENT_SEARCHHIGHLIGHT_ALTAVISTA; 111 } 112 if ( preg_match('@^suche\.aol\.de@i', $url['host']) ) { 113 return PLUGIN_EVENT_SEARCHHIGHLIGHT_AOL_DE; 114 } 115 if ( preg_match('@^search\.aol\.com@i', $url['host']) ) { 116 return PLUGIN_EVENT_SEARCHHIGHLIGHT_AOL_COM; 117 } 118 119 if (!empty($_SESSION['search_referer']) && $this->uri != $_SESSION['search_referer']) { 120 $this->uri = $_SESSION['search_referer']; 121 return $this->getSearchEngine(); 122 } 123 124 return false; 125 } 126 127 function getQuery() { 128 if ( empty($this->uri) ) { 129 return false; 130 } 131 132 $this->loadConstants(); 133 $url = parse_url($this->uri); 134 parse_str($url['query'], $pStr); 135 136 switch ( $this->getSearchEngine() ) { 137 case PLUGIN_EVENT_SEARCHHIGHLIGHT_GOOGLE : 138 $query = $pStr['q']; 139 break; 140 141 case PLUGIN_EVENT_SEARCHHIGHLIGHT_YAHOO : 142 $query = $pStr['p']; 143 break; 144 145 case PLUGIN_EVENT_SEARCHHIGHLIGHT_LYCOS : 146 $query = $pStr['query']; 147 break; 148 149 case PLUGIN_EVENT_SEARCHHIGHLIGHT_MSN : 150 $query = $pStr['q']; 151 break; 152 153 case PLUGIN_EVENT_SEARCHHIGHLIGHT_ALTAVISTA : 154 $query = $pStr['q']; 155 break; 156 157 case PLUGIN_EVENT_SEARCHHIGHLIGHT_AOL_DE : 158 $query = $pStr['q']; 159 break; 160 161 case PLUGIN_EVENT_SEARCHHIGHLIGHT_AOL_COM : 162 $query = $pStr['query']; 163 break; 164 165 default: 166 return false; 167 } 168 169 /* Clean the query */ 170 $query = trim($query); 171 $query = preg_replace('/(\"|\')/i', '', $query); 172 173 /* Split by search engine chars or spaces */ 174 $words = preg_split('/[\s\,\+\.\-\/\=]+/', $query); 175 176 /* Strip search engine keywords or common words we don't bother to highlight */ 177 $words = array_diff($words, array('AND', 'OR', 'FROM', 'IN')); 178 179 return $words; 180 } 181 182 183 function event_hook($event, &$bag, &$eventData) { 184 global $serendipity; 185 186 $this->uri = $_SERVER['HTTP_REFERER']; 187 $hooks = &$bag->get('event_hooks'); 188 189 if (!isset($hooks[$event])) { 190 return false; 191 } 192 193 if ( $event == 'frontend_display' ) { 194 if ( ($queries = $this->getQuery()) === false ) { 195 return; 196 } 197 198 $_SESSION['is_searchengine_visitor'] = true; 199 $_SESSION['search_referer'] = $this->uri; 200 201 foreach ($this->markup_elements as $temp) { 202 if ( ! (serendipity_db_bool($this->get_config($temp['name'])) && isset($eventData[$temp['element']])) ) { 203 continue; 204 } 205 206 if ($eventData['properties']['ep_disable_markup_' . $this->instance] || 207 isset($serendipity['POST']['properties']['disable_markup_' . $this->instance])) { 208 continue; 209 } 210 211 $element = &$eventData[$temp['element']]; 212 213 foreach ( $queries as $word ) { 214 /* If the data contains HTML tags, we have to be careful not to break URIs and use a more complex preg */ 215 if ( preg_match('/\<.+\>/', $element) ) { 216 $_pattern = '/(?!<.*?)(\b'. preg_quote($word, '/') .'\b)(?![^<>]*?>)/im'; 217 } else { 218 $_pattern = '/(\b'. preg_quote($word, '/') .'\b)/im'; 219 } 220 $element = preg_replace($_pattern, '<span class="serendipity_searchQuery">$1</span>', $element); 221 } // end foreach 222 } // end foreach 223 return; 224 } // end if 225 226 227 if ( $event == 'css' ) { 228 /* If the user hasn't added a CSS Class called serendipity_searchQuery, we add a pretty one for him */ 229 if ( strstr($eventData, '.serendipity_searchQuery') === false ) { 230 $eventData .= "\n"; 231 $eventData .= '.serendipity_searchQuery {' . "\n"; 232 $eventData .= ' background-color: #D81F2A;' . "\n"; 233 $eventData .= ' color: #FFFFFF;' . "\n"; 234 $eventData .= '}' . "\n"; 235 } 236 return; 237 } 238 239 } // end function 240 } 241 242 /* vim: set sts=4 ts=4 expandtab : */ 243 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Nov 24 09:00:37 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |