[2009-04-08] Změny chování CurlyBracketsFilter

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 7769
+
0
-

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.

stpnkcrk
Generous Backer | 185
+
0
-

Paráda, paráda, paráda! Díky Davide! :)

Trošku OT: Co vedlo ke změně přípony template-cache souborů z .phtml na .php?

nAS
Člen | 277
+
0
-

skocourek napsal(a):

Trošku OT: Co vedlo ke změně přípony template-cache souborů z .phtml na .php?

Vygenerované soubory už obsahují přímé PHP a ne šablony, takže .php je IMHO mnohem vhodnější.

David Grudl
Nette Core | 7769
+
0
-

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

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

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

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>').

crempa
Člen | 198
+
0
-

jen dotaz, proc se v CSS escapuje tecka?
pokud mam neco jako

<?php
$contentHeight = '25.3em';
?>

v sablone pak

style="height: {$contentHeight}"

tak ve vystupu je treba

style="height: 25\.3em"

Diky

David Grudl
Nette Core | 7769
+
0
-

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?