source: spip-zone/_plugins_/cairn/cairn_fonctions.php @ 90498

Last change on this file since 90498 was 90498, checked in by christopheld@…, 5 years ago

corrections:

  • modele doc_cairn pour l’export des images, y compris celles affichées dans un album. Le champ Crédit est maintenant pris en compte (balise <source>).
  • le chapeau devrait apparaître dans <liminaire>
File size: 8.6 KB
Line 
1<?php
2
3// formater un nombre
4// pour $format, voir http://php.net//manual/fr/function.sprintf.php
5function filtre_formater($chaine,$format) {
6    return sprintf($format,$chaine);
7}
8
9// stocker une chaine dans un CDATA
10// a noter qu'il faut "echapper" un eventuel "]]>"
11// http://www.w3.org/TR/xml/#charsets
12function filtre_cdata($t) {
13        if (preg_match(',[<>&\x0-\x8\xb-\xc\xe-\x1f],u', $t)) {
14                $t = preg_replace('/[\x0-\x8\xb-\xc\xe-\x1f]/ue', '"&#x".bin2hex(\'$0\').";"', $t);
15                return "<![CDATA[" . str_replace(']]>', ']]]]><![CDATA[>', $t).']]>';
16        } else
17                return $t;
18}
19
20define('_CHEVRONA', '* [oo *');
21define('_CHEVRONB', '* oo] *');
22
23// transformer les images ou logos spip en "figure" cairn
24function cairn_figure($html, $numero, $titre=null, $desc=null,$cred=null) {
25        static $cpt = array();
26
27        $c = ++ $cpt[$numero];
28        foreach (extraire_balises($html, 'figure') as $fig) {
29                $legende = extraire_balise($fig, 'figcaption');
30                // titre
31                $titre = '';
32                $titre = extraire_balise($legende, 'h3');
33                // descriptif
34                $desc = '';
35                if (preg_match('/descriptif/',$legende)) {
36                        // la description
37                        foreach (extraire_balises($fig,'descriptif') as $description) {
38                                $desc .= "<alinea>".trim(supprimer_tags($description))."</alinea>";
39                        }
40                }
41                $cred = '';
42                if (preg_match('/credit/',$legende)) {
43                        // la description
44                        foreach (extraire_balises($fig,'credit') as $credit) {
45                                $cred .= "<source>".trim(supprimer_tags($credit))."</source>";
46                        }
47                }
48
49
50                // fichiers PDF
51                $src = extraire_attribut(extraire_balise($fig, 'a'), 'href');
52                if (preg_match(',\.pdf$,', $src)
53                AND $l = copie_locale(url_absolue($src))) {
54                        $file = "images/".basename($l);
55                        @mkdir("$numero/images");
56                        rename($l, "$numero/$file");
57                }
58
59                $figure = cairn_figure(extraire_balise($fig,'img'),$numero,$titre,$desc,$cred);
60                $html = str_replace($fig, $figure, $html);
61        }
62
63        foreach (extraire_balises($html, 'img') as $img) {
64
65                $src = extraire_attribut($img, 'src');
66
67                if ($src AND $l = copie_locale(url_absolue($src))) {
68                        $file = basename($l);
69                        @mkdir("$numero/images");
70                        rename($l, "$numero/images/$file");
71
72                        $ext = preg_replace(',^.*\.,', '', $file);
73                        if ($ext == 'jpg') $ext = 'jpeg';
74                }
75
76                // le titre
77                if ($titre)
78                        $titre = "<titre>".trim(supprimer_tags($titre))."</titre>";
79                if ($titre OR $desc) {
80                        $legende = "<legende lang='fr'>
81        $titre
82        $desc
83        </legende>
84      ";
85                } else {
86                        $legende = '';
87                }
88                if ($cred)
89                        $legende .= $cred;
90
91                $figure = "<figure id='fi$c'>
92$legende
93      <objetmedia>
94            <image id='im$c' typeimage='figure' typemime='image:$ext' xlink:type='simple' xlink:href='$file' xlink:actuate='onRequest' />
95      </objetmedia>
96</figure>
97";
98
99                $html = str_replace($img, $figure, $html);
100
101        }
102
103        return $html;
104}
105
106function cairn_prenom_nom($blaze) {
107        return preg_replace(",(.*)[*_](.*),Se",'\'<prenom>\'.filtre_cdata(\'$2\').\'</prenom> <nomfamille>\'.filtre_cdata(\'$1\').\'</nomfamille>\'',$blaze);
108}
109
110// convertir un HTML en format eruditArticle
111function cairn_traiter($t, $reset) {
112        $t = cairn_decoupe_hN($t, $reset);
113        return str_replace(array(_CHEVRONA,_CHEVRONB), array('<', '>'), $t);
114}
115
116// convertir un HTML en format eruditArticle
117function cairn_traiter_notes($t, $reset) {
118        $t = preg_replace(',<div\b[^>]*>(.*)</div>,UimsS','\1',$t);
119
120        $t = cairn_decoupe_para_cdata($t, $reset);
121        return str_replace(array(_CHEVRONA,_CHEVRONB), array('<', '>'), $t);
122}
123
124function cairn_decoupe_hN($texte, $reset) {
125        static $cpt;
126        if ($reset) $cpt=0;
127
128        if (!strlen(trim($texte))) return '';
129
130        $sections = preg_split('/<h[2-6] class="spip">/i', $texte);
131
132        $t = array_shift($sections);
133        if (strlen($t)) {
134                $cpt ++;
135                $t = _CHEVRONA."section1 id=\"s1n$cpt\""._CHEVRONB
136                        . cairn_decoupe_para_cdata($t, $reset)
137                        . _CHEVRONA."/section1"._CHEVRONB;
138        }
139
140        foreach ($sections as $p) {
141                $cpt++;
142                list($para, $suite) = preg_split(',</h[2-6]>,i', $p);
143                // supprimer les ancres d'un titre
144                $para = supprimer_tags($para);
145
146                $t .= _CHEVRONA."section1 id=\"s1n$cpt\""._CHEVRONB
147                        . _CHEVRONA."titre"._CHEVRONB.cairn_decoupe_para_cdata($para)._CHEVRONA."/titre"._CHEVRONB
148                        . cairn_decoupe_para_cdata($suite)
149                        . _CHEVRONA."/section1"._CHEVRONB;
150        }
151
152        return $t;
153
154}
155
156function callback_poesie($r) {
157        # <verbatim typeverb="poeme"><bloc><ligne>………
158        $p = $r[1];
159        $p = preg_replace(',<div>(.*)</div>,UimsS',
160                _CHEVRONA.'ligne'._CHEVRONB
161                .'\1'.
162                _CHEVRONA.'/ligne'._CHEVRONB, $p);
163
164        return _CHEVRONA.'verbatim typeverb="poeme"'._CHEVRONB
165                ._CHEVRONA.'bloc'._CHEVRONB
166                .$p
167                ._CHEVRONA.'/bloc'._CHEVRONB
168                ._CHEVRONA.'/verbatim'._CHEVRONB;
169}
170
171function cairn_decoupe_para_cdata($texte, $reset=false) {
172        static $cpt;
173
174        if ($reset) $cpt=0;
175
176        // la poesie
177        $texte = preg_replace_callback(
178        ',<blockquote class="spip_poesie">(.*)</blockquote>,UimsS',
179        'callback_poesie', $texte);
180
181        // UL et OL doivent être dans des para
182        $texte = preg_replace(',<(ol|ul)\b,iS', '<p>$0', $texte);
183        $texte = preg_replace(',</(ol|ul)\b[^>]*>,iS', '$0</p>', $texte);
184
185        // sauts de ligne
186        $texte = preg_replace(',<br\b[^>]*>,iS', '</alinea><alinea>', $texte);
187
188        // liens a href
189        foreach (extraire_balises($texte, 'a') as $l) {
190                if (preg_match('/^http/', extraire_attribut($l, 'href'))) {
191                        $lien = preg_replace(',<a,i', "<liensimple", $l);
192                        $lien = str_replace('href=', "xlink:href=", $lien);
193                        $lien = preg_replace(',</a,i', "</liensimple", $lien);
194                        $lien = str_replace(array('<','>'), array(_CHEVRONA, _CHEVRONB), $lien);
195                        $texte = str_replace($l, $lien, $texte);
196                }
197                // ne pas oublier de supprimer les ancres (dans les intertitres notamment)
198                /*else {
199                        $texte = str_replace($l,'',$texte);
200                }*/
201        }
202
203        // images (seront traitees a la fin)
204        foreach (extraire_balises($texte, 'figure') as $l) {
205                $l2 = str_replace(array('<','>'), array(_CHEVRONA, _CHEVRONB), $l);
206                $texte = str_replace($l, $l2, $texte);
207        }
208
209        // images simples
210        foreach (extraire_balises($texte, 'img') as $l) {
211                $l2 = str_replace(array('<','>'), array(_CHEVRONA, _CHEVRONB), $l);
212                $texte = str_replace($l, $l2, $texte);
213        }
214
215        $paragraphes = preg_split('/<p\b[^>]*>/i', $texte);
216
217        # traiter le premier bloc ; ce n'est pas un paragraphe
218        # (il est peut-être vide, d'ailleurs)
219        $t = filtrer_texte_cairn(array_shift($paragraphes));
220
221        # traiter les para suivants
222        # en <para id="pa2"><alinea> ... </alinea></para> + reste
223        foreach ($paragraphes as $p) {
224                $cpt++;
225                list($para, $suite) = preg_split(',</p\b[^>]*>,i', $p);
226
227                if ($a = extraire_balise($para, 'a')
228                AND extraire_attribut($a, 'rev') == 'footnote') {
229                        $numero_note = supprimer_tags($a);
230                        $texte_note = str_replace(extraire_balise($para,'span'),'',$para);
231                        $t .= "<note id=\"no$numero_note\"><no>$numero_note</no><alinea>"
232                                . filtrer_texte_cairn($texte_note)
233                                . "</alinea></note>"
234                                . filtrer_texte_cairn($suite);
235                }
236                else {
237                        // les listes sont immédiatement après <para> sans <alinea>
238                    if (preg_match('/^<[u|o]l\b[^>]*>/Ui',$para)) {
239                        $t .= "<para id=\"pa$cpt\">"
240                            . filtrer_texte_cairn($para)
241                            . "</para>"
242                            . filtrer_texte_cairn($suite);
243                    } else {
244                        $t .= "<para id=\"pa$cpt\"><alinea>"
245                            . filtrer_texte_cairn($para)
246                            . "</alinea></para>"
247                            . filtrer_texte_cairn($suite);
248                    }
249                }
250        }
251
252        return $t;
253}
254
255function filtrer_texte_cairn($t) {
256        $t = preg_replace(',<(i|em)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'marquage typemarq="italique"'._CHEVRONB.'$2'._CHEVRONA.'/marquage'._CHEVRONB, $t);
257        $t = preg_replace(',<(b|strong)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'marquage typemarq="gras"'._CHEVRONB.'$2'._CHEVRONA.'/marquage'._CHEVRONB, $t);
258
259        $t = preg_replace(',<(ul)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'listenonord signe="disque"'._CHEVRONB.'$2'._CHEVRONA.'/listenonord'._CHEVRONB, $t);
260        $t = preg_replace(',<(ol)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'listeord numeration="decimal"'._CHEVRONB.'$2'._CHEVRONA.'/listeord'._CHEVRONB, $t);
261        $t = preg_replace(',<(li)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'elemliste'._CHEVRONB._CHEVRONA.'alinea'._CHEVRONB.'$2'._CHEVRONA.'/alinea'._CHEVRONB._CHEVRONA.'/elemliste'._CHEVRONB, $t);
262
263
264        // appels de notes
265        # <renvoi id="reXnoY" idref="noY" typeref="note">X</renvoi>
266        foreach (extraire_balises($t, 'a') as $a) {
267                if (extraire_attribut($a, 'class') == 'spip_note') {
268                        if (extraire_attribut($a, 'rel') == 'footnote') {
269                                $n = supprimer_tags($a);
270                                $b = _CHEVRONA."renvoi id=\"re".$n."no".$n."\" idref=\"no".$n."\" typeref=\"note\""._CHEVRONB.$n._CHEVRONA."/renvoi"._CHEVRONB;
271                                $t = str_replace($a, $b, $t);
272                        }
273                }
274        }
275
276        $t = proteger_amp(unicode_to_utf_8(html2unicode($t)));
277        $t = str_replace('&#8217;', '’', $t);
278        // les appels de notes sont entourés d'un span.
279        $t = preg_replace(',<span class="spip_note_ref">(.*)</span>,UimsS','$1',$t);
280        $t = trim($t);
281
282        return $t;
283
284        #return filtre_cdata($t);
285}
286
287?>
Note: See TracBrowser for help on using the repository browser.