source: spip-zone/_plugins_/zotspip/trunk/zotspip_fonctions.php @ 61372

Last change on this file since 61372 was 61372, checked in by joseph@…, 8 years ago
  • correctif sur la recherche (pas de LIKE conditionnel)
  • personnalisation de l'ordre du tri par type
File size: 11.8 KB
Line 
1<?php
2
3// Sécurité
4if (!defined("_ECRIRE_INC_VERSION")) return;
5
6// Cette balise teste si la connexion à Zotero fonctionne
7function balise_TESTER_CONNEXION_ZOTERO_dist($p) {
8                $p->code = "zotspip_tester_connexion_zotero()";
9        return $p;
10}
11
12function zotspip_tester_connexion_zotero() {
13        include_spip('inc/zotspip');
14        $feed = zotero_get('items/?format=atom&limit=1');
15        return $feed ? ' ' : '';
16}
17
18// Mets en forme une référence bibliographique
19// On peut passer le nom d'un style CSL en argument (optionel).
20// Le second argument (optionel) peut être une liste d'auteurs, tableau ou string séparée par des points-virgules, à souligner.
21function balise_REFERENCE_dist($p) {
22        $csljson = champ_sql('csljson', $p);
23        $annee = champ_sql('annee', $p);
24        $_lang = champ_sql('lang', $p);
25        $style = interprete_argument_balise(1,$p);
26        $souligne = interprete_argument_balise(2,$p);
27        $date = champ_sql('date', $p);
28        if (!$style) $style='""';
29        if (!$souligne) $souligne='array()';
30       
31        $p->code = "zotspip_calculer_reference($csljson,$annee,$style,$souligne,$date,htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang']))";
32        return $p;
33}
34
35function zotspip_calculer_reference($csljson,$annee,$style,$souligne,$date,$lang) {
36        include_spip('lib/citeproc-php/CiteProc');
37        include_spip('inc/config');
38        static $citeproc = array();
39        if (!$style) {
40                include_spip('inc/config');
41                $style = lire_config('zotspip/csl_defaut') ? lire_config('zotspip/csl_defaut') : 'apa';
42        }
43        $data = json_decode($csljson);
44       
45        if (isset($data->issued->raw) && lire_config('zotspip/corriger_date')) { // Correction de la date de publication (si fournie brute et si option activée)
46                unset($data->issued->raw);
47                // Gestion des cas où la date est de la forme yyyy-mm ou yyyy-mm-dd
48                if (preg_match('#^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})$#',trim($date),$matches))
49                        $data->issued->{'date-parts'} = array(array($matches[1],$matches[2],$matches[3]));
50                elseif (preg_match('#^([0-9]{4})-([0-9]{1,2})$#',trim($date),$matches))
51                        $data->issued->{'date-parts'} = array(array($matches[1],$matches[2]));
52                else
53                        $data->issued->{'date-parts'} = array(array($annee));
54        }
55
56        if (!is_array($souligne)) $souligne = explode(';',$souligne);
57       
58        if (count($souligne)){
59                foreach ($souligne as $aut_souligne) {
60                        if(!strpos($aut_souligne,',')) $aut_souligne .= ', ';
61                        $aut_souligne = explode(',',$aut_souligne);
62                        if (is_array($data->author))
63                                foreach ($data->author as $cle => $author)
64                                        if ($author->family == trim($aut_souligne[0]) && $author->given == trim($aut_souligne[1]))
65                                                $data->author[$cle]->family = '§§'.$data->author[$cle]->family.'§§';
66                }
67        }
68       
69        if (!isset($citeproc[$style])) {
70                include_spip('inc/distant');
71                $csl = spip_file_get_contents(find_in_path("csl/$style.csl"));
72                $citeproc[$style] = new citeproc($csl,$lang);
73        }
74       
75        $ret = $citeproc[$style]->render($data, 'bibliography');
76        if (count($souligne))
77                $ret = preg_replace(',§§(.+)§§,U','<span style="text-decoration:underline;">$1</span>',$ret);
78       
79        return $ret;
80}
81
82// Lister les styles CSL disponibles
83function balise_LISTER_CSL_dist($p) {
84        $p->code = "zotspip_lister_csl()";
85        return $p;
86}
87
88function zotspip_lister_csl(){
89        static $liste_csl = null;
90        if (is_null($liste_csl)){
91                $liste_csl = array();
92                $match = ".+[.]csl$";
93                $liste = find_all_in_path('csl/', $match);
94                if (count($liste)){
95                        foreach($liste as $fichier=>$chemin) {
96                                $style = spip_file_get_contents($chemin);
97                                $csl = substr($fichier,0,-4);
98                                if (preg_match('#\<title\>(.*)\</title\>#',$style,$matches))
99                                        $liste_csl[$csl] = $matches[1];
100                                else
101                                        $liste_csl[$csl] = $csl;
102                        }
103                }
104        }
105        return $liste_csl;
106}
107
108// Traduire le type de document
109function zotspip_traduire_type($type) {
110        return _T('zotero:itemtypes_'.strtolower($type));
111}
112
113// Traduire le champ Zotero
114function zotspip_traduire_champ($champ) {
115        return _T('zotero:itemfields_'.strtolower($champ));
116}
117
118// Traduire le type d'auteur
119function zotspip_traduire_createur($type) {
120        return _T('zotero:creatortypes_'.strtolower($type));
121}
122
123// Afficher l'icône du document
124// On peut optionnellement ajouter mimetype et fichier pour distinguer les icônes dans le cadre des pièces jointes
125function zotspip_icone_type($type, $mimetype=NULL, $fichier=NULL) {
126        $alt = zotspip_traduire_type($type);
127        if ($type=='attachment' && !is_null($fichier) && !$fichier) $type = 'attachment-web-link'; // Si fichier n'est pas renseigné, c'est un lien sur le web
128        if ($type=='attachment' && $fichier && $mimetype=='text/html') $type = 'attachment-snapshot';
129        if ($type=='attachment' && $fichier && $mimetype=='application/pdf') $type = 'attachment-pdf';
130        $chemin = find_in_path("images/zotero/$type.png");
131        if (!$chemin) $chemin = find_in_path("images/zotero/item.png");
132        return "<img src=\"$chemin\" height=\"16\" width=\"16\" alt=\"$alt\"/>";
133}
134
135// Renvoie un tableau HTML avec le détail de l'item
136function balise_ZITEM_DETAILS_dist($p) {
137        $json = champ_sql('json', $p);
138        $p->code = "zotspip_calculer_zitem_details($json)";
139        return $p;
140}
141
142function zotspip_calculer_zitem_details($json) {
143        $ret = '<table class="zitem_details spip">';
144        $data = json_decode($json,true);
145        if (!is_array($data)) return '';
146        foreach ($data as $champ => $valeur) {
147                if ($champ=='itemType')
148                        $ret .= "<tr><td class=\"champ\"><strong>".zotspip_traduire_champ($champ)."</strong></td><td class=\"valeur\">".zotspip_traduire_type($valeur)."</td></tr>";
149                elseif ($champ=='creators')
150                        foreach ($valeur as $creator)
151                                $ret .= "<tr><td class=\"champ\"><strong>".zotspip_traduire_createur($creator['creatorType'])."</strong></td><td class=\"valeur\">".(isset($creator['name'])?$creator['name']:($creator['lastName'].(isset($creator['firstName'])?', '.$creator['firstName']:'')))."</td></tr>";
152                elseif ($champ=='tags' && count($valeur)>0) {
153                        $tags = array();
154                        foreach ($valeur as $tag)
155                                $tags[] = $tag['tag'];
156                        $tags = implode(' &middot; ',$tags);
157                        $ret .= "<tr><td class=\"champ\"><strong>"._T('zotero:itemfields_tags')."</strong></td><td class=\"valeur\">$tags</td></tr>";
158                }
159                elseif ($champ=='mimeType')
160                        $ret .= "<tr><td class=\"champ\"><strong>MIME</strong></td><td class=\"valeur\">$valeur</td></tr>";
161                elseif ($champ=='url')
162                        $ret .= "<tr><td class=\"champ\"><strong>".zotspip_traduire_champ($champ)."</strong></td><td class=\"valeur\"><a href=\"$valeur\">$valeur</a></td></tr>";
163                elseif ($valeur)
164                        $ret .= "<tr><td class=\"champ\"><strong>".zotspip_traduire_champ($champ)."</strong></td><td class=\"valeur\">$valeur</td></tr>";
165        }
166        $ret .= '</table>';
167        return $ret;
168}
169
170// Exporte les items dans le format demandé
171function zotspip_export ($id, $format) {
172        if (is_array($id)) $id = implode(',',$id);
173        include_spip('inc/zotspip');
174        return zotero_get("items/?itemKey=$id&format=$format");
175}
176
177// Renvoie le content-type correspondant à un format d'export
178function zotspip_content_type ($format) {
179        switch ($format) {
180                case 'bibtex':
181                        $ctype = "application/x-bibtex";
182                        break;
183                case 'mods':
184                        $ctype = "application/mods+xml";
185                        break;
186                case 'refer':
187                        $ctype = "application/x-research-info-systems" ;
188                        break;
189                case 'rdf_bibliontology':
190                case 'rdf_dc':
191                case 'rdf_zotero':
192                        $ctype = "application/rdf+xml";
193                        break;
194                case 'ris':
195                        $ctype = "application/x-research-info-systems";
196                        break;
197                case 'wikipedia':
198                        $ctype = "text/x-wiki";
199                        break;
200                default:
201                        $ctype = '';
202                        break;
203        }
204        return ($ctype) ? 'Content-Type: '.$ctype : '';
205}
206
207// Indique le nom du fichier à télécharger
208function zotspip_content_disposition ($format) {
209        switch ($format) {
210                case 'bibtex':
211                        $ext = 'bib';
212                        break;
213                case 'mods':
214                        $ext = 'xml';
215                        break;
216                case 'refer':
217                case 'wikipedia':
218                        $ext = 'txt';
219                        break;
220                case 'rdf_bibliontology':
221                case 'rdf_dc':
222                case 'rdf_zotero':
223                        $ext = 'rdf';
224                        break;
225                case 'ris':
226                        $ext = 'ris';
227                        break;
228                default:
229                        $ext = '';
230                        break;
231        }
232        return ($ext) ? 'Content-Disposition: attachment; filename=export.'.$ext : '';
233}
234
235// Récupère un fichier distant
236function zotspip_recuperer_fichier($fichier) {
237        include_spip('inc/distant');
238        include_spip('inc/config');
239        return spip_file_get_contents(copie_locale($fichier.'?key='.lire_config('zotspip/api_key')));
240}
241
242// Récupérer les références les plus récentes
243// La variable d'environnement depuis peut être de la forme depuis=2008, depuis=2ans ou depuis=1an
244function critere_zotsip_depuis($idb, &$boucles, $crit) {
245        $boucle = &$boucles[$idb];
246        $table = $boucle->id_table;
247        $boucle->where[] = "zotspip_calcul_depuis(\$Pile[0]['depuis'],$table)";
248}
249function zotspip_calcul_depuis($depuis,$table) {
250        $annee = false;
251        if (is_numeric($depuis)) $annee = intval($depuis);
252        elseif (substr($depuis,-2)=='an' && is_numeric(substr($depuis,0,-2))) $annee = 1 + intval(date('Y')) - intval(substr($depuis,0,-2)); // L'année en cours compte pour un
253        elseif (substr($depuis,-3)=='ans' && is_numeric(substr($depuis,0,-3))) $annee = 1 + intval(date('Y')) - intval(substr($depuis,0,-3));
254        if ($annee) return array('>=',"$table.annee",$annee);
255        else return array();
256}
257
258// Renvoie le schéma de données Zotero
259function schema_zotero($entree = '') {
260        static $schema = NULL;
261        if (is_null($chema)) {
262                lire_fichier_securise(_DIR_TMP . 'schema_zotero.php', $schema);
263                $schema = @unserialize($schema);
264        }
265        if (!$entree)
266                return $schema;
267        else
268                return $schema[$entree];
269}
270
271function balise_SCHEMA_ZOTERO_dist($p) {
272        $entree = interprete_argument_balise(1,$p);
273        if (!$entree) $entree='""';
274        $p->code = "schema_zotero($entree)";
275        return $p;
276}
277
278// Permet de trier la liste des types de références à partir de leur traduction
279// Utilisation : [(#SCHEMA_ZOTERO{itemTypes}|zotspip_trier_itemTypes})]
280function zotspip_trier_itemTypes($itemTypes,$inclure_note=false) {
281        $l = array();
282        foreach ($itemTypes as $itemType)
283                if($inclure_note || $itemType != 'note')
284                        $l[$itemType] = zotspip_traduire_type($itemType);
285        asort($l);
286        return array_keys($l);
287}
288
289// Fournit une liste complète de l'ensemble des types d'auteurs (en fusionnant les listes de chaque itemType)
290// Utilisation : [(#SCHEMA_ZOTERO{creatorTypes}|zotspip_liste_creatorTypes_complete)]
291function zotspip_liste_creatorTypes_complete($creatorTypes) {
292        $retour = array();
293        foreach ($creatorTypes as $creatorType)
294                $retour = array_merge($retour,array_diff($creatorType,$retour));
295        return $retour;
296}
297
298// Renvoie l'URL de modification d'un item sur zotero.org
299function modifier_sur_zotero($id_zitem){
300        if(lire_config('zotspip/type_librairie')=='user')
301                return "https://www.zotero.org/".lire_config('zotspip/username')."/items/itemKey/$id_zitem/mode/edit";
302        else
303                return "https://www.zotero.org/groups/".lire_config('zotspip/username')."/items/itemKey/$id_zitem/mode/edit";
304}
305
306// Fonction renvoyant le tableau adequat pour la configuration de l'ordre des types de documents
307function zotspip_configurer_ordre_types($ordre) {
308        if (!is_array($ordre)) $ordre=array();
309        $ordre = array_flip($ordre);
310        // Il faut completer par rapport au schema Zotero (au cas ou le schema change)
311        $zotero = schema_zotero('itemTypes');
312        $zotero[]='attachment'; // Ajouter les pieces jointes non presentes dans le schema
313        $ordre = array_merge($ordre,array_flip($zotero));
314        // Ajout des chaines de langue
315        foreach ($ordre as $cle => $val)
316                $ordre[$cle] = zotspip_traduire_type($cle);
317        return $ordre;
318}
319
320// Le critere qui permet le tri par type (selon l'ordre defini)
321function critere_par_type_zotero($idb, &$boucles, $crit) {
322        $boucle = &$boucles[$idb];
323        $id_table = $boucle->id_table;
324        include_spip('inc/config');
325        $config = lire_config('zotspip/ordre_types');
326        if (is_array($config) && count($config))
327                $boucle->order[] = "\"FIELD($id_table.type,'".implode("','",$config)."')\"";
328        else
329                $boucle->order[] = "'$id_table.type'";
330}
331
332?>
Note: See TracBrowser for help on using the repository browser.