Texy v Latte
Píšete šablony v Latte? Texy do nich přidá filtr |texy a
značku {texy}, takže článek v Markdownu nebo v syntaxi Texy převedete na HTML přímo v šabloně, se vší
typografií a bezpečností, kterou Texy umí.
Filtr |texy
Na blogu máme článek uložený jako text a v šabloně ho chceme vypsat jako HTML. Nejdřív Latte řekneme, že má Texy
používat. Udělá to rozšíření TexyExtension, které dostane objekt Texy\Texy:
$texy = new Texy\Texy;
$latte = new Latte\Engine;
$latte->addExtension(new Texy\Bridges\Latte\TexyExtension($texy));
V šabloně pak článek převede filtr |texy:
<article>
{$article->text|texy}
</article>
Latte jinak každou proměnnou escapuje, aby se z ní nestalo HTML. Filtr |texy ale vrací hotové HTML, a Latte
ho proto vypíše beze změny.
Rozšíření se řídí nastavením objektu $texy, takže všechno z konfigurace platí i v šablonách.
Markdown
Píšete články v Markdownu? Místo objektu Texy\Texy předejte rozšíření funkci, která text převede:
$markdown = new Texy\Markdown\Markdown;
$markdown->config->locale = 'cs';
$latte->addExtension(new Texy\Bridges\Latte\TexyExtension($markdown->toHtml(...)));
Zápis $markdown->toHtml(...) metodu nevolá, ale předá ji rozšíření jako funkci. Filtr
|texy i značka {texy} pak převádějí Markdown.
Značka {texy}
Někdy je text přímo v šabloně, třeba úvod stránky nebo patička. Napište ho mezi {texy} a
{/texy}:
<aside>
{texy}
## Jak na to
Sušte v **tenké** vrstvě a pravidelně obracejte.
{/texy}
</aside>
S rozšířením pro Markdown z předchozí kapitoly z toho vznikne:
<aside>
<h2>Jak na to</h2>
<p>Sušte v <strong>tenké</strong> vrstvě a pravidelně obracejte.</p>
</aside>
Odsazení, které mají řádky textu společné kvůli okolní šabloně, rozšíření před převodem odebere. Markdown tak odsazené řádky nečte jako blok kódu.
Text, který neobsahuje žádnou proměnnou, převede Latte jen jednou, už když šablonu kompiluje, a ve zkompilované šabloně je rovnou hotové HTML. Šablona pak na Texy nečeká. Když ale změníte nastavení Texy, smažte cache Latte, jinak bude šablona dál vypisovat HTML podle starého nastavení.
Proměnná uvnitř {texy} se stane součástí textu, který Texy čte, a to i s HTML, které
obsahuje. Text od návštěvníků proto do {texy} nevkládejte. Patří do filtru s bezpečným režimem, jak
ukazuje následující kapitola.
Komentáře od návštěvníků
Filtr |texy je určený pro vaše vlastní texty a výchozí nastavení Texy propustí skoro jakékoli HTML.
Komentáře, které píše kdokoli, převádějte objektem v bezpečném režimu. Filtr |texy může mít
Latte jen jeden, a tak pro komentáře přidáme vlastní filtr:
$comments = new Texy\Markdown\Markdown;
$comments->config->locale = 'cs';
Texy\Markdown\Configurator::safeMode($comments);
$latte->addFilter('comment', fn(string $text) => new Latte\Runtime\Html($comments->toHtml($text)));
<div class="komentar">{$comment->text|comment}</div>
Latte\Runtime\Html říká Latte, že výsledek je hotové HTML a nemá se znovu escapovat. Skript, který by
autor komentáře zkusil podstrčit, se zobrazí jako neškodný text a odkazy dostanou rel="nofollow".