Oznámení

Provoz fóra byl ukončen

Syntax highlighting /--- code php

před 9 lety

KoDeath
Člen | 1

Zdravím,
používám Texy! na svém webu bez nějakého většího RS. Texy se mi moc líbí a rád bych přes něj rozchodil i syntax highlighting přes /--- code php, což se mi moc nedaří. všude se dočítám, že mám k tomu použít přídavný modul, který však nemohu najít. pokud už tu nějaké takové téma je, tak se omlouvám, že zakládám nové. možná špatně hledám :) předem díky za rady

Editoval KoDeath (3. 2. 2011 1:27)

před 9 lety

Ondřej Mirtes
Člen | 1539

Ahoj,
na homepage mi funguje následující kód (využívá knihovnu FSHL):

$texy->addHandler('block', 'blockHandler');

function blockHandler($invocation, $blocktype, $content, $lang, $modifier)
{
    if ($blocktype !== 'block/code') {
        return $invocation->proceed();
    }

    $lang = strtoupper($lang);
    if ($lang == 'JAVASCRIPT') $lang = 'JS';

    $fshl = new fshlParser('HTML_UTF8', P_TAB_INDENT);
    if (!$fshl->isLanguage($lang)) {
        return $invocation->proceed();
    }

    $texy = $invocation->getTexy();
    $content = Texy::outdent($content);
    $content = $fshl->highlightString($lang, $content);
    $content = $texy->protect($content, Texy::CONTENT_BLOCK);

    $elPre = TexyHtml::el('pre');
    if ($modifier) $modifier->decorate($texy, $elPre);
    $elPre->attrs['class'] = strtolower($lang);

    $elCode = $elPre->create('code', $content);

    return $elPre;
}

Editoval Ondřej Mirtes (3. 2. 2011 20:28)

před 8 lety

toka
Člen | 251

Když už jsme u toho, snažím se HTML, které vytvoří Texy, předat knihovně mPDF, ale právě díky konstrukci <pre><code>....</code></pre> s tím mám problém. V PDF se objeví HTML kód všeho, co je mezi tagy <pre> a </pre>. Lze nějak tuto situaci řešit přímo v blockHandleru?

před 8 lety

toka
Člen | 251

Řešení jsem našel, ale nevím, jestli to je ono. Respektive to funguje, ale nevím, jestli je dobré to mít uzavřené v tagu <p>...</p>:

function blockHandler($invocation, $blocktype, $content, $lang, $modifier)
{
    if ($blocktype !== 'block/code') {
        return $invocation->proceed();
    }

    $lang = strtoupper($lang);
    if ($lang == 'JAVASCRIPT') $lang = 'JS';

    $parser = new fshlParser('HTML_UTF8', P_TAB_INDENT);
    if ((!$parser->isLanguage($lang)) && ($lang != '')) {
        return $invocation->proceed();
    }

    $content = Texy::outdent($content);
    $content = $parser->highlightString($lang, $content);
    $content = $this->protect(preg_replace('#\n#', '<br />', $content), Texy::CONTENT_BLOCK);

    $elPre = TexyHtml::el('p');
    if ($modifier) $modifier->decorate($this, $elPre);
    $elPre->attrs['class'] = strtolower($lang);

    $elCode = $elPre->create('code', $content);
    return $elPre;
}