source: spip-zone/_plugins_/spiperipsum/inc/spiperipsum_utils.php @ 66997

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

Grosses modifications des traitements des lectures et commentaire qui justifient le passage en 1.4.0 ; la compatibilité ascendante est toutefois assurée.

  • ajout de classe autour de chaque item des modèle afin de pouvoir les styler ; cependant le plugin ne propose aucun style par défaut.
  • refactoring des traitements des lectures et du commentaire afin d'améliorer sa généricité et son extensibilité.
  • amélioration de la détection des langues et de leur support
  • amélioration de l'extraction des crédit et copyright.

Il reste néanmoins à reprendre le saint et à y rajouter la fête du jour. Le support de l'arabe et l'arménien pose encore pas mal de soucis.

File size: 9.4 KB
Line 
1<?php
2
3
4// Convertir le code de langue SPIP en code langue du serveur
5function langue2code($langue) {
6        switch(strtolower($langue))
7        {
8                case 'br':
9                case 'co':
10                case 'cpf':
11                case 'cpf_hat':
12                case 'fr':
13                case 'fr_sc':
14                case 'fr_lpc':
15                case 'fr_lsf':
16                case 'fr_spl':
17                case 'fr_tu':
18                case 'lb':
19                case 'oc':
20                case 'oc_lnc':
21                case 'oc_ni':
22                case 'oc_ni_la':
23                case 'oc_prv':
24                case 'oc_gsc':
25                case 'oc_lms':
26                case 'oc_auv':
27                case 'oc_va':
28                case 'rm':
29                case 'roa':
30                case 'wa':
31                case 'ty':
32                        $code = 'FR'; break;
33                case 'en':
34                case 'en_hx':
35                case 'en_sm':
36                case 'ga':
37                case 'gd':
38                        $code = 'AM'; break;
39                case 'de':
40                case 'fy':
41                        $code = 'DE'; break;
42                case 'an':
43                case 'ast':
44                case 'ca':
45                case 'cpf_dom':
46                case 'es':
47                case 'es_mx_pop':
48                case 'es_co':
49                case 'eu':
50                case 'gl':
51                        $code = 'SP'; break;
52                case 'pt':
53                case 'pt_br':
54                        $code = 'PT'; break;
55                case 'el':
56                case 'grc':
57                        $code = 'GR'; break;
58                case 'it':
59                case 'it_fem':
60                case 'nap':
61                case 'la':
62                case 'sc':
63                case 'scn':
64                case 'src':
65                case 'sro':
66                        $code = 'IT'; break;
67                case 'ar':
68                case 'ber_tam':
69                case 'ber_tam_tfng':
70                        $code = 'AR'; break;
71                case 'mg':
72                        $code = 'MG'; break;
73                case 'nl':
74                        $code = 'NL'; break;
75                case 'pl':
76                        $code = 'PL'; break;
77                case 'hy':
78                        $code = 'ARM'; break;
79                default:
80                        $code = _SPIPERIPSUM_LANGUE_DEFAUT; break;
81        }
82        return $code;
83}
84
85function code2charset($code_langue) {
86        switch(strtoupper($code_langue))
87        {
88                case 'FR':
89                case 'PT':
90                case 'IT':
91                case 'NL':
92                case 'AM':
93                case 'DE':
94                case 'SP':
95                case 'TRF':
96                case 'TRA':
97                        $charset = 'iso-8859-1'; break;
98                case 'PL':
99                        $charset = 'iso-8859-2'; break;
100                case 'GR':
101                        $charset = 'iso-8859-7'; break;
102                case 'AR':
103                case 'MAA':
104                case 'BYA':
105                        $charset = 'windows-1256'; break;
106                case 'ARM':
107                        $charset = 'utf-8'; break;
108                default:
109                        $charset = 'iso-8859-1'; break;
110        }
111        return $charset;
112}
113
114function lecture2code($lecture) {
115        switch($lecture)
116        {
117                case _SPIPERIPSUM_LECTURE_EVANGILE:
118                        $code = 'GSP'; break;
119                case _SPIPERIPSUM_LECTURE_PREMIERE:
120                        $code = 'FR'; break;
121                case _SPIPERIPSUM_LECTURE_SECONDE:
122                        $code = 'SR'; break;
123                case _SPIPERIPSUM_LECTURE_PSAUME:
124                        $code = 'PS'; break;
125                default:
126                        $code = 'GSP'; break;
127        }
128        return $code;
129}
130
131
132// Convertir la date Y-m-d en url avec l'annee, le mois et le jour
133function date2url_date($date) {
134        $url = '';
135        $infos = getdate(strtotime($date));
136        $url = '&year=' . $infos['year'] . '&month=' . $infos['mon'] .'&day=' . $infos['mday'];
137        return $url;
138}
139
140// Determine le jour de la semaine a partir de la date fournie (0=dimanche)
141function date2jour_semaine($date) {
142        $infos = getdate(strtotime($date));
143        return $infos['wday'];
144}
145
146
147// Determine le jour de la semaine a partir de la date fournie (0=dimanche)
148function page2page_propre($page, $charset, $no_tag=false) {
149        static $nettoyage_commun = array(
150                                'regexp' => array('#(<|&lt;)/?br\b.*(>|&gt;)#UimsS', '#(&nbsp;){2,}#UimsS'),
151                                'replace' => array('<br />', '')
152        );
153        static $nettoyage_charset = array(
154                                'iso-8859-1' => array(
155                                                'regexp' => array('#Å#UimsS'),
156                                                'replace' => array('&oelig;')),
157        );
158
159        $regexp = $nettoyage_commun['regexp'];
160        $replace = $nettoyage_commun['replace'];
161        if (isset($nettoyage_charset[$charset])) {
162                $regexp = array_merge($regexp, $nettoyage_charset[$charset]['regexp']);
163                $replace = array_merge($replace, $nettoyage_charset[$charset]['replace']);
164        }
165
166        if ($no_tag) {
167                $regexp = array_merge($regexp, array('#<p\b.*>.*</p>#UimsS', '#(<br />)+$#UimS', '#</?font\b.*>#UimsS'));
168                $replace = array_merge($replace, array('', '', ''));
169        }
170
171        $page = preg_replace($regexp, $replace, $page);
172
173        return trim($page);
174}
175
176function flux2element($url, $charset, $no_tag=false) {
177        $element = '';
178
179        $page = recuperer_page($url);
180        if (strpos($page, 'Error : ') === false) {
181                $page = page2page_propre(importer_charset($page, $charset), $charset, $no_tag);
182                $element = $page;
183        }
184
185        return $element;
186}
187
188function flux2texte($url, $charset, $lettrine=false) {
189        $texte = array('texte' => '', 'copyright' => '', 'credit' => '');
190
191        $page = recuperer_page($url);
192        if (strpos($page, 'Error : ') === false) {
193                $page = page2page_propre(importer_charset($page, $charset), $charset, false);
194                $segments = explode('<br />', $page);
195
196                $index = count($segments) - 1;
197                $texte['credit'] = trim(extraire_balise($segments[$index], 'a'));
198                unset($segments[$index]);
199
200                $index = $index - 1;
201                $texte['copyright'] = trim($segments[$index]);
202                unset($segments[$index]);
203
204                $index = $index - 1;
205                if (preg_match('#<script\b.*>.*</script\b.*>#UimsS', $segments[$index], $t)) {
206                        unset($segments[$index]);
207                        $index = $index - 1;
208                }
209                while (!$segments[$index] AND $index>0) {
210                        unset($segments[$index]);
211                        $index = $index - 1;
212                }
213                $page = trim(implode('<br />', $segments));
214                if ($lettrine) {
215                        $lettre = mb_substr($page, 0, 1, $GLOBALS['meta']['charset']);
216                        $texte['texte'] = '<span class="lettrine">' . $lettre . '</span>' . mb_substr($page, 1);
217                }
218                else
219                        $texte['texte'] = $page;
220
221        }
222        return $texte;
223}
224
225
226function flux2lecture($lecture, $url_base, $charset, $lettrine=false) {
227        $tableau = array();
228
229        // -- Titre court de l'evangile : on extrait la reference du verset uniquement
230        //    Ce titre court est de la forme "Lc 11,25-23"
231        $no_tag = false;
232        $url = $url_base . '&type=reading_st&content=' . lecture2code($lecture);
233        $tableau['verset'] = flux2element($url, $charset, $no_tag);
234
235        // -- Titre long de l'evangile : on extrait le titre uniquement sans le verset
236        //    Ce titre long est de la forme "bla bla 11,25-23."
237        $url = $url_base . '&type=reading_lt&content=' . lecture2code($lecture);
238        $tableau['titre'] = flux2element($url, $charset, $no_tag);
239
240        // -- Texte de la lecture
241        //    On decoupe le texte en 3 parties : le texte proprement dit, sa reference de traduction et un credit
242        $url = $url_base . '&type=reading&content=' . lecture2code($lecture);
243        $texte = flux2texte($url, $charset, $lettrine);
244        $tableau = array_merge($tableau, $texte);
245
246        return $tableau;
247}
248
249
250// Charger le fichier des lectures et du saint du jour j
251// - si le fichier existe on retourne directement son nom complet
252// - sinon on le cree dans le cache du plugin
253function charger_lectures($langue, $jour) {
254
255        include_spip('inc/charsets');
256
257        $date = ($jour == _SPIPERIPSUM_JOUR_DEFAUT) ? date('Y-m-d') : $jour;
258//      $date = '2012-10-20';
259        $code_langue = langue2code($langue);
260//      $code_langue = 'MG';
261        $charset = code2charset($code_langue);
262        $lettrine = ($code_langue == 'AR' OR $code_langue == 'ARM') ? false : true;
263
264        $dir = sous_repertoire(_DIR_CACHE,"spiperipsum");
265        $dir = sous_repertoire($dir,substr(md5($code_langue),0,1));
266        $f = $dir . $code_langue . "_" . $date . ".txt";
267
268        if (!file_exists($f)) {
269                // Determination de la sous-chaine url correspondant a la date (vide si jour courant)
270                $url_date = ($jour == _SPIPERIPSUM_JOUR_DEFAUT) ? '' : date2url_date($date);
271                // Date du jour
272                $tableau['date'] = $date;
273                // Url de base de tous les flux
274                $url_base = 'http://feed.evangelizo.org/reader.php?lang=' . $code_langue . '&date=' . date('Ymd', strtotime($date));
275
276                // Traitement de l'evangile
277                $tableau['evangile'] = flux2lecture(_SPIPERIPSUM_LECTURE_EVANGILE, $url_base, $charset, $lettrine);
278
279                // Traitement de la premiere lecture
280                $tableau['premiere'] = flux2lecture(_SPIPERIPSUM_LECTURE_PREMIERE, $url_base, $charset, $lettrine);
281
282                // Traitement de la seconde lecture - uniquement le dimanche
283                if (date2jour_semaine($date) == 0) {
284                        $tableau['seconde'] = flux2lecture(_SPIPERIPSUM_LECTURE_SECONDE, $url_base, $charset, $lettrine);
285                }
286
287                // Traitement du psaume
288                $tableau['psaume'] = flux2lecture(_SPIPERIPSUM_LECTURE_PSAUME, $url_base, $charset, $lettrine);
289
290                // Traitement du commentaire
291                $no_tag = true;
292                // -- titre du commentaire
293                $tableau['commentaire']['titre'] = flux2element($url_base.'&type=comment_t', $charset, $no_tag);
294                // -- auteur du commentaire
295                $tableau['commentaire']['auteur'] = flux2element($url_base.'&type=comment_a', $charset, $no_tag);
296                // -- source du commentaire
297                $tableau['commentaire']['source'] = flux2element($url_base.'&type=comment_s', $charset, $no_tag);
298                // -- texte du commentaire : on n'insere jamais de lettrine
299                $texte = flux2texte($url_base.'&type=comment', $charset, false);
300                $tableau['commentaire'] = array_merge($tableau['commentaire'], $texte);
301
302                // Traitement du saint du jour
303                // -- Traitement du nom seul et de l'url permettant de recuperer les textes
304                $url = "http://feed.evangelizo.org/reader.php?lang=".$code_langue."&type=saint&date=".date("Ymd", strtotime($date));
305                $page = recuperer_page($url);
306                $balise = extraire_balises($page, 'a');
307                $titre = preg_replace(',</?a\b.*>,UimsS', '', $balise[0]);
308                $tableau['saint']['titre'] = preg_replace(',Ü,UimsS', '&dagger;', $titre);
309                // -- Traitement des textes
310                $attribut = extraire_attribut($balise, 'onclick');
311                preg_match(';window.open\(\'(.[^\s,\']+);i', $attribut[0], $url_texte);
312                $page = recuperer_page($url_texte[1]);
313                $textes = extraire_balises(extraire_balise($page, 'div'), 'p');
314                $tableau['saint']['texte'] = '';               
315                foreach($textes as $p) {
316                        if ((!extraire_attribut($p, 'align')) AND (!extraire_attribut($p, 'style')))
317                                $tableau['saint']['texte'] .= $p;               
318                }
319                if (!$tableau['saint']['texte'])
320                        $tableau['saint']['texte'] = preg_replace(',</?div\b.*>,UimsS', '', extraire_balise($page, 'div'));
321                $tableau['saint']['texte'] = trim(str_replace('&nbsp;', '', $tableau['saint']['texte']));
322                $tableau['saint']['url'] = $url_texte[1];
323
324//              var_dump($tableau);
325                ecrire_fichier($f, serialize($tableau));
326        }
327        return $f;
328}
329
330?>
Note: See TracBrowser for help on using the repository browser.