Signalizace, který druh Context-Aware Escapingu se má použít

DefenestrationPraha
Člen | 110
+
0
-

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

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 | 1175
+
+4
-

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

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

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

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

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.