Carnet Wiki

Iterateurs_Glob

Parmi les nouveaux itérateurs développés par Fil et Marcimat, l’un des plus particuliers concerne l’accès aux systèmes de fichiers : autrefois réservé aux programmeurs PHP, la nouvelle syntaxe permet d’envisager en SPIP de très nombreux usages.

Pour la documentation initiale, on s’appuie sur les articles de base publiés par les auteurs :
-  l’ annonce
et les
exemples avant de recharger le plugin iterateurs de _fil et mm !

La structure de la boucle itérateur (sur la pseudo-table symbolique DATA) nécessite un critère spécifique {source  format , données}
avec deux arguments, dont le premier sera dans notre cas l’un des mots-clés glob ou globpregfiles, par référence aux fonctions éponymes de parcours de dossiers, l’argument suivant précisant le masque de fichiers utilisé.

Le format de fonction mot-clé glob est le plus simple : il utilise le masque d’expansion de noms générique dans les shells *nix pour parcourir les fichiers d’un répertoire !

La chaine donnée en second paramètre spécifie donc un masque de répertoire à utiliser (indiqué ’brut’ donc sans devoir être mis entre guillemets ou quotes.

Le masque de fichier indiqué peut être exprimé en absolu ou relatif à l’exécution dans le dossier racine du site SPIP : l’exemple de référence montre le positionnement du chemin relatif du répertoire IMG des images jointes en standard.

<BOUCLE_ls2(DATA){source glob, IMG/{??g/,}*.??g}>
	<li>[(#VAL{Y-m-d H:i:s}|date{#VALEUR|filemtime})] / #VALEUR</li>
</BOUCLE_ls2>

Ici les données sont demandées dans les sous-dossiers de IMG/ , sur des noms de fichiers dont l’extension est formée de trois caractères, le dernier étant un g : ceci va donc sélectionner des fichiers de type .jpg ou .png, qui sont des images ; tout naturellement, comme nous savons que SPIP range les pièces jointes dans des sous-dossiers de IMG nommées par l’extension-type, nous devons, pour récupérer toutes les images de ces deux types, demander -par les caractères génériques traditionnels ? [1] et * [2]- d’étendre la spécification de chemin données aux deux sous-répertoires correspondants, ici respectivement IMG/jpg/*.jpg et IMG/png/*.png ; mais notez qu’un tel masque sélectionnerait aussi les fichiers IMG/jpg/*.png si vous en aviez de mal rangés...
Par contre, les fichiers d’extension .jpeg ne seront pas extraits ; pour cela, il faudrait, à supposer que SPIP les range dans le répertoire IMG/jpg/, spécifier comme masque final,
*.*g ou *.???g, mais ce dernier ne verrait plus les fichiers précédentes de type *.??g !

Avant d’étudier la forme d’accès aux données affichées à l’intérieur de la boucle, nous allons compléter l’examen du masque de fichiers à donner, sachant qu’il est tiré de la fonctionnalité de glob-pattern : cette forme de masque ressemble aux expressions régulières (les « regexp ») en plus simple.

Outre les deux caractères génériques déjà vus, des combinaisons restreintes sont disponibles :
-  le cas de l’ anti-slash \ est particulier : utilisé comme séparateur sous Windows, il nécessite dans ce cas d’être redoublé pour être reconnu comme séparateur dans les chemins ; il est donc plus simple d’utiliser la forme linux de séparateur, le slash / qui sera donc reconnu tant sous Linux qu’eventuellement traduit sur Windows !
-  cette spécificité est due à l’autre usage de l’ anti-slash \, tout aussi particulier : son rôle courant est de servir de caractère d’échappement, c’est à dire de marquer un caractère normalement significatif (prenons par exemple le besoin d’afficher un ;, un ? ou un +) : pour éviter de laisser ce caractère interprété comme habituellement dans la gestion de fichiers [3], vous devrez l’ecrire en le préfixant par cet antislash....
-  mettre entre accolades une série de sous-masques alternatifs [4] permet une expansion conditionnelle de listes alternatives : il semblerait ?? que la présence d’accolades dans le chemin soit indispensable pour activer le mécanisme d’expansion.... à vérifier !
-  on peut préciser un groupe de caractères, en les mettant entre crochets, sous forme de liste ou d’intervalle, comme ?[a-d]* pour prendre tous les fichiers ayant en seconde position, l’une des quatre premières minuscules de l’alphabet !
-  le point d’exclamation !sert de négateur, comme en Spip : ainsi [!...] correspond à tous les caractères absents du groupe, par exemple [!a-zA-Z0-9] prendra tout caractère non alphanumérique.
Enfin, il semble que une seule expansion conditionnelle soit acceptable

Concernant les syntaxes approchées des boucles, le critère exclus est purement refusé ; le critère doublons a provoqué un refus pour absence de clé primaire [5].

encore d’autres remarques à venir : article en-cours de rédaction et de controle !

[1pour un caractère quelconque, remplaçant le point d’interrogation.

[2pour toute chaine de caractères, mise à la place de l’asterisque...

[3Le + est utilisé pour concatener deux fichiers !

[4C’est ce qui a été fait dans le modèle initial : {source glob, IMG/{??g/,}*.??g}>

[5Normal pour ceux qui ont très bien lus la documentation d’origine Acces-SPIP-aux-tables-externes-et-jointures..

YannX - Mise à jour :11 mars 2012 à 18h34min