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

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

Plugin «Groupes de mots arborescents» de préfixe «gma» qui permet de faire des hiérarchies de groupes de mots.

Il ne fonctionne pour l'instant qu'avec la version trunk du plugin mots.

On peut donc créer une arborescence de groupes de mots, et mettre des mots dans chaque groupe.

  • Les propriétés d'un sous groupe de mots héritent automatiquement du groupe racine (et ne sont pas modifiable hors du groupe racine)
  • Le squelettes de liaison des mots clés sont sur surchargés pour ne lister que les groupes racines, et afficher dans les sélecteurs l'arborescence complète des groupes et mots.
  • On ne peut supprimer un groupe que si le groupe n'a pas de sous groupe

Par ailleurs, on utilise une implémentation de QueryPath? (http://querypath.org/) (non sans mal) pour modifier le code HTML du formulaire de groupes de mots.

Cette librairie quoi que très bien s'appuie sur la classe domDocument elle même s'appuyant sur libxml2 qui a un léger bug lors de l'import d'un texte HTML qui possède des CDATA dans des scripts : la librairie double alors ces échappements par des nouveaux ! Du coup, on les enlève avant d'utiliser la librairie (qui de toutes façons les remets).

Cette librairie pourrait être mise dans un plugin spécifique car très pratique une fois les soucis réglés (CDATA et passer le texte en unicode avant importation).

File size: 2.5 KB
Line 
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
18if (!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**/
27define('SOURCE_QUERYPATH', _DIR_PLUGIN_GMA . 'lib/QueryPath-2.1.2.phar');
28
29// charger l'archive
30include_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**/
46function 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**/
75function 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}
Note: See TracBrowser for help on using the repository browser.