Subversion Repositories eFlore/Applications.coel

Rev

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

Rev Author Line No. Line
1497 jpm 1
<?php
2
/**
3
 * Service fournissant le contenu d'une page d'aide de l'application COEL.
4
 * Encodage en entrée : utf8
5
 * Encodage en sortie : utf8
6
 *
7
 * Cas d'utilisation :
8
 * /CoelAide/MaPageWikini : retourne le contenu HTML de la page nommée MaPagaWikini dans le wikini d'aide
9
 *
10
 * @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
11
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
12
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
13
 * @version $Id$
14
 * @copyright 2009
15
 */
16
class CoelAide {
17
 
18
	private $rawAideBaseUrlTpl = null;
19
	private $pageAideBaseUrlTpl = null;
20
	private $pageAideBaseUrl = null;
21
	private $serviceBaseUrl = null;
22
 
23
	private $sommaire = array();
24
 
25
	public function __construct($config) {
26
		$this->rawAideBaseUrlTpl = $config['coel']['aideBaseUrlTpl'].'%s/raw_html';
27
		$this->pageAideBaseUrlTpl = $config['coel']['aideBaseUrlTpl'].'%s';
28
		$this->pageAideBaseUrl = $config['coel']['aideBaseUrlTpl'];
29
		$this->serviceBaseUrl = $config['coel']['urlBaseJrest'].'CoelAide/';
30
		header('Content-Type: text/html; charset=utf-8');
31
	}
32
 
33
	/**
34
	 * Méthode appelée quand on récupère au moins un élément
35
	 */
36
	public function getElement($param) {
37
		$sortie = "Contenu de la page introuvable";
38
		if (isset($param[0])) {
39
			$aide_url = sprintf($this->rawAideBaseUrlTpl, $param[0]);
40
			$html = file_get_contents($aide_url);
41
			// Encodage en UTF-8
42
			$html = mb_convert_encoding($html, 'UTF-8', 'ISO-8859-1');
43
			// Remplacement des URLs
44
			$sortie = $this->remplacerUrl($html);
45
		}
46
 
47
		if (isset($param[1])) {
48
			if ('sommaire' == $param[1]) {
49
				$this->construireSommaireDepuisHtml($html);
50
				$sortie = json_encode($this->sommaire);
51
			}
52
		}
53
 
54
		// Envoie sur la sortie standard
55
		print($sortie);
56
	}
57
 
58
	private function construireSommaireDepuisHtml($html) {
59
		$parser = new WdHTMLParser();
60
		$tree = $parser->parse($html);
61
		foreach ($tree as $node) {
62
			$info = array();
63
			if (!is_array($node)) {
64
				$this->sommaire['txt'] = $node;
65
			} else {
66
				if (isset($node['name'])) {
67
					if ($this->estListeHtml($node['name'])) {
68
						$this->sommaire[]['liste'] = $this->extraireSommaireDepuisListeHtml($node['children']);
69
					} else {
70
						$info = $this->extraireCodeEtTxt($node);
71
						if (count($info) != 0) {
72
							$this->sommaire[] = $info;
73
						}
74
					}
75
				}
76
			}
77
		}
78
		//echo '<pre>' . print_r($this->sommaire, true) . '</pre>';
79
		//echo '<pre>' . print_r($tree, true) . '</pre>';
80
	}
81
 
82
	private function extraireSommaireDepuisListeHtml($liste) {
83
		$sommaire = array();
84
		foreach ($liste as $node) {
85
			if (!is_array($node)) {
86
				$sommaire['txt'] = $node;
87
			} else {
88
				if ($this->estListeHtml($node['name'])) {
89
					$sommaire['liste'] = $this->extraireSommaireDepuisListeHtml($node['children']);
90
				} else if ($node['name'] == 'li') {
91
					$sommaire[] = $this->extraireSommaireDepuisListeHtml($node['children']);
92
				} else {
93
					$sommaire = array_merge($this->extraireCodeEtTxt($node), $sommaire);
94
				}
95
			}
96
		}
97
		return $sommaire;
98
	}
99
 
100
	private function estListeHtml($valeur_a_tester) {
101
		$est_liste = false;
102
		if ($valeur_a_tester == 'ul' || $valeur_a_tester == 'ol') {
103
			$est_liste = true;
104
		}
105
		return $est_liste;
106
	}
107
 
108
	private function extraireCodeEtTxt($node) {
109
		$info = array();
110
		if ($node['name'] == 'a') {
111
			if (preg_match('/wiki=([a-zA-Z0-9]+)(?:\/|\?|$)/', $node['args']['href'], $match)) {
112
				$info['code'] = $match[1];
113
				if ($node['children'][0] != '?') {
114
					$info['txt'] = $node['children'][0];
115
				}
116
			}
117
		} else if ($node['name'] == 'span' && $node['args']['class'] == 'missingpage') {
118
			$info['txt'] = $node['children'][0];
119
		} else if (preg_match('/^h[1-6]$/i', $node['name'])) {
120
			$info['txt'] = $node['children'][0];
121
		}
122
		return $info;
123
	}
124
 
125
	private function remplacerUrl($txt) {
126
		// Remplacement des caractères posant problèmes dans les expressions régulières
127
		$caracteres = array('.' => '\.', '/' => '\/', '?' => '\?');
128
		$regexp_pageAideBaseUrl = strtr($this->pageAideBaseUrl, $caracteres);
129
 
130
		// Remplace des urls par celle du service
131
		$txt = preg_replace('/'.$regexp_pageAideBaseUrl.'([^"])/', "{$this->serviceBaseUrl}$1", $txt);
132
		return $txt;
133
	}
134
}
135
?>