IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

PHP 7 : Gestion d'un tableau


Sujet :

Langage PHP

  1. #1
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut PHP 7 : Gestion d'un tableau
    Bonjour,

    à un tableau donné, dont la structure peut fortement ressembler à celle qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    array(19) {
      [0]=>
      string(71) "Ceci est du texte -"
      [1]=>
      string(35) "Ceci est un paragraphe ?!"
      [2]=>
      string(0) ""
      [3]=>
      string(0) ""
      [4]=>
      string(51) "* Auteur a écrit:"
      [5]=>
      string(78) "> Oui, parce qu'il a dit !!!"
      [6]=>
      string(1) ">"
      [7]=>
      string(1) ">"
      [8]=>
      string(32) "> Author wrote:"
      [9]=>
      string(63) ">> * Auteur a écrit : le [18-05-2019 07:22:51 +0200]:"
      [10]=>
      string(61) ">>> Cette phrase qui n'a aucun sens !"
      [11]=>
      string(17) ">>> N'est-ce pas ?"
      [12]=>
      string(16) ">> Oui, en effet !"
      [13]=>
      string(4) "> --"
      [14]=>
      string(71) "> Première ligne de suite"
      [15]=>
      string(6) "> ----"
      [16]=>
      string(49) "> Deuxième ligne de signature"
      [17]=>
      string(37) "> Troisième ligne de signature"
      [18]=>
      string(1) ">"
      [19]=>
      string(0)
      [20]=>
      string(1) "!"
    }
    (bien sûr, ayant réécrit les phrases pour l'exemple, on s'en fout des compteurs de chaînes... ce n'est pas ça qui compte)

    - Dans un premier temps, je recherche la présence d'une chaîne qui commence par '* ' pour lui supprimer ce caractère '*' - d'ailleurs, on remarquera que je fais quasiment le même traitement dans le contexte où j'ai la présence de '>' devant '*'... dixit ligne ci-dessous.
    - Dans un second temps, je veux traiter la présence des chaînes qui commencent absolument par '>' pour ensuite les traiter, sachant que s'il y en a plusieurs, la première commence absolument par un seul '>' et que les lignes suivantes peuvent avoir par imbrication la présence d'un ou plusieurs '>'. (pour schématiser, on va dire que ce sont des blocs de futures citations, tel le codage en Markdown).
    - Le tableau peut finir par la présence de différents caractères ou non...

    Mon début de code PHP ressemble à ceci - et j'ai le terrible sentiment que je m'y prend très mal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
        function mngMain($main) {
     
            $sign = false;
     
            foreach($main as $key => $line) {
     
                // if line start with '*' and end with ':'...
                if(strpos($line, '* ', 0) !== FALSE) {
                    $main[$key] = preg_replace('/^\* (.*?):$/',"\n".'${1}:', $line);
                }
     
                /*
                 * Treatment for blockquote: search all lines started with '>'.
                 *
                 * */
                if(strpos($line, '>', 0) !== FALSE) {
     
                    // if line is only '> --', rewrite with start code block MD
                    if(strcmp($line, '> --') == 0) {
                        $sign = true;
                        $main[$key] = ">\n \n> ```";
                    }
                    // if line start with '> *'
                    elseif(strpos($line, '> *', 0) !== FALSE) {
                        $main[$key] = preg_replace('/^\> \* (.*?):$/',"\n".'> ${1}:', $line);
                    }
                    // ici je cherche à traiter les correspondances pour injecter un même pattern en début de la première ligne correspondante, 
                    //  et en fin de la dernière ligne correspondante... 
                    //   et/ou sur la même ligne si seule et si elle(s) existe(nt)
                    elseif(strpos($line, '>>', 0) !== FALSE) {
                        preg_match('/^>>/', $line, $m); var_dump($m);
                    }
                    else $main[$key] = $line;
     
                    $index = $key;
     
                }
     
            }
            unset($key, $line);
     
            if($sign) $main[$index] = $main[$index]."```\n";
     
           return $main;
        }
    Une idée à me soumettre ? merci d'avance...

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je me demande d'abord d'où provient le texte (fichier, données POST, bdd..?) et pourquoi est-il sous la forme d'un tableau de chaînes ?

    Je vois des trucs inutiles dans ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // if line start with '*' and end with ':'...
    if(strpos($line, '* ', 0) !== FALSE) {
        $main[$key] = preg_replace('/^\* (.*?):$/',"\n".'${1}:', $line);
    }
    Ta condition if et ta pattern font deux fois la même chose: tester la présence de * au début de la ligne.
    Écrire directement $main[$key] = preg_replace('/^\* (.*):$/', "\n$1:", $line); sans faire de if avant, revient strictement au même. Tu fais cette même erreur plusieurs fois dans le code (garde en tête que preg_replace trouve et remplace, donc pas la peine de faire des tests supplémentaires).

    unset($key, $line); ne sert à rien.

    Si tu es motivé (car ça peut te sembler ardu pour le moment), je te conseille de jeter un œil au livre Modern PHP chez O'Reilly (trouvable dans n'importe quelle bibliothèque universitaire), notamment en ce qui concerne les flux (streams au chapître 5), ce qui pourra te donner des idées pour une manière élégante de procéder (quelque soit la provenance du texte). Il y a d'ailleurs un exemple de traitement du markdown en exploitant les filtres de flux sur sitepoint.com.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Merci pour les remarques, j'en tiens compte....

    Bien que je ne voye pas l'intérêt de dire d'où vient les données : Quoiqu'il en soit je n'ai pas de problème pour ouvrir mon flux. C'est en effet une chaîne qui récupère le contenu d'un fichier texte qui n'est pas du tout du markdown, mais le corps de texte de mails. (écrit par un autre programme que je ne maîtrise pas).

    Je l'analyse pour "corriger" les erreurs et en faire simplement un vrai markdown, qui passe à la moulinette de la class Parsedown, au lieu de MarkdownFilter.

    Bref, la chaîne est simplement transformée en array par l'usage de la fonction explode...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Savoir "d'où vien(nen)t les données" (et surtout sous quelle forme) permettrait peut-être de proposer une solution plus intelligente adaptée pour leur récupération / structuration.

  5. #5
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Bonjour, @jreaux62 et au reste du monde aussi :p

    Bon, alors pour tout raconter, c'est un fichier dont le nom change que je récupère sous forme d'objet avec un code qui ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
            $info = new SplFileObject($file);
            (...)
     
            if(! empty($this->id) ) {
                $info->seek(3);
                $txt = '';
     
                while( ! $info->eof()) {
                    $txt .= $info->fgets();
                }
     
                Parser::txtToMd($txt);
     
            }
    - "$this->id" est un identifiant de fichier qui est envoyé plus tôt lors de l'appel du fichier.
    - on va directement à la ligne qui est la plus intéressante : l'appel de mon Parser (classe statique)

    Dans la class Parser, le code relatif à la méthode 'txtToMd()' est de cet acabit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        public static function txtToMd($str) {
     
            self::toStr($str);
            self::strToArrays();
            (...)
     
        }
    la méthode 'toStr()' - mal nommée, mais en attendant de trouver un nom plus explicite, ce n'est pas le propos - :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    private static function toStr($str)
        {
     
            $pattern = array(
                '/\A--(\s+)/',
                //'/(>\s(-{2})) /',
                '/\*\s(.*?):/',
                //'/(>+)\s\*\s(.*?):/',
            );
     
            $replace = array(
                "\n--\n",
                //"> --\n>",
                "$1:",
                //"*** $1 $2:",
            );
     
     
            $str = preg_replace($pattern, $replace, $str);
     
            self::$txt = $str; 
            unset($txt);
        }
    - la méthode 'strToArrays()' - qui me permet de détecter la présence de la chaîne '--', si elle existe, pour l'exploser en deux arrays(), un considéré comme étant le corps de texte, et l'autre comme corps de signature.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
         /*
         * Explode String to get both arrays;
         * separate main and sign, segun characters '--' into string
         * */
        private static function strToArrays() {
     
            $array = explode("\n", self::$txt);
     
            if(in_array('--', $array)) {
                $c = count($array);
                $k = array_search('--', $array);
                self::$main = array_slice($array, 0, $k);
                self::$sign = array_slice($array, $k+1, $c-1);
                unset($c, $k);
            }
            else self::$main = $array;
     
            unset($array);
     
        }
    - la méthode 'mngMain()' - sur laquelle je "travaille" - qui permet donc de traiter le corps de texte du fichier ASCII - et sur laquelle je n'arrive à rien de probant - les différents code en commentaires sont différents essais :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
        /*
         * Manage object main to rectify segun Markdown's definition
         * */
        private static function mngMain() {
     
            $index = null;
            $main = self::$main;    //var_dump($main);
            $sign = false;
     
            $b = $b1 = $b2 = $b3 = array();
     
            $b1 = preg_grep('/^>{1,}/', $main); //var_dump($b1);
     
            $k = array_key_last($b1);
            $k2 = array_keys($b1, '> --'); var_dump($k2);
     
            $b1[$k2] = '> -- ```';
            $b1[$k+1] = "```";  //var_dump($b1);
     
     
     
            //if(!empty($b1)) {
                //$b2 = preg_grep('/^>{2}/', $b1);
     
                //if(!empty($b2)) {
                    //$k = array_key_last($b2);
     
                    //$b2[$k+1] = ">";
                    //var_dump($b2);
     
                    ////$b3 = preg_grep('/^>{3}/', $b2);
     
                    ////if(!empty($b3)) {
                        ////$k = array_key_last($b3);
                        //////array_unshift($b3, ">>");
     
                        ////$b2 = array_replace_recursive($b2, $b3);
                    ////}
     
     
     
                    //$b1 = array_replace_recursive($b1, $b2);
     
                //}
     
                //$b3 = preg_grep('/^>{3}/', $b1);
     
                //if(!empty($b3)) {
                    //$k = array_key_last($b3);
                    //$b3[$k+1] = ">>";
     
                    ////$b1 = array_replace_recursive($b1, $b3);
                //}
     
            //}
     
     
            $main = array_replace_recursive($main, $b1);
            var_dump($main);
     
     
            //foreach($main as $key => $line) {
     
                //// if line start with '*' and end with ':'...
                //$main[$key] = preg_replace('/^\* (.*?):$/',"\n".'${1}:', $line);
     
                ///*
                 //* Treatment for blockquote: search all lines started with '>'.
                 //*
                 //* */
                //if(strpos($line, '>', 0) !== FALSE) {                
     
                    //// if line is only '> --', rewrite with start code block MD
                    //if(strcmp($line, '> --') == 0) {
                        //$sign = true;
                        //$main[$key] = ">\n \n> ```";
                    //}
                    //// if line start with '> *'
                    ////elseif(strpos($line, '> *', 0) !== FALSE) {
                        ////$main[$key] = preg_replace('/^\> \* (.*?):$/',"\n".'> ${1}:', $line);
                    ////}
                    ////elseif(strpos($line, '>>', 0) !== FALSE) {
                        //////$main[$key] = "\n".$line;
                        ////preg_match('/^>>/', $line, $m); var_dump($m);
                    ////}
                    //else $main[$key] = $line;
     
                    //$index = $key;
     
                //}
     
            //}
            ////unset($key, $line);
     
            //// if exist line with '> --', then add end code block MD
            //if($sign) $main[$index] = $main[$index]."```\n";
     
            unset($sign, $index);
     
            self::$main = implode("\n",$main);  //var_dump(self::$main);
     
            return self::$main;
     
            unset($main);
     
        }
    Bref, vous savez tout...

    C'est un projet perso - sur lequel je "suis" - sur une liste de diffusion, en phase de test, dont les messages - des essais qui seront supprimés - sont traité avec un certain langage autre, et restitués sous forme ASCII.
    Voici un exemple de fichier restitué - qui devient l'objet 'txt' dans le Parser que j'ai créé pour l'occasion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #Re: test sans sign GPG
    **Stephane HUC ""**
    *2019-05-18T07:29:10+02:00*
     
    Tiens en passant, on peut remarquer qu'il y a un problème d'encodage -
    miniml ne gère pas correctement ?!
     
     
    On 5/18/19 7:27 AM, Stephane HUC  wrote:
    > Par contre, le message avec ma signature GPG (ED25519), il l'a bloqué !!!
    >
    >
    > On 5/18/19 7:25 AM, prx wrote:
    >> * Stephane HUC <mail-AT-obsd4a.net> le [18-05-2019 07:22:51 +0200]:
    >>> Ceci est un test d'envoi, sans sign, ni chiffrement GPG !
    >>> Reçu ?
    >> Reçu !
    > --
    > ~ " Fully Basic System Distinguish Life! " ~ " Libre as a BSD "	+=<<<
    > ----
    > <me>Stephane HUC </me>
    > <mail>mail-AT-mondomaine.net</mail>
    >
    --
    ~ " Fully Basic System Distinguish Life! " ~ " Libre as a BSD "	+=<<<
    ----
    <me>Stephane HUC</me>
    <mail>mail-AT-mondomaine.net</mail>
    Bien-sûr dans la forme le contenu du fichier ASCII peut changer et de toute façon de l'un à l'autre leur nom change.

    Bref, comme je l'ai dit plus haut, cela peut ressembler à du Markdown, mais cela n'en est pas !
    Et nécessite quelques petites corrections pour que ce soit bien traité par un parser MD ou l'autre... (dans l'immédiat, de l'analyseur en question, on s'en fiche un peu... )

    On ne s'occupe pas du problème d'encodage apparent - c'est un faux problème !

    Bien pour en faire un vrai fichier MD, il faut :

    - que les caractères '--' sans rien d'autres, qui caractérisent dans un mail une signature, soient suivi d'un nouvelle ligne afin que le texte suivant - s'il y en a ne soit pas décodé par le Parser MD comme étant du texte de niveau 2 - sachant qu'ensuite il est traité à part puisque devient l'objet 'sign' dans la méthode 'strToArrays()' de mon Parser. Bon, je traite sans soucis, le cas où la change en question est suivi d'un ou plusieurs espaces... pour les réduire à rien

    - que tout texte commençant par '*' et finissant par ':' soit traité pour supprimer le '*' afin qu'il ne soit pas confondu avec un début de liste par le Parser MD.
    - traiter toute ligne commençant par '>' afin de créer une imbriquation correcte de blockquote pour le Parser MD.
    - repérer toute présence de plusieurs '>' - sachant qu'il peut y en avoir autant que possible dans une citation de mail - et les traiter ainsi :
    - '(>{2,})\s--' doit être suivi d'autant de '>' sur une nouvelle ligne.
    - que la dernière ligne de chacun des multiples '>' soit suivie d'une nouvelle avec autant de '>' moins un.
    - et le must dans ce contexte, de supprimer toute présence de signature - présence des '--' commençant par un ou plusieurs '>' et des lignes suivantes, ayant le même nombre de '>'.

    Bon, j'espère n'avoir rien oublié !
    (ce fut long à expliquer ; en espérant que c'est simple à comprendre)

  6. #6
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Bon j'arrive à un résultat certain - peut-être pas le plus élégant mais fonctionnel :

    - je vire la méthode 'strToArrays()'
    - je fais tout dans 'mngMain()' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
        private static function mngMain() {
     
            $b = array();               
            $array = explode("\n", self::$txt);  
     
            foreach($array as $key => $val) {    
     
                // search line starting with '--', follow with spaces to delete them
                if(preg_match('#\A--(\s*)#', $array[$key], $m))    $array[$key] = trim($array[$key]);
     
                // delete '*' if line start with...
                if(preg_match('#\A(.*)(\*)(.+)\Z#', $array[$key], $m))  $array[$key] = $m[1].$m[3];
     
                // search line start with '>'
                if(preg_match('/\A(>+)(.*)/', $array[$key], $m)) {
                    $b[$key] = $m;
     
                    unset($array[$key]);
                }
     
            }
     
            if(!empty($b)) {
                foreach($b as $key => $val) {
                    if(strcmp("> --", $b[$key][0]) == 0) $k = $key;
                    if(array_search(">", $b[$key])) $k1 = $key;
                    if(array_search(">>", $b[$key])) $k2 = $key;
                    //if(array_search(">>>", $b[$key])) $k3 = $key;
                }
     
                // delete sign into blockquote
                if(!empty($k)) {
                    while($k <= $k1) { unset($b[$k]); $k++; }
                }
                unset($k, $k1);
     
                // add new line after '>>'
                if(!empty($k2)) {
                    $b[$k2][0] = ">>\n".$b[$k2][0]."\n>";
                }
                unset($k2);
     
                // rebuild monodimensional array
                foreach($b as $key => $val) {
                    $b1[$key] = $b[$key][0];
                }
     
                if(!empty($b1)) {
                    $array = array_replace($array, $b1); 
                }
                // sort keys because are not in good place.
                ksort($array); 
     
                $array = array_values($array);
            }
     
            if(in_array('--', $array)) { 
                $c = count($array);
                $k = array_search('--', $array); 
                $main = array_slice($array, 0, $k);  
                self::$sign = array_slice($array, $k+1, $c-1);   
                unset($c, $k);
            }
            else $main = $array;
     
            self::$main = implode("\n",$main);  
     
            unset($main);
     
        }
    Voilà, c'est déjà un début qui me semble intéressant !

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Merci pour ces précisions. Mais un exemple valant mieux qu'un long discours: peux-tu poster ton fichier d'exemple une fois transformé selon ton souhait pour illustrer ton propos?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Merci pour ces précisions. Mais un exemple valant mieux qu'un long discours: peux-tu poster ton fichier d'exemple une fois transformé selon ton souhait pour illustrer ton propos?
    Le fichier d'entrée ? si c'est ça, c'est le dernier bloc de code que j'ai posté dans un de mes posts précédents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    #Re: test sans sign GPG
    **Stephane HUC ""**
    *2019-05-18T07:29:10+02:00*
     
    Tiens en passant, on peut remarquer qu'il y a un problème d'encodage -
    miniml ne gère pas correctement ?!
     
     
    On 5/18/19 7:27 AM, Stephane HUC  wrote:
    > Par contre, le message avec ma signature GPG (ED25519), il l'a bloqué !!!
    >
    >
    > On 5/18/19 7:25 AM, prx wrote:
    >> * Stephane HUC <mail-AT-obsd4a.net> le [18-05-2019 07:22:51 +0200]:
    >>> Ceci est un test d'envoi, sans sign, ni chiffrement GPG !
    >>> Reçu ?
    >> Reçu !
    > --
    > ~ " Fully Basic System Distinguish Life! " ~ " Libre as a BSD "	+=<<<
    > ----
    > <me>Stephane HUC </me>
    > <mail>mail-AT-mondomaine.net</mail>
    >
    --
    ~ " Fully Basic System Distinguish Life! " ~ " Libre as a BSD "	+=<<<
    ----
    <me>Stephane HUC</me>
    <mail>mail-AT-mondomaine.net</mail>
    Le fichier de sortie, il n'y en a pas ; le tableau, une fois transformé, est réinjecté dans une string qui est directement injecté dans le Parser MD

  9. #9
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Non c'est la chaîne une fois transformée que je veux voir, juste avant que tu la transmettes au parserMD.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  10. #10
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Eh, bien, voici pour la chaîne correspondant à "main" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Tiens en passant, on peut remarquer qu'il y a un problème d'encodage -
    miniml ne gère pas correctement ?!
     
     
    >On 5/18/19 7:27 AM, Stephane HUC PengouinBSD wrote:
    > Par contre, le message avec ma signature GPG (ED25519), il l'a bloqué !!!
    >
    >
    >> On 5/18/19 7:25 AM, prx wrote:
    >>>  Stephane HUC PengouinBSD ;  le [18-05-2019 07:22:51 +0200]:
    >>> Ceci est un test d'envoi, sans sign, ni chiffrement GPG !
    >>> Reçu ?
    >>
    >> Reçu !
    >
    >
    - Là, l'imbrication est correcte. Du moins, pour l'instant, je gère deux niveaux d'imbrications.
    - Ce qui correspond à un bloc contenant une signature est bien purgé...
    - Supprimé aussi le caractère '*' dans la ligne 'auteur ; date:', même si elle est commencé par un ou plusieurs '>'

    Et, maintenant, celle correspond au bloc de signature, que j’intègre dans un bloc de code MD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ```
    ~ " Fully Basic System Distinguish Life! " ~ " Libre as a BSD "	+=<<<
    ----
    <me>Stephane HUC</me>
    <mail>bsd|stephane|huc|net</mail>
     
    ```
    Tu peux même voir le rendu HTML... Attention, dans quelques heures, ce contenu pourrait avoir disparu (car il est appelé à disparaître assez rapidement).

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ce dont je te parlais au début: utiliser les filtres de flux.

    On crée le filtre:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    class Mail2MDFilter extends \php_user_filter
    {
        private $nl = PHP_EOL;
     
        public function filter($in, $out, &$consumed, $closing)
        {
            // au premier seau (bucket) on en profite pour identifier le type de saut de ligne
            if ( $bucket = stream_bucket_make_writeable($in) ) {
                if ( preg_match('~\R~', $bucket->data, $m) )
                    $this->nl = $m[0];
     
                $bucket->data = $this->edit($bucket->data);
                $consumed += $bucket->datalen;
                stream_bucket_append($out, $bucket);
            }
     
            while ( $bucket = stream_bucket_make_writeable($in) ) {
                $bucket->data = $this->edit($bucket->data);
                $consumed += $bucket->datalen;
                stream_bucket_append($out, $bucket);
            }
     
            if ( preg_last_error() === PREG_NO_ERROR )
                return PSFS_PASS_ON;
     
            return PSFS_ERR_FATAL;
        }
     
        private function edit($str)
        {
            // efface les signatures dans les blockquotes
            $str = preg_replace('~^(>+) --\h*(?:\R\1(?![^\r\n ]).*)*$~m', '', $str);
     
            // efface les astérisques en début de ligne ou de blockquote
            $str = preg_replace('~^>*\K ?\*+~m', '', $str);
     
            // descend d'un niveau de blockquote (si ce n'est déjà le cas)
            do {
                $str = preg_replace('~^>(>++).*\R\K(?!\1)~m', '$1' . $this->nl, $str, -1, $count);
            } while ($count);
     
            // place la signature finale dans un bloc de code
            $str = preg_replace('~^--\h*$(.*\S)?\s*\z~ms', '```$1' . $this->nl . '```', $str);
     
            return $str;
        }
     
        public function onCreate()
        {
            return true;
        }
     
        public function onClose()
        {
     
        }
     
    }

    Puis ensuite, il n'y a plus qu'à l'enregistrer et à composer une url utilisant ce filtre pour avoir le résultat directement:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    require 'Mail2MDFilter.class.php';
     
    stream_filter_register('mail_to_md', 'Mail2MDFilter');
     
    $url = 'php://filter/read=mail_to_md/resource=fichierML.txt';
     
    echo file_get_contents($url);

    De la même manière, on peut créer un filtre pour transformer le Markdown en html (disons md_to_html) et le chaîner avec l'autre dans l'url:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $url = 'php://filter/read=mail_to_md|md_to_html/resource=fichierML.txt';
    Plus besoin de saucissonner puis de recoller x fois le contenu du fichier ni de se perdre en conjectures avec des lignes de tableaux.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Bon, après avoir regardé les différentes fonctions PHP sur le site php.net

    Je comprend mieux ta phrase :
    Plus besoin de saucissonner puis de recoller x fois le contenu du fichier ni de se perdre en conjectures avec des lignes de tableaux.
    Néanmoins :
    - ton code ne restitue pas exactement ce dont j'ai besoin... puisque comme je le montre dans ce post pour la sortie réalisée, l'imbrication est nécessairement retouchée, pour inclure la ligne précédente ayant la forme 'auteur, date :', précédée ou non d'un ou plusieurs '>'.

    - du flux restitué par le filtre php, j'ai quand même besoin d'avoir le "bloc" signature à part, et les trois premières lignes doivent disparaître.

    Quoiqu'il en soit, je vais me replonger dans l'usage des caractères de formatage que tu utilises dans tes pattern.

    Encore un fois, merci.

  13. #13
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Pour avoir la dernière signature à part, tu peux ajouter à la classe du filtre la variable statique suivante: static private $lastSignature;.

    Tu l'initialises dans le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function onCreate()
    {
        self::$lastSignature = '';
        return true;
    }
    Puis tu modifies la méthode edit() avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // place la signature finale dans un bloc de code
    $str = preg_replace_callback('~^--\h*$(.*\S)?\s*\z~ms', function ($m) {
        self::$lastSignature = '```' . $m[1] . $this->nl . '```';
    }, $str);
    Et pour finir, tu ajoutes une méthode statique qui te donnera la signature pour chaque utilisation du filtre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static function getLastSignature()
    {
         return self::$lastSignature;
    }
    Donc pour avoir la signature il suffit de faire: echo Mail2MDFilter::getLastSignature(); (après avoir utiliser le filtre bien sûr).

    Pour le reste tu devrais t'en sortir tout seul, mais si ce n'est pas le cas, n'hésite pas à demander (en montrant tes essais malheureux).

    Sur pcre.org tu trouveras une référence complète sur les regex utilisées par php.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  14. #14
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Merci de tes précisions.

    Je me trompe où "ton" bloc de code suivant ne fait aucun traitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // descend d'un niveau de blockquote (si ce n'est déjà le cas)
            do {
                $str = preg_replace('~^>(>++).*\R\K(?!\1)~m', '$1' . $this->nl, $str, -1, $count);
            } while ($count);
    Parce que si je le commente, il n'y a rien de moins ou de plus qui se passe... la sortie reste la même.

    Bon, autant je comprends comment rajouter un ensemble de caractères à la suite d'un bloc de caractères précis ; autant, je ne vois pas comment faire pour en ajouter un dans la ligne précédente le bloc recherché !
    (c'est le propos du '>' à rajouter pour que la ligne précédente qui tient le nom et l'heure de publication soit au même niveau d'imbrication que la citation de fait)

    Bon, je continue mes petites recherches...

  15. #15
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Oui tu te trompes, ce bloc sert précisément à:
    la dernière ligne de chacun des multiples '>' soit suivie d'une nouvelle avec autant de '>' moins un
    .


    autant, je ne vois pas comment faire pour en ajouter un dans la ligne précédant le bloc recherché !
    Il suffit de commencer ta description à partir de la ligne précédente: elle commence toujours par "On" + la date + l'heure et se termine par "wrote:". En plus en capturant le nombre de ">" tu peux facilement vérifier que la ligne suivante en a un de plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = preg_replace('~^(?|(>+) |())(?=On [\d/]{7,8} [\d:]{4,5} [AP]M,.*\bwrote:\h*\R\1> )~m', '$1> ', $str);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  16. #16
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    J'ai compris le but de ton bloc de code... mais comme je te le dis... ça ne le fait pas !
    Il n'ajoute rien.

    Ensuite, pour la ligne de description, non elle ne commence pas toujours par 'On' - ça, c'est quand le client mail est configuré en anglais - mais pour l'instant elle finit toujours avec ':'... mais je vais faire des tests à partir de ton code... je te remercie encore.

    ----

    (ajout à 9:35)
    Donc la version si FR de ta ligne de code donne ça, si j'ai bien compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $str = preg_replace('~^(?|(>+) |())(?=\* .*\[([\d-]|[\d/]){10} [\d:]{8} \+[\d]{4}\]:\h*\R\1> )~m', '$1> ', $str);
    Et, j'ai mis les deux avant celle qui supprime la présence des '*' s'ils sont en début

    Et, en effet, cela fonctionne !

    ----

    Bon, maintenant, j'essaye de comprendre pourquoi ton bloc de code pour l'imbrication ne fonctionne pas !

    En effet, tu vois bien que dans la sortie chaîne suivante, il n'y a aucun rajout d'une ligne...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
     
     
    Mais, non ! C'est corrigé...
     
    Mais, je remarque un autre bogue : il ne restitue pas correctement
    l'imbriquation des citations...
     
    Là, je ne sais pas si c'est mon code PHP, ou Parsedown qui est fautif...
    je cherche ;)
     
    > On 5/18/19 7:59 AM, xrp wrote:
    >> Stephane HUC ;  le [18-05-2019 07:57:35 +0200]:
    >> En passant, je remarque que l'affichage dans PHP de tes messages
    >> semblent ... !!!
    > CEEEENSUUUURE !!!
    >
    > Ah bravo, un filtre rien que pour mes messages :P
    >
    > Je plussoie ^^
    Il devrait avoir une nouvelle ligne comportant un '>' entre la ligne '>> semblent...' et la ligne '> CEEENSUUURE...' - mais non !

  17. #17
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Tu n'as pas précisé que la ligne suivante devait être vide! Il est facile d'adapter la pattern dans ce but:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // descend d'un niveau de blockquote (si ce n'est déjà le cas)
    do {
        $str = preg_replace('~^>(>++).*\R\K(?!\1(?:>|\h*$))~m', '$1' . $this->nl, $str, -1, $count);
    } while ($count);
    Pour la signature "française", évite de créer des groupes de capture qui ne sont pas utiles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = preg_replace('~^(?|(>+) |())(?=\* .*\[[\d/-]{10} [\d:]{8} \+\d{4}]:\h*\R\1> )~m', '$1> ', $str);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  18. #18
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Tu n'as pas précisé que la ligne suivante devait être vide!
    Pourtant c'est ce qui me semble avoir expliqué dans ce post :
    - repérer toute présence de plusieurs '>' - sachant qu'il peut y en avoir autant que possible dans une citation de mail - et les traiter ainsi :
    - '(>{2,})\s--' doit être suivi d'autant de '>' sur une nouvelle ligne.
    - que la dernière ligne de chacun des multiples '>' soit suivie d'une nouvelle avec autant de '>' moins un.
    Je comprends que c'est peut-être un peu confus...

    Citation Envoyé par CosmoKnacki Voir le message
    Il est facile d'adapter la pattern dans ce but:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // descend d'un niveau de blockquote (si ce n'est déjà le cas)
    do {
        $str = preg_replace('~^>(>++).*\R\K(?!\1(?:>|\h*$))~m', '$1' . $this->nl, $str, -1, $count);
    } while ($count);
    OK, je regarderais ça... plus profondément dans quelques heures... mais je t'avoue que je trouve cela très abscons... malgré les explications que j'essaye de comprendre sur les regex.

    Citation Envoyé par CosmoKnacki Voir le message
    Pour la signature "française", évite de créer des groupes de capture qui ne sont pas utiles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = preg_replace('~^(?|(>+) |())(?=\* .*\[[\d/-]{10} [\d:]{8} \+\d{4}]:\h*\R\1> )~m', '$1> ', $str);
    En fait, par comparaison, avec mon écriture, je comprends ce que tu veux dire. J'avais même essayé ce qui suit, qui n'avais pas fonctionné du tout : '[\d(/|-)]{10}' je n'avais pas compris que cela pouvait impliquer soit l'un, soit l'autre...

    Merci à toi, de tes démonstrations...

  19. #19
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je te la détaille:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    ~ # délimiteur de pattern
    ^ # ancre début de ligne (de part la présence du modificateur m)
    >
    (>++) # groupe de capture 1: un ou plusieurs >, ++ est un quantificateur possessif qui empêche tout backtracking 
          # (en cas d'échec de la pattern, le moteur ne pourra pas retirer un > de >++ pour tenter autre chose)
    .* # n'importe quel caractère (sauf une nouvelle ligne) de zéro à n fois avec un quantificateur gourmand (qui ira donc naturellement à la fin de la ligne).
    \R # alias de séquence nouvelle ligne
    \K # marque la position à partir de laquelle les éléments trouvés figureront dans le résultat du match
    (?! # test avant négatif: ne doit pas être suivie de ... 
        \1 # référence à la capture du groupe 1: donc le même nombre de > que la ligne précédente moins un
        (?: # groupe non-capturant
            > # un > de plus: car dans ce cas ce n'est pas la fin du bloc
          | # ou
            \h* $ # des éventuels espaces horizontaux jusqu'à la fin de ligne: une ligne vide
        )
    )
    ~m

    À propos de [\d(/|-)]{10}:
    • Dans une classe de caractères, les caractères perdent leur sens spécial. Donc (, |, ) n'ont aucun sens particulier et sont vus comme des caractères lambda.
    • Par contre - a un sens spécial dans un classe de caractères car il définit un rang, mais tel qu'il est placé, entre | et ), il provoque une erreur puisque dans la table ASCII le caractère ) (x29) est placé avant le caractère | (x7C).
    • Une classe de caractères est un sac dans lequel on met des caractères, il n'y a ni ordre, ni sous-pattern.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  20. #20
    Membre régulier Avatar de hucste
    Homme Profil pro
    IT en Arrêt Chronique de Sans-T !
    Inscrit en
    Juin 2016
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : IT en Arrêt Chronique de Sans-T !

    Informations forums :
    Inscription : Juin 2016
    Messages : 78
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    je te remercie de ton explication.
    Disons que je comprends certains drapeaux et certaines regex sommes toutes simples. Il faut avouer que c'est une gymnastique à laquelle je ne suis point habituée, surtout quand elles me semblent si compliquées, telles que tu les écrits.

    Bon, dans l'immédiat, voilà le résultat actuel de la méthode edit() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    private function edit($str)
        {
            //replace mail
            $str = Sanitizer::mailIntoData($str);
     
            // PGP Signed Message
            $str = preg_replace_callback('~^-----BEGIN PGP SIGNED MESSAGE-----\RHash:\s(.*)$~m', function($m) {
                self::$pgp['hash'][0] = $m[0];
                self::$pgp['hash'][1] = $m[1];
            }, $str);  
     
            // PGP Signature
            $str = preg_replace_callback('~^-----BEGIN PGP SIGNATURE-----\R\h*$(.*\S)?\s*\z~ms', function($m) {
                self::$pgp['sign'] = $m[0];
            }, $str);
     
            // correction pour le bloc de signature lors de PGP Message
            if(self::$pgp['hash']) $str = preg_replace('~^(.*(>+).*)>\s(-\s--)$~m', '$1'.$this->nl.$this->nl."$3", $str); 
            // place la signature finale dans un bloc de code
            if(self::$pgp['hash']) $pattern = '~^-\s--\h*$(.*\S)?\s*\z~ms';
            else $pattern = '~^--\h*$(.*\S)?\s*\z~ms';
            $str = preg_replace_callback($pattern, function ($m) {
                self::$sign = '```' . $m[1] . $this->nl . '```';
            }, $str);
     
            // line title (1rst)
            $str = preg_replace_callback('~^(\#+)(.+)$~m', function ($m) {
                self::$title = $m[2];
            }, $str);
     
            // line author (2d)
            $str = preg_replace_callback('~^(\*{2})(.+)(\*{2})$~m', function ($m) {
                self::$author = $m[2];
            }, $str); 
     
            // line date (3d)
            $str = preg_replace_callback('~^(\*+)(.+)(\*+)$~m', function ($m) {
                self::$date = $m[2];
            }, $str); 
     
            // efface les signatures dans les blockquotes
            $pattern = '~^(>+) --\h*(?:\R\1(?![^\r\n ]).*)*$~m';
            $str = preg_replace($pattern, '', $str); 
     
            // prend la ligne précédent le blockquote et ajoute une imbrication...
            //  for english
            $str = preg_replace('~^(?|(>+) |())(?=On\s[\d/]{6,8}\s[\d:]{4,5}\s[AP]M,.*\bwrote:\h*\R\1> )~m', '$1> ', $str);  
            //  for french    
            $str = preg_replace('~^(?|(>+) |())(?=\*\s.*\[[\d/-]{10}\s[\d:]{8}\s\+\d{4}]:\h*\R\1> )~m', '$1> ', $str);   
     
            // efface les astérisques en début de ligne ou de blockquote
            $str = preg_replace('~^>*\K ?\*+~m', '', $str);
     
            // descend d'un niveau de blockquote (si ce n'est déjà le cas)
            do {  
                $str = preg_replace('~^>(>++).*\R\K(?!\1(?:>|\h*$))~m', '$1' . $this->nl, $str, -1, $count);
            } while ($count);
     
            // ajoute une nouvelle ligne suivi d'autant de '>' si ligne 'auteur+date:'
            $str = preg_replace('~^(>+)(.*:)~m', '$1$2'.$this->nl.'$1', $str);
     
            return $str;
        }
    Bon, je vais continuer mon dev... et voir pour adapter la partie MD->HTML au-travers des flux... voire d'un template html... comme dans l'article que tu m'as mentionné au-début.
    Pour l'instant, je génère toute la partie HTML5 au-travers d'une class PHP, entièrement construite pour...
    Mais avant, j'ai un petit challenge perso : voir si en PHP, je peux vérifier la signature d'un mail signé GPG/PGP :p

    Bref, merci encore à toi.

Discussions similaires

  1. [POO] PHP 5 - gestion de la persistance
    Par BRAUKRIS dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2010, 13h34
  2. [PHP-JS] Gestion des évènements dans PHP
    Par haffouff dans le forum Langage
    Réponses: 5
    Dernier message: 25/04/2006, 18h51
  3. Réponses: 3
    Dernier message: 14/03/2006, 05h19
  4. [PHP-JS] Gestion include
    Par Polaire76 dans le forum Langage
    Réponses: 2
    Dernier message: 06/12/2005, 10h17
  5. Gestion d'un tableau dynamique
    Par almisuifre dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/02/2005, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo