Signalizace, který druh Context-Aware Escapingu se má použít
- DefenestrationPraha
- Člen | 120
Velice se mi líbí přístup Latte, které zjišťuje, v jakém kontextu se pohybuje, a escapuje podle toho řetězce apod. Například nachází-li se ve <script>, postupuje v souladu s pravidly JavaScriptu.
Považoval bych ale za skvělé, kdyby bylo možno toto chování explicitně předepsat nějakou značkou na začátku template. Důvod? Inkludované šablony a možnost vkládat správně formátované kusy skriptu do jiných šablon pomocí proměnných.
Mám třeba poměrně složitou komponentu, která zobrazuje DataTables, a její součástí je <script>, který je různě konfigurovatelný zvenčí. Některé funkce se do něj doplňují za běhu podle konkrétní instance a vytvářím si je pomocí jiných šablon a proměnných, které pak vložím do nadřazeného skriptu coby proměnnou. V současné době ale musím i v těch pomocných šablonách mít <script></script>, aby Latte poznalo, že má obsah formátovat jako JavaScript, a teprve před vložením vzniklého kódu ten <script> ze začátku a </script> z konce odmažu.
Kdybych mohl hned v hlavičce té pomocné šablony říci „escapuj celý obsah této šablony jako JavaScript“, bylo by to skvělé.
- Kamil Valenta
- Člen | 815
Ale v jedné šabloně se mohou vystřídat různé kontexty, ne vždy to
bude jednotné.
Proč je potřeba z „vnitřní“ šablony odmazávat <script> a
</script>, stejně pak ty značky musí být v té „vnější“
šabloně?
Dává větší smysl, aby šablona sama o sobě poskytovala celý, funkční kód. A člověk si nemusel pamatovat, do jakého kontextu je potřeba ji includovat.
- Marek Bartoš
- Nette Blogger | 1263
{contentType javascript}
nefunguje?
https://latte.nette.org/cs/tags#…
Imho by ale bylo lepší se tomu vyhnout, IDE a další nástroje .latte souboru obsahujícímu js bez <script> nebudou rozumět
Editoval Marek Bartoš (31. 5. 2023 9:14)
- DefenestrationPraha
- Člen | 120
Kamil Valenta napsal(a):
Ale v jedné šabloně se mohou vystřídat různé kontexty, ne vždy to bude jednotné.
Proč je potřeba z „vnitřní“ šablony odmazávat <script> a </script>, stejně pak ty značky musí být v té „vnější“ šabloně?Dává větší smysl, aby šablona sama o sobě poskytovala celý, funkční kód. A člověk si nemusel pamatovat, do jakého kontextu je potřeba ji includovat.
Protože ten zformátovaný kus se vkládá dovnitř jiného již existujícího <script></script>, ve kterém jsou nějaké společné funkce a k nim jen doplňuji další funkci podle potřeby. Myslím si, že tyhle značky ne-nestují.
- DefenestrationPraha
- Člen | 120
Marek Bartoš napsal(a):
{contentType javascript}
nefunguje?
https://latte.nette.org/cs/tags#…Imho by ale bylo lepší se tomu vyhnout, IDE a další nástroje .latte souboru obsahujícímu js bez <script> nebudou rozumět
Fíha, tak to jsem nenašel. Což je možná dáno tím, že to v dokumentaci k Context-Sensitive Escaping není zmíněno.
https://latte.nette.org/en/safety-first#…
S tím, že IDE občas nepochopí, co dělám, jsem se bohužel smířil … mám třeba situaci, že tentýž adresář se společnými třídami je pomocí symlinku propojen do několika naráz otevřených projektů a PhpStorm je tím dost iritován; hlásí vícenásobné definice těch samých tříd.
S tímhle konkrétně by si ale mohl poradit Latte plugin, ne?
- Kamil Valenta
- Člen | 815
DefenestrationPraha napsal(a):
Protože ten zformátovaný kus se vkládá dovnitř jiného již existujícího <script></script>, ve kterém jsou nějaké společné funkce a k nim jen doplňuji další funkci podle potřeby. Myslím si, že tyhle značky ne-nestují.
<script>
function spolecna1() {
}
function spolecna2() {
}
</script>
{include js1.latte}
{include js2.latte}
js1.latte
<script>
function zridkaPouzivana1() {
}
</script>
- DefenestrationPraha
- Člen | 120
Kamil Valenta napsal(a):
DefenestrationPraha napsal(a):
Protože ten zformátovaný kus se vkládá dovnitř jiného již existujícího <script></script>, ve kterém jsou nějaké společné funkce a k nim jen doplňuji další funkci podle potřeby. Myslím si, že tyhle značky ne-nestují.
<script> function spolecna1() { } function spolecna2() { } </script> {include js1.latte} {include js2.latte}
js1.latte
<script> function zridkaPouzivana1() { } </script>
Hm, ono je to spíš jinak. Tohle by šlo, kdyby ty funkce byly na sobě nezávislé, ale nejsou.
<script>
object = new DataTable() {
// Značně komplikovaná definice datové tabulky, která má asi deset povinných a dvacet volitelných položek...
// Společné prvky jsou definovány zde ...
{if !empty($poskrabej_se_za_uchem)}
poskrabejsezauchem: {$poskrabej_se_za_uchem},
{/if}
</script>
No, a většina tabulek se za uchem neškrábe, ale některé jo, a ty definice, které přijdou do $poskrabej_se_za_uchem, jsou velmi různorodé. Proto je formátuji dle potřeby speciálními šablonami.