Mode line du filtre Twig Markdown de Grav

grav

Pas intéressé par les explications ? Ticket express pour le tl;pl 🚀

Avec Grav, il est possible d’accéder aux éléments du front matter YAML depuis les modèles Twig. Très utile pour élégamment insérer une liste d’éléments :

---
title: Foo
things:
  - bar
  - baz
---
<ul class="things">
{% for thing in page.header.things %}
  <li>{{ thing|raw }}</li>
{% endfor %}
</ul>

Résultat :

<ul class="things">
  <li>bar</li>
  <li>baz</li>
</ul>

Et si on essayait d’ajouter du Markdown ?

Nous pourrions utiliser le filtre Twig Markdown de Grav :

---
title: Foo
things:
  - "**bar**"
  - baz
---
<ul class="things">
{% for thing in page.header.things %}
  <li>{{ thing|markdown }}</li>
{% endfor %}
</ul>

Cependant, il enveloppe les éléments avec des tags <p>, ce qui va probablement affecter le rendu et n’est sûrement pas ce que ne vous souhaitons :

<ul class="things">
  <li><p><strong>bar</strong></p></li>
  <li><p>baz</p></li>
</ul>

J’ai commencé par contourner le problème avec un filtre personnalisé linemarkdown forçant l’utilisation de la fonction Parsedown::line :

<?php

namespace Grav\Theme;

use Grav\Common\Markdown\ParsedownExtra;

class CustomQuark extends Quark
{
  public function onTwigInitialized()
  {
    parent::onTwigInitialized();
    $this->grav['twig']->twig()->addFilter(
      new \Twig_SimpleFilter('linemarkdown', [$this, 'lineMarkdownFunction'])
    );
  }

  public function lineMarkdownFunction($string)
  {
    $parsedown = new ParsedownExtra(null);
    return $parsedown->line($string);
  }
}

Mais après avoir regardé comment Grav enregistrait son filtre markdown , j’ai remarqué que la fonction markdownFunction avait un paramètre $block optionnel, ensuite utilisé dans Utils::processMarkdown pour déterminer si utiliser Parsedown::text (cas par défaut) ou Parsedown::line (ce que je souhaitais).

Fait amusant : en creusant un peu avec git blame, c’était implémenté depuis la 1.2.0. Ça n’avait juste jamais été documenté ! J’ai ouvert une PR à ce propos, mais en attendant… Bon, ce fut un merge rapide au final.

tl;pl

Lors de l’insertion de variables Markdown dans Twig avec le filtre markdown, passer false au filtre pour utiliser le mode line (pas de tag enveloppant) plutôt que le mode text par défaut (enveloppé par <p>) :

---
title: Foo
things:
  - "**bar**"
  - baz
---
<ul class="things">
{% for thing in page.header.things %}
  <li>{{ thing|markdown(false) }}</li>
{% endfor %}
</ul>

Résultat :

<ul class="things">
  <li><strong>bar</strong></li>
  <li>baz</li>
</ul>

Article précédent Article suivant