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

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

corrections d'erreurs (ancres d'un intertitre; <span> autour des appels de note) + d'autres repérées et reportées dans todo.

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