Blame | 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 standardprint($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;}}?>