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

Last change on this file since 79574 was 79574, checked in by fil@…, 7 years ago

plugin pour CAIRN.info ; fonctionnement specifique à vacarme.org

File size: 4.3 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('/<h3\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        $texte = preg_replace(',<br\b[^>]*>,iS', "\n", $texte);
77
78        $paragraphes = preg_split('/<p\b[^>]*>/i', $texte);
79
80        # traiter le premier bloc ; ce n'est pas un paragraphe
81        # (il est peut-être vide, d'ailleurs)
82        $t = filtrer_texte_cairn(array_shift($paragraphes));
83
84        # traiter les para suivants
85        # en <para id="pa2"><alinea> ... </alinea></para> + reste
86        foreach ($paragraphes as $p) {
87                $cpt++;
88                list($para, $suite) = preg_split(',</p\b[^>]*>,i', $p);
89
90                if ($a = extraire_balise($para, 'a')
91                AND extraire_attribut($a, 'rev') == 'footnote') {
92                        $note = supprimer_tags($a);
93                        $t .= "<note id=\"no$note\"><alinea>"
94                                . filtrer_texte_cairn(str_replace($a, supprimer_tags($a), $para))
95                                . "</alinea></note>"
96                                . filtrer_texte_cairn($suite);
97                }
98                else
99                        $t .= "<para id=\"pa$cpt\"><alinea>"
100                                . filtrer_texte_cairn($para)
101                                . "</alinea></para>"
102                                . filtrer_texte_cairn($suite);
103        }
104
105        return $t;
106}
107
108function filtrer_texte_cairn($t) {
109        $t = preg_replace(',<(i|em)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'marquage typemarq="italique"'._CHEVRONB.'$2'._CHEVRONA.'/marquage'._CHEVRONB, $t);
110        $t = preg_replace(',<(b|strong)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'marquage typemarq="gras"'._CHEVRONB.'$2'._CHEVRONA.'/marquage'._CHEVRONB, $t);
111
112        $t = preg_replace(',<(ul)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'listenonord signe="disque"'._CHEVRONB.'$2'._CHEVRONA.'/listenonord'._CHEVRONB, $t);
113        $t = preg_replace(',<(ol)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'listeord numeration="decimal"'._CHEVRONB.'$2'._CHEVRONA.'/listeord'._CHEVRONB, $t);
114        $t = preg_replace(',<(li)\b[^>]*>(.*)</\1>,UimsS', _CHEVRONA.'elemliste'._CHEVRONB._CHEVRONA.'alinea'._CHEVRONB.'$2'._CHEVRONA.'/alinea'._CHEVRONB._CHEVRONA.'/elemliste'._CHEVRONB, $t);
115
116
117        // appels de notes
118        # <renvoi id="reXnoY" idref="noY" typeref="note">X</renvoi>
119        foreach (extraire_balises($t, 'a') as $a) {
120                if (extraire_attribut($a, 'class') == 'spip_note') {
121                        if (extraire_attribut($a, 'rel') == 'footnote') {
122                                $n = supprimer_tags($a);
123                                $b = _CHEVRONA."renvoi id=\"re".$n."no".$n."\" idref=\"no".$n."\" typeref=\"note\""._CHEVRONB.$n._CHEVRONA."/renvoi"._CHEVRONB;
124                                $t = str_replace($a, $b, $t);
125                        }
126                }
127        }
128
129        $t = proteger_amp(unicode_to_utf_8(html2unicode($t)));
130        $t = str_replace('&#8217;', '’', $t);
131
132        $t = trim(supprimer_tags($t));
133
134        return $t;
135
136        #return filtre_cdata($t);
137}
138
139
140
141?>
Note: See TracBrowser for help on using the repository browser.