Dans le cadre de la Coredem, plusieurs sous Spip exportent leurs méta-données au format ScrutariData : par exemple, Rinoceros et le forum pour une nouvelle gouvernance mondiale. Les squelettes de Spip peuvent effectivement être utilisés pour créer du code XML plutôt que du HTML (les flux RSS créés par Spip sont aussi gérés par des boucles).
L'exemple ci-dessous est du site Ressources pour une gestion durable de l'eau et a été réalisé par Thierry Eraud. Ces boucles doivent être adaptées à chaque site.
En effet, il est rare d'inclure tous les articles d'un site Spip dans l'export au format Scrutari (par exemple, on n'exporte pas la page Contacts) : seules les articles correspondant à des ressources sont à exporter. La façon dont ces articles sont distingués des autres articles dépend de l'organisation du site. Cela peut-être par un mot-clé ou une rubrique. Dans le site donné en exemple, c'est la rubrique avec l'identifiant 1 qui sert à regrouper tous les articles correspondant à une ressource.
Pour les mots-clés, le problème est le même : tous les mots-clés utilisés par un site Spip ne sont pas pertinents (on peut par exemple utiliser des mots-clés dans un but technique de sélection de telle ou telle page). Dans ce cas-là, la solution est de répartir les mots-clés dans des groupes et de ne garder que les groupes concernés. Dans le cas de l'exemple, tous les mots-clés sont exportés sauf ceux du groupe « reserve ».
Ce squelette Spip est enregistré dans le dossier squelettes/ et sera appelé comme n'importe quel autre squelette. Par exemple, s'il est enregistré sous le nom scrutari.html
, il sera appelé via spip.php?page=scrutari
.
[(#HTTP_HEADER{Content-type: text/xml; charset=UTF-8})]<?xml version="1.0" encoding="UTF-8"?> <base> <base-metadata> [(#REM) authority permet d'identifier le producteur de la base, il peut s'agir d'un nom de domaine ou, comme ici, d'identifiant universel base-name est le nom technique de la base (en minuscules sans accent ni espace) ] <authority>15f2bd12-f4d0-8314-0800200c9a66</authority> <base-name>ressouces_eau</base-name> [(#REM) Les sites ressources sont multilingues, mais il n'y a pas de secteurs propres a chaques langues. Les articles de la rubrique ressources peuvent etre dans n'importe quelle langue. On definit dans un premier temps un tableau des langues utilisees dans la rubrique ressources. ] #SET{tab_lang, #ARRAY{''}} [(#SET{tab_lang, [(#GET{tab_lang}|push{#LANG})]})] <BOUCLE_langues(ARTICLES){id_rubrique=1}{lang != #LANG}> [(#SET{tab_lang, [(#GET{tab_lang}|push{#LANG})]})] </BOUCLE_langues> [(#SET{tab_lang,[(#GET{tab_lang}|array_unique)]})] [(#REM) Definition des intitules courts et des intitules longs dans les differentes langues. Le titre ainsi que le descriptif du site peuvent etre renseignes dans les differents langues grace aux balises multi ] <intitule-short> <BOUCLE_intitule_short(ARTICLES){id_rubrique=1}{lang IN #GET{tab_lang}}> [(#LANG|unique{short}|?{' ',''}) [<lib xml:lang='#LANG'>(#NOM_SITE_SPIP|texte_backend)</lib>] ] </BOUCLE_intitule_short> </intitule-short> <intitule-long> <BOUCLE_intitule_long(ARTICLES){id_rubrique=1}{lang IN #GET{tab_lang}}> [(#LANG|unique{court}|?{' ',''}) [<lib xml:lang='#LANG'>(#DESCRIPTIF_SITE_SPIP|supprimer_tags|texte_backend)</lib>] ] </BOUCLE_intitule_long> </intitule-long> <lang-ui> <BOUCLE_lang_ui(ARTICLES){id_rubrique=1}{lang IN #GET{tab_lang}}> [<lang>(#LANG|unique{langue_ui})</lang>] </BOUCLE_lang_ui> </lang-ui> [<base-icon>#URL_SITE_SPIP/(#ENV*{favicon} |sinon{#CHEMIN{favicon.ico}} |sinon{#LOGO_SITE_SPIP} |image_passe_partout{16,16} |image_recadre{16,16,center} |image_format{ico}|extraire_attribut{src}) </base-icon>] </base-metadata> [(#REM) Dans le cas des sites ressources, les articles devant etre indexes par Scrutari sont uniquement dans la rubrique ressources. Ici la rubrique ressources est la rubrique 1 ] <BOUCLE_ressources(RUBRIQUES){id_rubrique=1}> <corpus corpus-name="ressources"> <corpus-metadata> <intitule-corpus> <lib xml:lang='fr'>Ressources</lib> </intitule-corpus> <intitule-fiche> <lib xml:lang='fr'>Ressource</lib> </intitule-fiche> </corpus-metadata> [(#REM) On recupere tous les articles de la rubrique et sous-rubriques ] <BOUCLE_fiches(ARTICLES){branche}> <fiche fiche-id="#ID_ARTICLE"> <titre>[(#TITRE|supprimer_numero|texte_backend)]</titre> [<soustitre>(#SOUSTITRE|texte_backend)</soustitre>] <date>[(#DATE|affdate{'Y-m-d'})]</date> <lang>#LANG</lang> <href>#URL_SITE_SPIP/#URL_ARTICLE</href> </fiche> </BOUCLE_fiches> </corpus> [(#REM) On parcourt tous les mots cles sauf ceux des groupes de mot reserve utilises a autre chose ] <BOUCLE_groupe_mots(GROUPES_MOTS){titre != reserve}> <thesaurus thesaurus-name="groupe_[(#ID_GROUPE)]"> <thesaurus-metadata> <intitule-thesaurus> <BOUCLE_titre_groupe(ARTICLES){id_rubrique=1}{lang IN #GET{tab_lang}}> [(#LANG|unique{titre_groupe#_groupe_mots:ID_GROUPE}|?{' ',''}) [<lib xml:lang='#LANG'>(#_groupe_mots:TITRE|texte_backend)</lib>] ] </BOUCLE_titre_groupe> </intitule-thesaurus> </thesaurus-metadata> <BOUCLE_mots_cles(MOTS){id_groupe}> <motcle motcle-id="#ID_MOT"> <BOUCLE_titre_mot(ARTICLES){id_rubrique=1}{lang IN #GET{tab_lang}}> [(#LANG|unique{titre_mot#_mots_cles:ID_MOT}|?{' ',''}) [<lib xml:lang='#LANG'>(#_mots_cles:TITRE|texte_backend)</lib>] ] </BOUCLE_titre_mot> </motcle> </BOUCLE_mots_cles> </thesaurus> </BOUCLE_groupe_mots> [(#REM) On fait le lien entre les articles et les mots cles ] <BOUCLE_themes_indexation(GROUPES_MOTS){titre != reserve}> <indexation-group corpus-path="ressources" thesaurus-path="groupe_[(#ID_GROUPE)]"> <BOUCLE_sous_themes_indexation(MOTS){id_groupe}> <BOUCLE_articles_lies_sous_themes(ARTICLES){id_mot}{branche}><indexation fiche-id='#ID_ARTICLE' motcle-id='#ID_MOT'/></BOUCLE_articles_lies_sous_themes> </BOUCLE_sous_themes_indexation> </indexation-group> </BOUCLE_themes_indexation> </BOUCLE_ressources> </base>
Comme il est indiqué à la page sur les fichiers d'information, le serveur Scrutari ne charge pas directement le fichier au format ScrutariData. Il passe par un intermédiaire qui est un fichier de très petite taille qui indique si une mise à jour à eu lieu depuis le dernier passage du robot du serveur Scrutari.
L'exemple suivant, toujours tiré du même site, est un squelette très simple permettant de générer le fichier d'information.
[(#HTTP_HEADER{Content-type: text/xml; charset=UTF-8})]<?xml version="1.0" encoding="UTF-8"?> <header> [(#REM) Seuls les articles de la rubrique ressources sont pris en compte. On recupere la date du dernier article de la rubrique. ] <BOUCLE_date(RUBRIQUES){id_rubrique=1}> <date>[(#DATE|affdate{'Y-m-d'})]</date> </BOUCLE_date> <path>spip.php?page=scrutari</path> </header>