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 !
[1] pour un caractère quelconque, remplaçant le point d’interrogation.
[2] pour toute chaine de caractères, mise à la place de l’asterisque...
[3] Le + est utilisé pour concatener deux fichiers !
[4] C’est ce qui a été fait dans le modèle initial : {source glob, IMG/{??g/,}*.??g}>
[5] Normal pour ceux qui ont très bien lus la documentation d’origine Acces-SPIP-aux-tables-externes-et-jointures..