www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit 662106dfd023f69f93f94c0ff9a0527f7ab0f427
parent 04be9830b28e26748359fc4be8d3dfdac01fc989
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Thu, 29 Jul 2010 01:11:51 +0200

Implémentation partielle de Chemin.

Diffstat:
M__cms__/chemin/chemin.php | 66++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 58 insertions(+), 8 deletions(-)

diff --git a/__cms__/chemin/chemin.php b/__cms__/chemin/chemin.php @@ -1,14 +1,64 @@ <?php -function correspond(motif, chemin) { - // motif : liste de segments, pouvant être un chaîne ou un jocker - // correspondant à "n'importe quelle chaîne pour ce segment". Le - // dernier segment peut être le joker "n'importe quelle suite de - // segments (le motif doit donc correspondre à un préfixe du chemin - // dans ce cas-là). - // chemin : liste de segments. +require_once(dirname(__FILE__) . "/path.php"); + +class Chemin { + // Si $chemin est un tableau, il doit vérifier les invariants de nettoyer_chemin. + public function __construct($chemin) { + if (! is_array($chemin)) { + $this->segments = explode('/', self::nettoyer_chemin($chemin)); + } else { + $this->segments = $chemin; + } + } + + public function correspond(motif, chemin) { + // motif : liste de segments, pouvant être un chaîne ou un jocker + // correspondant à "n'importe quelle chaîne pour ce segment". Le + // dernier segment peut être le joker "n'importe quelle suite de + // segments (le motif doit donc correspondre à un préfixe du chemin + // dans ce cas-là). + // chemin : liste de segments. + + // les segments de chemin et motif sont déjà nettoyés. + } - // les segments de chemin et motif sont déjà nettoyés. + // Invariant de sécurité : la chaîne renvoyée ne commence ni ne + // termine par '/'. + public function get() { + return '/'.join($this->segments, '/'); + } + + public function enfant($nom) { + $s = $this->segments; + array_push($s, self::nettoyer_segment($nom)); + return new self($s); + } + + public static function nettoyer_chemin($chemin) { + // SECURITE : $chemin_nettoyé + // * Ne contient pas '\0' + // * Ne contient pas '../' + // * Ne contient pas de double occurence de '/' + // * Ne contient pas __prop__ + // * Ne se termine pas par '/' + // * Ne commence pas par '/' + // * Ni d'autres bizarreries des chemins de fichiers. + + $chemin = preg_replace("/\\0/", '', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) + $chemin = Path::normalize($chemin); + $chemin = preg_replace("/__prop__/", '___prop___', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) + $chemin = preg_replace("/^\/*/", '', $chemin); + $chemin = preg_replace("/\/*$/", '', $chemin); + + // TODO + return $chemin; + } + + public static function nettoyer_segment($segment) { + // TODO. Ne doit pas être vide, remplacer par _vide_ sinon. + // Ne doit pas contenir '*' non plus. Remplacer par '-' + } } ?>