Jak rozchodit Texy + FSHL v Nette
- toka
- Člen | 253
Jak „rozchodit“ Texy a FSHL v Nette
Hledal jsem a na fóru jsem nějaké postupy našel, ale nic uceleného – nic na co by se mohl kupříkladu začátečník podívat a rozjet Texy a FSHL. Z tohoto důvodu jsem se rozhodl podělit o svůj postup, jak jsem Texy a FSHL rozjel. Netvrdím a neříkám, že je to postup 100% správný a jediný, proto bych případně rád od „místních guru“ nějaké doporučení.
Do libs
je potřeba nahrát obsah texy
a
fshl
, zde si je najde RobotLoader
. Pro správnou
funkci FSHL je nutné do Texy zaregistrovat obslužný handler. Podle mne je
nejlepší např. v components
vytvořit soubor
fshlTexy.php
s následujícím obsahem:
<?php
class fshlTexy extends Texy {
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;
}
}
BasePresenter.php
upravit např. následovně:
<?php
abstract class BasePresenter extends Presenter {
// ---------------------------------------------------------------------------
public $oldLayoutMode = FALSE;
public $oldModuleMode = FALSE;
// ---------------------------------------------------------------------------
protected function startup() {
parent::startup();
}
// ---------------------------------------------------------------------------
protected function createTemplate() {
// texy
$texy = new fshlTexy();
$texy->encoding = 'utf-8';
$texy->allowedTags = Texy::NONE;
$texy->allowedStyles = Texy::NONE;
$texy->setOutputMode(Texy::HTML5);
$texy->addHandler('block', array($texy, 'blockHandler'));
$template = parent::createTemplate();
// helper
$template->registerHelper('texy', callback($texy, 'process'));
return $template;
}
// ---------------------------------------------------------------------------
protected function beforeRender() {
$this->template->viewName = $this->view;
$a = strrpos($this->name, ':');
if($a === FALSE) {
$this->template->moduleName = '';
$this->template->presenterName = $this->name;
} else {
$this->template->moduleName = substr($this->name, 0, $a + 1);
$this->template->presenterName = substr($this->name, $a + 1);
}
}
// ---------------------------------------------------------------------------
public function templatePrepareFilters($template) {
parent::templatePrepareFilters($template);
// texy
TemplateFilters::$texy = new Texy();
TemplateFilters::$texy->encoding = 'utf-8';
TemplateFilters::$texy->allowedTags = Texy::NONE;
TemplateFilters::$texy->allowedStyles = Texy::NONE;
TemplateFilters::$texy->setOutputMode(Texy::HTML5);
// filter
$template->registerFilter('TemplateFilters::texyElements');
}
}
Jedině, kde jsem zaznamenal problém, byla kolize tříd v adresářích
lang
a fshl_cache
– nakopíroval jsem celý
adresář fshl
z ukázky syntax highlighting
, který
je v Texy
. Soubory z lang
stačí smazat,
v adresáři fshl_cache
musí zůstat, aby vše fungovalo
jak má.
Poslední krok – přidání CSS stylu do šablony:
<link rel="stylesheet" href="{$baseUri}css/COHEN_style.css" media="screen" type="text/css" />
Očekávám jakékoliv připomínky typu „jak to udělat lépe“, „co je na tom špatně“. Díky :-)
Editoval toka (5. 7. 2010 14:33)