1 | <?php |
---|
2 | |
---|
3 | /** |
---|
4 | * Ce fichier Gère la librairie QueryPath |
---|
5 | * |
---|
6 | * Ce pourrait faire l'objet d'un plugin spécifique. |
---|
7 | * À voir. |
---|
8 | * |
---|
9 | * http://http://querypath.org/ |
---|
10 | **/ |
---|
11 | |
---|
12 | /** |
---|
13 | * Plugin Groupes arborescents de mots clés |
---|
14 | * (c) 2012 Marcillaud Matthieu |
---|
15 | * Licence GNU/GPL |
---|
16 | */ |
---|
17 | |
---|
18 | if (!defined('_ECRIRE_INC_VERSION')) return; |
---|
19 | |
---|
20 | |
---|
21 | /** |
---|
22 | * Adresse de la librairie QueryPath |
---|
23 | * |
---|
24 | * Permet de chercher et modifier du HTML |
---|
25 | * http://http://querypath.org/ |
---|
26 | **/ |
---|
27 | define('SOURCE_QUERYPATH', _DIR_PLUGIN_GMA . 'lib/QueryPath-2.1.2.phar'); |
---|
28 | |
---|
29 | // charger l'archive |
---|
30 | include_once(SOURCE_QUERYPATH); |
---|
31 | |
---|
32 | |
---|
33 | /** |
---|
34 | * Retourne un objet QueryPath en utilisant la classe adaptée pour SPIP |
---|
35 | * |
---|
36 | * @param string|null $document |
---|
37 | * URL ou texte du document XML/HTML |
---|
38 | * @param string|null $string |
---|
39 | * Position sur laquelle se placer, exemple 'body' |
---|
40 | * @param array $options |
---|
41 | * Option de la classe QueryPath |
---|
42 | * @return SpipQueryPath |
---|
43 | * Objet QueryPath adapté pour SPIP |
---|
44 | * |
---|
45 | **/ |
---|
46 | function spip_query_path($document = NULL, $string = NULL, $options = array()) { |
---|
47 | |
---|
48 | // convertir automatiquement si le document est une chaine |
---|
49 | // en tenant compte du charset du site et des CDATA |
---|
50 | if (is_string($document)) { |
---|
51 | $document = charset2unicode($document); |
---|
52 | $document = gma_echappe_CDATA($document); |
---|
53 | } |
---|
54 | |
---|
55 | // lancer |
---|
56 | return qp($document, $string, $options); |
---|
57 | } |
---|
58 | |
---|
59 | |
---|
60 | /** |
---|
61 | * Échappe les cdata présents dans un document... |
---|
62 | * |
---|
63 | * domDocument les ajoute automatiquement |
---|
64 | * sans possibilité de déconnecter la fonctionnalité. |
---|
65 | * Du coup, lorsque les CDATA sont déjà présents, ce qui est le cas |
---|
66 | * en général chez SPIP, ils se retrouvent doublés. |
---|
67 | * |
---|
68 | * Ici, on les enlève donc du document Texte d'origine. |
---|
69 | * |
---|
70 | * @param string $html |
---|
71 | * Contenu du document html |
---|
72 | * @return string |
---|
73 | * Contenu sans les CDATA |
---|
74 | **/ |
---|
75 | function gma_echappe_CDATA($html) { |
---|
76 | static $cdata_on = '<!\[CDATA\['; |
---|
77 | static $cdata_off = '\]\]>'; |
---|
78 | |
---|
79 | if (false !== strpos($html, '<![')) { |
---|
80 | // echapper \\<![CDATA[ \\]]> |
---|
81 | $html = preg_replace('/' |
---|
82 | . '\/\/' . $cdata_on #ouverture |
---|
83 | . '(.*?)' #contenu |
---|
84 | . '\/\/' . $cdata_off #fermuture |
---|
85 | . '/is', '$1', $html); |
---|
86 | // echapper /* <![CDATA[ */ /* ]]> */ |
---|
87 | $html = preg_replace('/' |
---|
88 | . '\/\*\s*' . $cdata_on . '\s*\*\/' #ouverture |
---|
89 | . '(.*?)' #contenu |
---|
90 | . '\/\*\s*' . $cdata_off . '\s*\*\/' #fermuture |
---|
91 | . '/is', '$1', $html); |
---|
92 | // echapper <![CDATA[ ]]> |
---|
93 | $html = preg_replace('/' |
---|
94 | . $cdata_on #ouverture |
---|
95 | . '(.*?)' #contenu |
---|
96 | . $cdata_off #fermuture |
---|
97 | . '/is', '$1', $html); |
---|
98 | } |
---|
99 | return $html; |
---|
100 | } |
---|