[2009-04-08] Změny chování CurlyBracketsFilter
- David Grudl
- Nette Core | 8227
Vylepšený context-aware escaping
Jakub Vrána mě upozornil, že Google kopíruje Nette :-)) a zavádí do šablon
context-aware escaping (kontextově sensitivní escapování), tedy jiné
escapování hodnot v HTML kódu a jiné v JavaScriptu a jiné v CSS. Googlí
řešení šlo ještě o něco dále a rozlišuje dokonce HTML atributy
style="..."
a (např.) onclick="..."
.
Tož jsem to naučil i CurlyBracketsFilter.
Vyhazování výjimky
Pokud vám na psaní šablon ve formátu CurlyBrackets vadí absence syntax highlightingu ve svém IDE, zkuste se podívat, jestli nemá podporu pro Smarty, ta má totiž syntax podobnou (v Nusphere PHPEd v Tools/Settings/Associations lze *.phtml přiřadit výhradně pro Smarty).
Nicméně chyby a překlepy se i tak docela špatně hledají. Když třeba
místo {/foreach}
napíšete {/forech}
, PHP oznámí
fatal error na konci souboru a těžko se zjišťuje důvod. Mimojiné
i z toho důvodu se od revize 265 vyhazuje při nalezení neexistujícího
makra výjimka.
Taková úprava má ale vedlejší efekt – téměř cokoliv mezi
složenýma závorkama je považováno za makro. Pokud jste se tedy
dosud nekoncepčně spoléhali na to, že např. makro alert
neexistuje a používali v kódu function() {alert('hello')}
, tak
teď to povede k výjimce Unknown CurlyBrackets macro
‚{alert('hello‘)}' in file ….
Aby řetězec nebyl považován za makro, musí za levou složenou závorkou následovat mezera nebo jednoduché či dvojité uvozovky.
Než nasadíte novou verzi do produkčního prostředí, zkuste prosím chování CurlyBrackets otestovat. Díky.
- David Grudl
- Nette Core | 8227
Víceméně to souvisí s tím tipem nechat si v phtml zvýrazňovat syntax pro CurlyBrackets (respektive Smarty). Pak by to kolidovalo s tím, že v cache-xxxx.phtml je zase potřeba zvýrazňovat normální PHP syntax.
- R2D2
- Člen | 22
Od této revize se mi projeví chyba v kódu typu:
<script>
alert({_"nějaký text"});
var x = "<span></span>";
alert({_"nějaký text"});
</script>
první překlad proběhne správně, text se dá do uvozovek a escapuje jako
js,
ale jakékoliv escapování po řádku s tagem span již nikoliv, tj úplně
stejný kód co před přiřazením fungoval najednou fungovat nebude –
kvůli nepřítomnosti uvozovek to hodí chybu. Takhle zjednodušeně ten
příklad možná vypadá divně, ale je to dle mého docela nepříjemné,
když člověk používá knihovnu třetí strany které jen během konfigurace
předává kus html pro vykreslování čehosi a díky tomu najednou
curlybrackets filter funguje odlišně před a po jednoduchém přiřazení.
Nebo je to očekávané chování a musí se tyto věci psát jinak?
- David Grudl
- Nette Core | 8227
V JavaScriptu uvnitř HTML stránky nemůže být použita sekvence
</
, je potřeba lomítko escapovat <\/
. Nebo
celý blok uzavřít do komentáře.
- David Grudl
- Nette Core | 8227
Teď jsem se díval, že Nette nepodporuje uzavření bloku do komentáře
(podpora chybí záměrně, způsobilo by to jiné komplikace). Takže jsem
filtr upravil (revize 299) a tvůj kód bude fungovat i bez escapování a
komentářů. Escapovat by bylo potřeba jedině v případě, že se v kódu
objeví přímo alert('</script>')
.
- David Grudl
- Nette Core | 8227
CSS jako takové má několik kontextů, které se ale (zatím) nerozlišují. Spíš se zeptám jinak – vadí escapovaná tečka nějakému prohlížeči?