* @license GPL v3 * @license CECILL v2 * @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 '
' . print_r($this->sommaire, true) . '
'; //echo '
' . print_r($tree, true) . '
'; } 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; } } ?>