Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Rev 207 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
class Surligneur {
        private $texte = '';
        private $tags = array();
        private $nbreSurlignageMaxParMot = 1;
        private $nbreSurlignageCourant = 0;

        public function __construct($texte = null, $surlignageMaxParMot = null) {
                if (is_null($texte) == false) {
                        $this->setTexte($texte);
                }
                if (is_null($surlignageMaxParMot) == false) {
                        $this->setNbreMaxSurlignageParMot($surlignageMaxParMot);
                }
        }

        public function setTexte($txt) {
                $this->texte = $txt;
        }

        public function setNbreMaxSurlignageParMot($nbre) {
                $this->nbreSurlignageMaxParMot = $nbre;
        }

        public function surlignerMots($mots) {
                $this->verifierTableauDeMots($mots);
                $this->texte = preg_replace_callback('`<[^>]+>`', array($this, 'sauverTags'), $this->texte);
                foreach ($mots as $mot) {
                        $this->initialiserNbreSurlignageCourant();
                        $this->texte = $this->surlignerMot($mot);
                }
                $this->texte = preg_replace_callback('`<([0-9]+)>`', array($this, 'restaurerTags'), $this->texte);
                return $this->texte;
        }

        private function verifierTableauDeMots($mots) {
                if (is_array($mots) === false) {
                        $message = "Surligneur::surlignerMots() n'accepte que les tableaux de mots en argument";
                        throw new InvalidArgumentException($message);
                } else {
                        if (count($mots) == 0) {
                                $message = "Surligneur::surlignerMots() n'accepte que des tableaux contenant au moins un mot";
                                throw new LengthException($message);
                        }
                }
        }

        private function sauverTags($match) {
                $i = count($this->tags);
                $this->tags[$i] = $match[0];
                return '<'.$i.'>';
        }

        private function initialiserNbreSurlignageCourant() {
                $this->nbreSurlignageCourant = 0;
        }

        private function surlignerMot($mot) {
                $positionDebutMot = stripos($this->texte, $mot);
                $longueurMot = strlen($mot);
                $surlignage = $this->texte;
                if ($positionDebutMot !== false) {
                        $this->nbreSurlignageCourant++;
                        if ($this->nbreSurlignageCourant <= $this->nbreSurlignageMaxParMot) {
                                $debut = substr($this->texte, 0, $positionDebutMot);
                                $milieu = substr($this->texte, $positionDebutMot, $longueurMot);
                                $this->texte = substr($this->texte, $positionDebutMot + $longueurMot);
                                $fin = $this->surlignerMot($mot);
                                $surlignage = $debut.$this->sauverTagSurlignage($milieu).$fin;
                        }
                }
                return $surlignage;
        }

        private function sauverTagSurlignage($motTrouve) {
                $i = count($this->tags);
                $this->tags[$i] = '<span class="surlignage">'.$motTrouve.'</span>';
                return '<'.$i.'>';
        }

        private function restaurerTags($match) {
                return $this->tags[$match[1]];
        }
}
?>