Texy – chyby v ovladači blockHandler – pro zvýraznění kódu

m.brecher
Generous Backer | 735
+
+1
-

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)