New file |
0,0 → 1,135 |
<?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; |
} |
} |
?> |