Changeset 75146 in spip-zone


Ignore:
Timestamp:
Aug 30, 2013, 9:12:02 PM (6 years ago)
Author:
marcimat@…
Message:

Du mieux je crois dans la gestion des listes. On tolère l'absence de ligne vide avant.
On essaie de corriger aussi les blocs de codes. Ça marche à peu près lorsque c'est hors d'un @tag (dans la description d'une fonction par exemple) même sans les guillements ` (mais avec une indentation.

Par contre, dans un tag, il faut les presque à tous les coups. Mais nous avons un souci maintenant avec le tag @example qui n'est finalement pas fait pour recevoir (actuellement) des exemples de code intégrés (mais pour fournir un lien vers un fichier ayant des exemples). Du coup c'est pas très pratique, d'autant qu'il casse un peu le texte qui est mis dedans en essayant de trouver une url de fichier… (ça enlève les premiers guillements ).

Location:
_galaxie_/code.spip.net/autodoc/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _galaxie_/code.spip.net/autodoc/trunk/src/autodoc/Plugin/Core/TwigZora.php

    r75131 r75146  
    1414use Zend\Config\Factory;
    1515use Zend\Config\Config;
     16use dflydev\markdown\MarkdownExtraParser;
     17
    1618
    1719/**
     
    150152    public function getFilters()
    151153    {
     154        $parser = new MarkdownExtraParser();
     155
    152156        return array(
     157            /**
     158             * Surcharge du filtre fournit par twig pour corriger quelques usages
     159             */
     160            'markdown' => new \Twig_SimpleFilter('markdown',
     161                function ($value) use ($parser) {
     162
     163                    $value = TwigZora::prepare_markdown($value);
     164                    return $parser->transform($value);
     165                }
     166            ),
    153167            /**
    154168             * Trier des éléments d'une Collection selon une demande
     
    392406            ),
    393407        );
     408    }
     409
     410
     411
     412
     413
     414    /**
     415     * Prépare le texte au passage dans markdown
     416     *
     417     * - Homogénéise l'indentation du texte. On enlève l'indentation
     418     *   de chaque ligne. Sauf la première ligne : en effet, phpdocumentor
     419     *   effectue un trim() sur l'ensemble du texte, ce qui enlève les
     420     *   espacements sur cette première ligne.
     421     *
     422     * - Indente le contenu intérieur d'un code (commence par ``` et fini
     423     *   par ```) en sautant une ligne et en enlevant les ```
     424     *
     425     * @param string $texte Le texte à préparer
     426     * @return string Texte modifié
     427    **/
     428    public static function prepare_markdown($texte) {
     429
     430        // pas de saut de ligne = rien à faire
     431        if (false === strpos($texte, "\n")) {
     432            return $texte;
     433        }
     434
     435        // 1)
     436        // on essaie de calculer le nombre d'espacements à gauche des lignes
     437        // pour les enlever. Pour cela, il ne faut pas tenir compte de la
     438        // première ligne, car phpdocumentor effectue un trim()
     439        $texte = explode("\n", $texte);
     440        $espace = 10;
     441        foreach ($texte as $k => $t) {
     442            if ($k) {
     443                $esp = strlen($t) - strlen(ltrim($t));
     444                $espace = min($espace, $esp);
     445            }
     446        }
     447
     448        // on a ici normalement l'espace minimum.
     449        // on enlève cet espacement sur chaque ligne
     450        if ($espace) {
     451            foreach ($texte as $k => $t) {
     452                if (strlen($t) - strlen(ltrim($t)) > 0) {
     453                    $texte[$k] = substr($t, $espace);
     454                }
     455            }
     456        }
     457
     458        // 2)
     459        // A) gerer un peu les codes
     460        //
     461        // Le problème se pose avec les tags, pas vraiment avec
     462        // une description de fonction qui peut se satisfaire d'un
     463        // décallage de 4 espaces.
     464        //
     465        // Cependant, dans un tag, par exemple @example, si l'on veut
     466        // commencer directement par le code, cela ne fonctionne pas car
     467        // on ne sait pas qu'il y a une indentation
     468        //
     469        // B) On gère également les listes avec * ou -
     470        //
     471        // Si une ligne (hors bloc de code) commence par * ou -
     472        // et que la ligne précédente n'est pas vide ou n'est pas une liste
     473        // alors on ajoute une ligne vide…
     474        $is_code = false;
     475        $new_texte = array();
     476
     477        foreach ($texte as $k => $t) {
     478            $ligne = ltrim($t);
     479
     480            if (!$is_code) {
     481                $debut = substr($ligne,0,3);
     482                // du code qui commence ?
     483                if ($debut === '```') {
     484                    $is_code = true;
     485                    $esp = substr($t,0,strlen($t) - strlen($ligne));
     486                    $new_texte[] = "\n\n" . $esp . substr($ligne, 3);
     487                }
     488                // sinon… du texte
     489                else {
     490                    if ($k and $ligne and ($ligne[0] == '-' OR $ligne[0] == '*')
     491                      and ($prev = trim($texte[$k-1]))
     492                      and ($prev[0] != '-' AND $prev[0] != '*')) {
     493                        $new_texte[] = "";
     494                    }
     495                    $new_texte[] = $t;
     496                }
     497            }
     498            // que du code… à indenter
     499            else {
     500                $t = '    ' . $t;
     501                if (substr(rtrim($t),-3) === '```') {
     502                    $new_texte[] = substr(rtrim($t),0,-3) . "\n";
     503                    $is_code = false;
     504                } else {
     505                    $new_texte[] = $t;
     506                }
     507            }
     508        }
     509        $texte = $new_texte;
     510
     511        $texte = implode("\n", $texte);
     512        return $texte;
    394513    }
    395514
  • _galaxie_/code.spip.net/autodoc/trunk/templates/zora/inclure/descriptions/functions.twig

    r75141 r75146  
    7373
    7474                                                                {% if argument.description %}
    75                                                                 <div class="description">{{argument.description|raw }}</div>
     75                                                                <div class="description">{{argument.description|markdown|raw }}</div>
    7676                                                                {% endif %}
    7777                                                        </div><!-- .param -->
Note: See TracChangeset for help on using the changeset viewer.