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