Subversion Repositories eFlore/Applications.coel

Rev

Rev 1497 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * Service fournissant le contenu d'une page d'aide de l'application COEL.
 * Encodage en entrée : utf8
 * Encodage en sortie : utf8
 * 
 * Cas d'utilisation :
 * /CoelAide/MaPageWikini : retourne le contenu HTML de la page nommée MaPagaWikini dans le wikini d'aide
 * 
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
 * @version $Id$
 * @copyright 2009
 */
class CoelAide {
        
        private $rawAideBaseUrlTpl = null;
        private $pageAideBaseUrlTpl = null;
        private $pageAideBaseUrl = null;
        private $serviceBaseUrl = null;
        
        private $sommaire = array();
        
        public function __construct($config) {
                $this->rawAideBaseUrlTpl = $config['coel']['aideBaseUrlTpl'].'%s/raw_html';
                $this->pageAideBaseUrlTpl = $config['coel']['aideBaseUrlTpl'].'%s';
                $this->pageAideBaseUrl = $config['coel']['aideBaseUrlTpl'];
                $this->serviceBaseUrl = $config['coel']['urlBaseJrest'].'CoelAide/';
                header('Content-Type: text/html; charset=utf-8');
        }

        /**
         * Méthode appelée quand on récupère au moins un élément
         */
        public function getElement($param) {
                $sortie = "Contenu de la page introuvable";
                if (isset($param[0])) {
                        $aide_url = sprintf($this->rawAideBaseUrlTpl, $param[0]);
                        $html = file_get_contents($aide_url);
                        // Encodage en UTF-8
                        $html = mb_convert_encoding($html, 'UTF-8', 'ISO-8859-1');
                        // Remplacement des URLs
                        $sortie = $this->remplacerUrl($html);
                }
                
                if (isset($param[1])) {
                        if ('sommaire' == $param[1]) {
                                $this->construireSommaireDepuisHtml($html);
                                $sortie = json_encode($this->sommaire);
                        }
                }
                
                // Envoie sur la sortie standard
                print($sortie);
        }
        
        private function construireSommaireDepuisHtml($html) {
                $parser = new WdHTMLParser();
                $tree = $parser->parse($html);
                foreach ($tree as $node) {
                        $info = array();
                        if (!is_array($node)) {
                                $this->sommaire['txt'] = $node;
                        } else {
                                if (isset($node['name'])) {
                                        if ($this->estListeHtml($node['name'])) {
                                                $this->sommaire[]['liste'] = $this->extraireSommaireDepuisListeHtml($node['children']);
                                        } else {
                                                $info = $this->extraireCodeEtTxt($node);
                                                if (count($info) != 0) {
                                                        $this->sommaire[] = $info;
                                                }
                                        }
                                }
                        }
                }
                //echo '<pre>' . print_r($this->sommaire, true) . '</pre>';
                //echo '<pre>' . print_r($tree, true) . '</pre>';
        }
        
        private function extraireSommaireDepuisListeHtml($liste) {
                $sommaire = array();
                foreach ($liste as $node) {
                        if (!is_array($node)) {
                                $sommaire['txt'] = $node;
                        } else {
                                if ($this->estListeHtml($node['name'])) {
                                        $sommaire['liste'] = $this->extraireSommaireDepuisListeHtml($node['children']);
                                } else if ($node['name'] == 'li') {
                                        $sommaire[] = $this->extraireSommaireDepuisListeHtml($node['children']);
                                } else {
                                        $sommaire = array_merge($this->extraireCodeEtTxt($node), $sommaire);
                                }
                        }
                }
                return $sommaire;
        }
        
        private function estListeHtml($valeur_a_tester) {
                $est_liste = false;
                if ($valeur_a_tester == 'ul' || $valeur_a_tester == 'ol') {
                        $est_liste = true;
                }
                return $est_liste;
        }
        
        private function extraireCodeEtTxt($node) {
                $info = array();
                if ($node['name'] == 'a') {
                        if (preg_match('/wiki=([a-zA-Z0-9]+)(?:\/|\?|$)/', $node['args']['href'], $match)) {
                                $info['code'] = $match[1];
                                if ($node['children'][0] != '?') {
                                        $info['txt'] = $node['children'][0];
                                }
                        }
                } else if ($node['name'] == 'span' && $node['args']['class'] == 'missingpage') {
                        $info['txt'] = $node['children'][0];
                } else if (preg_match('/^h[1-6]$/i', $node['name'])) {
                        $info['txt'] = $node['children'][0];
                }
                return $info;
        }
        
        private function remplacerUrl($txt) {
                // Remplacement des caractères posant problèmes dans les expressions régulières
                $caracteres = array('.' => '\.', '/' => '\/', '?' => '\?');
                $regexp_pageAideBaseUrl = strtr($this->pageAideBaseUrl, $caracteres);
                
                // Remplace des urls par celle du service
                $txt = preg_replace('/'.$regexp_pageAideBaseUrl.'([^"])/', "{$this->serviceBaseUrl}$1", $txt);
                return $txt;
        }
}
?>