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.
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>