[ Index ]
 

Code source de Serendipity 1.2

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/plugins/serendipity_event_searchhighlight/ -> serendipity_event_searchhighlight.php (source)

   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  ?>


Généré le : Sat Nov 24 09:00:37 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics