Kosmetické HTML
V některých rodinách panuje zvyk před odjezdem na dovolenou celý byt vygruntovat. Proč? To kdyby se k nim vloupal zloděj, aby si nepomyslel něco špatného. Do stejného pytle patří kodéři puntičkářsky dbající na vzhled HTML kódu jejich stránek. To aby se jejich kód snáze vykrádal, aby je lepič na Webtrhu nepomluvil.
Sám jsem děsný perfekcionista. Takže mě žralo, že hezky naformátovaná PHP šablona:
<?php
$items = array('user', 'see', 'too');
?>
<ul>
<?php foreach ($items as $item): ?>
<li><?php echo htmlSpecialChars($item) ?>
<?php endforeach ?>
</ul>
generuje ošklivý HTML kód:
<ul>
<li>user <li>see <li>too</ul>
Jak už asi víte, v Nette Framework lze ekvivalentní šablonu zapsat pomocí přehlednějšího Curly Brackets filtru:
<ul>
{foreach $items as $item}
<li>{$item}
{/foreach}
</ul>
Filtr má v sobě zabudovanou kosmetickou drobnost – podle určité heuristiky se snaží učinit perfekcionistické duši za dost. A vygeneruje tento výstup:
<ul>
<li>user
<li>see
<li>too
</ul>
Já vím, pro mnohé z vás je to detail, ale pro nás chronické puntičkáře zásadní feature ;)
p.s. jsou situace, kdy jde o velmi praktickou vlastnost, pokud třeba generujete plain text nebo Texy kód, kde na formátování a správném odřádkování hodně záleží
p.s.s. tahle feature má nulový vliv na rychlost generování stránky
Komentáře
Ondřej Mirtes #1
Moc hezké, něco takového jsem vždycky chtěl :o)
Ještě jsem plánoval nadhodit feature request – aby řádek ve zdrojáku šablony = řádek v cacheované verzi (s čistým PHP). Nette hlásí totiž chybu právě v té cacheované verzi a člověk se, aby chybu odhalil, musí koukat do ní, protože počty řádků těch dvou souborů nesouhlasí.
David Grudl #2
#1 Ondřeji Mirtesi, tohle udělat nejde. Ale novinkou jedné z posledních revizí je výrazné zčitelnění generovaných šablon.
Martin Hassman #3
Supr, šablonovací systém, který tohle neumí by vůbec neprošel mým vstupním filtrem.
Jakub Vrána #4
Zrovna teď v sobotu jsem na to taky narazil, když jsem výstup Adminera změnil z XHTML na HTML. Přemýšlel jsem, že bych u té příležitosti nechal HTML kód při kompilaci i komprimovat (protože by to ušetřilo pár bajtů ve výsledném souboru a posílaných stránkách), ale přehlednost kódu je pro mě i v tomto případě přednější.
Při generování plain-textu by na formátování HTML podle mě záležet vůbec nemělo, převaděč by se měl orientovat výhradně podle značek.
Tomáš #5
Proč vůbec nechávat HTML kód tak dobře čitelný? Mně by se třeba líbil při debugu hezky odsazený kód, ale v ostré verzi nějaká zkompresovaná verze a pokud by se zmenšily i CSS a javascript, tak by podle mně byl i při pomalejším připojení poznat rozdíl.
veena #6
Dar přítele johna https://web.archive.org/…etty_source/
Pavol #7
Keď sme pritom puňtičkárení, je škoda, že v Nette\Web\Html nie je možné nastaviť, aby HTML atribúty boli obalené apostrofom namiesto dvojitých úvodzoviek.
Teraz mám v šablónach apostrofy, ale formuláre používajú dvojité úvodzovky. To je škaredý mix ☹
Tomáš Fejfar #8
Tak to je davide opravdu killer feature. Tohle mi dycky děsně pije krev. To se snad pokusim naforkovat ten tvůj view na ZF :P
MichaL #9
Ja to resim tim, ze si vystup z view prozenu Tidy.
ic #10
V (x)html ‚všechno co mohlo být vykradeno, už bylo vykradeno‘.
Neříkám javascript, a v budoucnu zase html5 tam to hrozí, ale dneska je v tomhle moři bezvětří.
Čuga #11
Mám
šlo by, aby při vyhodnocení podmínky na false nevypisoval prázdný řádek???
Messa #12
#4 Jakube Vráno, podíval jsem se na pár diffů – bez ukončovacích tagů má kód vypadat lépe? 🙂
Jakub Vrána #13
Proč to nejde? Podle mě by to jít mělo, ale možná jsem něco přehlédl a nechce se mi to zkoušet implementovat jenom proto, abych na konci zjistil, že to opravdu nejde.
Taky je otázka, jak moc užitečné by sjednocení řádek bylo. Jestli by se kvůli tomu vyplatilo do vygenerovaného kódu přidat třeba
echo "\n"
.Jakub Vrána #14
#12 Messo, Ukončovací tagy jsem odstranil kvůli zmenšení velikosti. V HTML nejsou všechny ukončovací tagy potřeba a protože se Adminer posílá s
Content-Type: text/html
, tak jsem je vyhodil. Přehlednost to podle mě nijak nezhoršilo, ale nebylo cílem ji ani zlepšit.Uvažoval jsem o odstranění ukončení řádek, které by z kódu udělalo teprve tu správnou kaši 🙂.
Petr #15
Pěkné. Díky.
johno #16
#6 veeno, Jojo, to je stare a uz to nevyvyjam, a ten kod tiez ziadna slava. Hold ucime sa cely zivot.
David Grudl #17
#16 johno, jakmile si to při pohledu na svůj pár let starý kód přestaneš myslet, tak jsi na konci programátorského vývoje.
jinak teda holt 🙂
Inza #18
Prostě geniální Davide;-) – Nette je zase o krok dál;-)…
Jod #19
Paráda ! :)
Ondřej Mirtes #20
Koukám, že revize 450 asi přinesla to, po čem jsem toužil :)
LM #21
#20 Ondřeji Mirtesi, Tohle jsou ale chyby které vznikají při kompilaci šablony, pokud bude chyba ve vygenerovaném PHP, tak to bude stále hlásit chybu v cache.
Martin #22
#5 Tomáši, Pridávam hlas ku kompresii výstupu. Nech to v debug mode takto krásne uprace, ak je však web v ostrej prevádzke – vymazanie prázdnych miest skráti výstupný kód o par % …
pachollini #23
Ať žije Vojtěch Steklač.
Lukáš Satin #24
Pro všechny puntičkáře stačí php-tidy (používám). Jinak šablonu mi takhle zarovná přímo NetBeans i phpEclipse. Na kompresi doporučuji gzip či mod_deflate.
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.