source: spip-zone/_plugins_/cairn/cairn/article_fonctions.php @ 79946

Last change on this file since 79946 was 79946, checked in by fil@…, 7 years ago
  1. accepter H2 comme h3 comme intertitre
  2. traiter les liens http (pas les liens relatifs, on les ignore)
  3. conserver les BR
File size: 4.7 KB
Line 
1<?php
2
3// stocker une chaine dans un CDATA
4// a noter qu'il faut "echapper" un eventuel "]]>"
5// http://www.w3.org/TR/xml/#charsets
6function filtre_cdata($t) {
7        if (preg_match(',[<>&\x0-\x8\xb-\xc\xe-\x1f],u', $t)) {
8                $t = preg_replace('/[\x0-\x8\xb-\xc\xe-\x1f]/ue', '"&#x".bin2hex(\'$0\').";"', $t);
9                return "<![CDATA[" . str_replace(']]>', ']]]]><![CDATA[>', $t).']]>';
10        } else
11                return $t;
12}
13
14define('_CHEVRONA', '* [oo *');
15define('_CHEVRONB', '* oo] *');
16
17function cairn_prenom_nom($blaze) {
18        return preg_replace(",(.*)[*_](.*),Se",'\'<prenom>\'.filtre_cdata(\'$2\').\'</prenom> <nomfamille>\'.filtre_cdata(\'$1\').\'</nomfamille>\'',$blaze);
19}
20
21// convertir un HTML en format eruditArticle
22function cairn_traiter($t, $reset) {
23
24        $t = cairn_decoupe_h3($t, $reset);
25
26        return str_replace(array(_CHEVRONA,_CHEVRONB), array('<', '>'), $t);
27}
28
29// convertir un HTML en format eruditArticle
30function cairn_traiter_notes($t, $reset) {
31
32        $t = cairn_decoupe_para_cdata($t, $reset);
33
34        return str_replace(array(_CHEVRONA,_CHEVRONB), array('<', '>'), $t);
35}
36
37function cairn_decoupe_h3($texte, $reset) {
38        static $cpt;
39        if ($reset) $cpt=0;
40
41        if (!strlen(trim($texte))) return '';
42
43        $sections = preg_split('/<h[23]\b[^>]*>/i', $texte);
44
45        $t = array_shift($sections);
46        if (strlen($t)) {
47                $cpt ++;
48                $t = _CHEVRONA."section1 id=\"s1n$cpt\""._CHEVRONB
49                        . cairn_decoupe_para_cdata($t, $reset)
50                        . _CHEVRONA."/section1"._CHEVRONB;
51        }
52
53        foreach ($sections as $p) {
54                $cpt++;
55                list($para, $suite) = preg_split(',</h3\b[^>]*>,i', $p);
56
57                $t .= _CHEVRONA."section1 id=\"s1n$cpt\""._CHEVRONB
58                        . _CHEVRONA."titre"._CHEVRONB.cairn_decoupe_para_cdata($para)._CHEVRONA."/titre"._CHEVRONB
59                        . cairn_decoupe_para_cdata($suite)
60                        . _CHEVRONA."/section1"._CHEVRONB;
61        }
62
63        return $t;
64
65}
66
67function cairn_decoupe_para_cdata($texte, $reset=false) {
68        static $cpt;
69
70        if ($reset) $cpt=0;
71
72        // UL et OL doivent être dans des para
73        $texte = preg_replace(',<(ol|ul)\b,iS', '<p>$0', $texte);
74        $texte = preg_replace(',</(ol|ul)\b[^>]*>,iS', '$0</p>', $texte);
75
76        // sauts de ligne
77        $texte = preg_replace(',<br\b[^>]*>,iS', _CHEVRONA."br /"._CHEVRONB."\n", $texte);
78
79        // liens a href
80        foreach (extraire_balises($texte, 'a') as $l) {
81                if (preg_match('/^http/', extraire_attribut($l, 'href'))) {
82                        $lien = preg_replace(',<a,i', "<liensimple", $l);
83                        $lien = str_replace('href=', "xlink:href=", $lien);
84                        $lien = preg_replace(',</a,i', "</liensimple", $lien);
85                        $lien = str_replace(array('<','>'), array(_CHEVRONA, _CHEVRONB), $lien);
86                        $texte = str_replace($l, $lien, $texte);
87                }
88        }
89
90        $paragraphes = preg_split('/<p\b[^>]*>/i', $texte);
91
92        # traiter le premier bloc ; ce n'est pas un paragraphe
93        # (il est peut-être vide, d'ailleurs)
94        $t = filtrer_texte_cairn(array_shift($paragraphes));
95
96        # traiter les para suivants
97        # en <para id="pa2"><alinea> ... </alinea></para> + reste
98        foreach ($paragraphes as $p) {
99                $cpt++;
100                list($para, $suite) = preg_split(',</p\b[^>]*>,i', $p);
101
102                if ($a = extraire_balise($para, 'a')
103                AND extraire_attribut($a, 'rev') == 'footnote') {
104                        $note = supprimer_tags($a);
105                        $t .= "<note id=\"no$note\"><alinea>"
106                                . filtrer_texte_cairn(str_replace($a, supprimer_tags($a), $para))
107                                . "</alinea></note>"
108                                . filtrer_texte_cairn($suite);
109                }
110                else
111                        $t .= "<para id=\"pa$cpt\"><alinea>"
112                                . filtrer_texte_cairn($para)
113                                . "</alinea></para>"
114                                . filtrer_texte_cairn($suite);
115        }
116
117        return $t;
118}
119
120function filtrer_texte_cairn($t) {
121        $t = preg_replace(',<(i|em)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'marquage typemarq="italique"'._CHEVRONB.'$2'._CHEVRONA.'/marquage'._CHEVRONB, $t);
122        $t = preg_replace(',<(b|strong)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'marquage typemarq="gras"'._CHEVRONB.'$2'._CHEVRONA.'/marquage'._CHEVRONB, $t);
123
124        $t = preg_replace(',<(ul)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'listenonord signe="disque"'._CHEVRONB.'$2'._CHEVRONA.'/listenonord'._CHEVRONB, $t);
125        $t = preg_replace(',<(ol)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'listeord numeration="decimal"'._CHEVRONB.'$2'._CHEVRONA.'/listeord'._CHEVRONB, $t);
126        $t = preg_replace(',<(li)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'elemliste'._CHEVRONB._CHEVRONA.'alinea'._CHEVRONB.'$2'._CHEVRONA.'/alinea'._CHEVRONB._CHEVRONA.'/elemliste'._CHEVRONB, $t);
127
128
129        // appels de notes
130        # <renvoi id="reXnoY" idref="noY" typeref="note">X</renvoi>
131        foreach (extraire_balises($t, 'a') as $a) {
132                if (extraire_attribut($a, 'class') == 'spip_note') {
133                        if (extraire_attribut($a, 'rel') == 'footnote') {
134                                $n = supprimer_tags($a);
135                                $b = _CHEVRONA."renvoi id=\"re".$n."no".$n."\" idref=\"no".$n."\" typeref=\"note\""._CHEVRONB.$n._CHEVRONA."/renvoi"._CHEVRONB;
136                                $t = str_replace($a, $b, $t);
137                        }
138                }
139        }
140
141        $t = proteger_amp(unicode_to_utf_8(html2unicode($t)));
142        $t = str_replace('&#8217;', '’', $t);
143
144        $t = trim(supprimer_tags($t));
145
146        return $t;
147
148        #return filtre_cdata($t);
149}
150
151
152
153?>
Note: See TracBrowser for help on using the repository browser.