Jak rozchodit Texy + FSHL v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
toka
Člen | 253
+
0
-

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)