Zpřehlednění výstupního XHTML
- pmg
- Člen | 372
Filtr se hodí, když debugujete výstup generovaný přes Nette\Web\Html.
/**
* Custom template filters.
*/
class CustomFilters
{
public static $tidyOptions = array(
'indent' => true,
'indent-spaces' => 2,
'output-xhtml' => true,
'preserve-entities' => true,
'input-encoding' => 'utf8',
'output-encoding' => 'utf8',
'char-encoding' => 'utf8',
'wrap' => 200,
);
public static function beautify(Template $template, $s)
{
return "<?php ob_start() ?>$s<?php CustomFilters::beautifyCb(ob_get_clean()) ?>"; // <?php
}
public static function beautifyCb($s)
{
$tidy = new tidy;
$tidy->parseString($s, self::$tidyOptions);
$tidy->cleanRepair();
echo $tidy;
}
}
Příklad použití:
/**
* Base class for all application presenters.
*/
abstract class BasePresenter extends /*Nette\Application\*/Presenter
{
public function templatePrepareFilters($template)
{
parent::templatePrepareFilters($template);
if (!Environment::isProduction()) {
$template->registerFilter('CustomFilters::beautify');
}
}
}
- Panda
- Člen | 569
romansklenar napsal(a):
No jo, ale co když nemáš na hostingu k dispozici php s knihovnou tidy?
Mělo by to být pouze pro účely ladění, na ostrém hostingu by to nemělo co dělat (zbytečné nároky na systém navíc). A aplikace se ladí převážně na localhostu, nebo na nějakém serveru v LANce (ať už virtuálním, nebo skutečném), tam by problém s rozšířením do PHP být neměl.
- romansklenar
- Člen | 655
Pardon, přehlíd jsem toto:
Filtr se hodí, když debugujete…
jinak: užitečný filtr, napsat si tidy jako filtr mě nenapadlo…
na osobních prezentacích a stránkách menšího charakteru bych se nebál ho
používat, pár kilo paměti navíc web o 15 stránkách server určitě
nepoloží a já mám radši spíš čitelný (klidně i roztaženější) kód
něž 50 řádkovou tabulku o 5 sloupcích v jednom řádku :)
- fiso
- Člen | 32
Ak z nejakého dôvodu nie je možné použiť tidy, tak môžete vyskúšať pretty_source
Spravil som aj jednoduchšiu jednosúborovú verziu pre PHP 5, kto má záujem, tak mi pošlite mail, alebo sa to pokúsim niekam vyvesiť.
- pmg
- Člen | 372
Na produkčním serveru by se hodilo z kódu odstranit bílé znaky a nepodmíněné komentáře, zvlášť pokud si výstup v presenteru kešujete.
Dobře si s patřičným nastavením počíná Texy, ale bohužel si neporadí s DOCTYPE. (I když – dala by se uměle přeskočit.) Neznáte na toto nějakou knihovnu?
Edit: Takhle jsem to kdysi zkoušel s Texy.
$texy = new Texy;
$allowed = array(
"script" => true,
"blocks" => true,
"block/default" => true,
"block/div" => true,
"html/tag" => true,
"html/comment" => false
);
// zakaž všechno, není-li určeno jinak
foreach($texy->allowed as $key => &$value) {
$value = isset($allowed[$key]) && $allowed[$key];
}
$texy->htmlOutputModule->indent = false;
$texy->process($xhtml);
Editoval pmg (14. 8. 2008 13:49)
- romansklenar
- Člen | 655
fiso: pěkné, opravdu. Rád bych se podíval i na tu jednosouborovou ‚compact‘ verzi pokud ji poskytneš :) Muzeš ji někam teda vyvěsit?
- fiso
- Člen | 32
Uložené je to tu: http://michal.sustr.sk/…tySource.zip
Treba sa vyhýbať takým (validným) html konštrukciám ako
<ul>
<li>raz
<li>dva
<li>tri
</ul>
a podobne, a bude to fungovať fajnovo. Prípadne vylepšenia/bugfixy mi kľudne pošli, budem vďačný.
Editoval fiso (18. 8. 2008 12:19)
- David Grudl
- Nette Core | 8218
Uvažuju, že do nové revize přidám podporu pro formátovaný výstup přes Html:
$el = Html::el('ul');
$el->create('li')->setText('one');
$el->create('li')->setText('two');
// echo with left indentation = 0
echo $el->render(0);
Vypíše:
<ul>
<li>one</li>
<li>two</li>
</ul>
- veena
- Člen | 98
David Grudl napsal(a):
Uvažuju, že do nové revize přidám podporu pro formátovaný výstup přes Html:
$el = Html::el('ul'); $el->create('li')->setText('one'); $el->create('li')->setText('two'); // echo with left indentation = 0 echo $el->render(0);
Vypíše:
<ul> <li>one</li> <li>two</li> </ul>
Co méně ukecaněji?
$el = Html::ul();
$el->li('one');
$el->li('two');
// echo with left indentation = 0
echo $el->render(0);
- morousej
- Člen | 18
veena napsal(a):
Co méně ukecaněji?
$el = Html::ul(); $el->li('one'); $el->li('two'); // echo with left indentation = 0 echo $el->render(0);
Ale pak nerozeznáš, zda nastavuješ atribut li, nebo nový element li… a nemyslím si, že by třídě Html prospěl seznam elementů, který by tohle vyřešil…