Zpřehlednění výstupního XHTML

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

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');
		}
	}

}
romansklenar
Člen | 655
+
0
-

No jo, ale co když nemáš na hostingu k dispozici php s knihovnou tidy?

Panda
Člen | 569
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

romansklenar napsal(a):

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?

V pondelok by som už mal mať nejaký vlastný priestor… ak to nestačí dovtedy, tak napíš mail.

fiso
Člen | 32
+
0
-

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)

pmg
Člen | 372
+
0
-

fiso

Pěkný kód! Jen pozor, že v šabloně se kód musí vypsat.

<?php echo PrettySource::parse(ob_get_clean()) ?>

Zkusil jsem třídu použít pro opačný účel;-) Stačí nastavit $tagsIndentAfter a $tagsBreak na prázdné pole. Perfektní!

fiso
Člen | 32
+
0
-

pmg

Chybička se vloudila :) Opravené.

David Grudl
Nette Core | 7829
+
0
-

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
+
0
-

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
+
0
-

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…