source: spip-zone/_plugins_/querypath/inc/querypath.php @ 63421

Last change on this file since 63421 was 63421, checked in by marcimat@…, 8 years ago

Coquille

File size: 3.4 KB
Line 
1<?php
2
3/**
4 * Ce fichier Gère le chargement de la librairie QueryPath
5 *
6 * Une fois ce fichier chargé, vous avez accès à la fonction
7 * spip_query_path(), mais également si vous préférez aux fonctions
8 * de la librairie directement : qp(), htmlqp() ou encore directement
9 * la classe QueryPath.
10 *
11 * @link http://querypath.org/
12 * @version 2.1.2
13**/
14
15/**
16 * Plugin Query Path
17 * (c) 2012 Marcillaud Matthieu
18 * Licence GNU/GPL
19 */
20
21if (!defined('_ECRIRE_INC_VERSION')) return;
22
23
24/**
25 * Charger la librairie QueryPath
26 *
27 * Permet de chercher et modifier du HTML
28 * http://http://querypath.org/
29**/
30include_spip('lib/QueryPath/QueryPath');
31
32
33/**
34 * Retourne un objet QueryPath
35 *
36 * QueryPath est lancé, mais avec les modifications suivantes :
37 * - l'option replace_entities est passée par défaut à TRUE
38 * - lorsque $document est un texte, il est transformé en unicode
39 *   et les CDATA sont enlevés. Cela est plus pratique pour manipuler du HTML.
40 *
41 * @api
42 * @param string|null $document
43 *              URL ou texte du document XML/HTML
44 * @param string|null $string
45 *              Position sur laquelle se placer, exemple 'body'
46 * @param array $options
47 *              Option de la classe QueryPath
48 * @return SpipQueryPath
49 *              Objet QueryPath adapté pour SPIP
50 *
51**/
52function spip_query_path($document = NULL, $string = NULL, $options = array()) {
53
54        // convertir automatiquement si le document est une chaine
55        // en tenant compte du charset du site et des CDATA
56        if (is_string($document)) {
57                // domDocument a du mal avec l'UTF, c'est pourquoi
58                // QueryPath a des options pour transcoder la source
59                // en utilisant la librairie mb.
60                // Comme SPIP possède sa propre fonction, autant l'utiliser.
61                $document = charset2unicode($document);
62                // le chargement d'un HTML ayant déjà des CDATA est problématique
63                // car ils seront automatiquement doublés (cf. https://bugs.php.net/bug.php?id=54429)
64                // On les échappe ici automatiquement.
65                // Il ne faudrait peut être pas le faire si <?xml est là...
66                $document = querypath_echappe_CDATA($document);
67        }
68        // indiquer que les ajouts tel que ->after()
69        // doivent transformer les entités HTML présentes,
70        // sinon le XML est rarement correct et domDocument râle.
71        $options += array('replace_entities' => true);
72
73        // lancer
74        return qp($document, $string, $options);
75}
76
77
78/**
79 * Enlève les cdata présents dans un texte...
80 *
81 * domDocument les ajoute automatiquement
82 * sans possibilité de déconnecter la fonctionnalité.
83 * Du coup, lorsque les CDATA sont déjà présents, ce qui est le cas
84 * en général chez SPIP, ils se retrouvent doublés.
85 * Cf. https://bugs.php.net/bug.php?id=54429
86 *
87 * @param string $html
88 *              Contenu du document html
89 * @return string
90 *              Contenu sans les CDATA
91**/
92function querypath_echappe_CDATA($html) {
93        static $cdata_on  = '<!\[CDATA\[';
94        static $cdata_off = '\]\]>';
95
96        if (false !== strpos($html, '<![')) {
97                // echapper \\<![CDATA[    \\]]>
98                $html = preg_replace('/'
99                        . '\/\/' . $cdata_on  #ouverture
100                        . '(.*?)'             #contenu
101                        . '\/\/' . $cdata_off #fermuture
102                        . '/is', '$1', $html);
103                // echapper /* <![CDATA[ */    /* ]]> */
104                $html = preg_replace('/'
105                        . '\/\*\s*' . $cdata_on . '\s*\*\/'  #ouverture
106                        . '(.*?)'                            #contenu
107                        . '\/\*\s*' . $cdata_off . '\s*\*\/' #fermuture
108                        . '/is', '$1', $html);
109                // echapper <![CDATA[    ]]>
110                $html = preg_replace('/'
111                        . $cdata_on  #ouverture
112                        . '(.*?)'    #contenu
113                        . $cdata_off #fermuture
114                        . '/is', '$1', $html);
115        }
116        return $html;
117}
Note: See TracBrowser for help on using the repository browser.