[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> surligne.php (source)

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


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics