Texy – chyby v ovladači blockHandler – pro zvýraznění kódu
- m.brecher
- Generous Backer | 864
V Nette aplikaci používám Texy 3.1.4. takto:
config.neon:
Texy: Texy\Texy # registrace služby
ArticlePresenter.php:
public function __construct(
.......
// předání Texy do presenteru
private Texy\Texy $texy,
)
{}
public function startup()
{
.......
// konfigurace Texy - zvýraznění syntaxe kódu
$this->texy->addHandler('block', ['App\Utils\TexyUtils', 'blockHandler'] );
}
public function actionShow(.....)
{
.......
// předání Texy do šablony
$this->template->texy = $this->texy;
}
Article.show.latte:
<div class='content-box'>{$texy->process($article->texy_content)|noescape}</div>
Metodu blockHandler jsem vytvořil podle návodu DG zde https://texy.info/cs/try-settings – volá se v startup() presenteru:
class TexyUtils
{
public static function blockHandler(
Texy\HandlerInvocation $invocation,
string $blocktype,
string $content,
string $lang,
Texy\Modifier $modifier = null,
): Texy\HtmlElement
{
if ($blocktype !== 'block/code') {
// nothing to do
return $invocation->proceed();
}
$texy = $invocation->getTexy();
$elPre = Texy\HtmlElement::el('pre');
if ($modifier) {
$modifier->decorate($texy, $elPre);
}
$elPre->attrs['class'] = 'language-' . $lang;
$content = $texy->protect(htmlspecialchars($content), $texy::CONTENT_BLOCK);
$elPre->create('code', $content);
return $elPre;
}
}
V této variantě blockHandler Tracy ohlásí chybu
Argument #4 ($lang) must be of type string, null given
Zkusil jsem tu chybu obejít takto – neúspěšně, zřejmě Texy do proměnné $lang tak jako tak předá hodnotu null.
string $lang = 'php',
Povolením null jsem vyhození chyby odstranil, ale do proměnné $lang se zřejmě stejně předá null:
string|null $lang = 'php',
Pro správnou funkci zvýraznění syntaxe kódu php javascriptem prism.js by se kód měl zformátovat do html takto:
<pre class="language-php">
<code>... nějaký kód php...</code>
</pre>
Otestoval jsem opravený blockhandler textem podle návodu https://texy.info/cs/try-settings:
/--code
... nějaké php ...
\--
Texy na výstupu poskytlo správné tagy html, ale u třídy tagu <pre> chybí „php“ – zřejmě proto, že jazyk php ve vstupním textu zadán
<pre class="language-">
<code>... nějaký kód php...</code>
</pre>
Zkoušel jsem v testovacím textu měnit /--code za něco jiného, ale když
nebyl parametr $blocktype = ‚block/code‘ tak se spustila metoda
$invocation->proceed(), která neměla dělat nic, ale ta vyhodila
chybu App\Utils\TexyUtils::blockHandler(): Return value must be of type Texy\HtmlElement, null returned
Zkoušel jsem také syntaxi označení bloku kódu php stejně jako na fóru nette ```php ... ```, ale ani to nefunguje.
Napadá mne co by mohlo být špatně:
- zápis bloku ve vstupním textu zdrojového kódu (kde se má zvýraznit syntaxe) podle ukázky u návodu (dg) není správně /--code
- v uvedeném návodu na blockHandler (dg) je chyba
- v mnou použité verzi Texy 3.1.4. je chyba
Určité závěry mohu učinit již nyní:
- není – li $blocktype = ‚block/code‘ tak se vyhodí chyba, takže v blockHandleru, nebo v Texy je skoro určitě nějaká chyba
- ve vstupním textu podle návodu je použito /--code, což neumožňuje zadat jazyk ke zformátování, takže i zde to nebude správně
Neporadil by někdo, jak docílit správného formátování zdrojového kódu a označit příslušné jazyky např. php, html, css?
Dík předem za jakékoliv info.
Editoval m.brecher (20. 9. 2021 13:42)