latte+javascript – syntax off je ignorován

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Zax
Člen | 370
+
0
-

Mám fakt zvláštní problém a je mi z nějakého důvodu dost blbý s tím lézt do úplně čistého fóra O_o ale tak co se dá dělat…

Vypadá to, že je asi nějaká chybka v latte, jinak nevím, jak si to vysvětlit. Fakt netuším kde je příčina..

Chci jednoduše nainkludovat všechny Javascripty, vytvořit z něj jeden a cachovat (neptejte se proč, s Nette si hraju a zkouším různé možnosti usnadnění práce). Mám tuto šablonu default.latte:

{contentType text/javascript}

{cache tags => [jsDefault]}

{include 'jquery.latte'}
{include 'netteAjax.latte'}
{include 'netteForms.latte'}
{include 'common.latte'}

{/cache}

Podšablony jsou originální jQuery, nette.ajax.js atd., akorát všechny mají na začátku navíc {syntax off}. „common.latte“ je pak soubor kam píšu svůj kód a ten používá {syntax asp}, ale to je v tuto chvíli irelevantní, neboť tak daleko se program ani nedostane.

„jquery.latte“ to schroustá v pohodě, ale zasekne se na „netteAjax.latte“

exception 'Nette\Latte\CompileException' with message 'Unknown macro {state} in .../Javascript/netteAjax.latte:470'

Zmíněný řádek vypadá takto:

}, {state: null});

Co to je?? {syntax off} jako najednou neplatí? Ale tak v pohodě, přidám mezeru před state a jedu dál. Stejná chyba se objevila ještě na dvou dalších místech.

Pak přišlo tohle:

Parse error: syntax error, unexpected '|', expecting T_STRING in /wwwroot/project/Web/Temp/cache/_Nette.FileTemplate/_Javascript.netteAjax.latte-12038062ed32c7b59d6e607e9b4b60c5.php on line 468

Mrknu do zdrojáků a čumím, že to přeložilo

return selector.replace(/[\!"#\$%&'\(\)\*\+,\.\/:;<=>\?@\[\\\]\^`\{\|\}~]/g, '\\$&');

na

return selector.replace(/[\!"#\$%&'\(\)\*\+,\.\/:;<=>\?@\[\\\]\^`\<?php echo Nette\Templating\Helpers::escapeHtml(\|\, ENT_NOQUOTES) ?>~]/g, '\\$&');

naprosto ignorujíc {syntax off}..

Spadne to se stejnou chybou i když v šabloně default.latte použiju jen

{contentType text/javascript}

{include 'netteAjax.latte'}

V tuto chvíli si říkám, že by to spíš chtělo najít příčinu, než se snažit odstraňovat následky. Zdá se, že tvrzení „Pokud Latte vypnete pomocí {syntax off}, mějte na paměti, že ho již zpátky nemůžete zapnout pomocí {/syntax}“ (https://latte.nette.org/cs/tags#…) tak úplně neplatí…

Používám Nette v2.1.1 a nette.ajax.js v1.2.2.

David Grudl
Nette Core | 8133
+
0
-

Izoluj nejmenší možný kód, kde se ta chyba projevuje.

Zax
Člen | 370
+
0
-

Našel jsem to, dělá to tento řádek:

div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',

Zjevně je to nějaký problém s HTML komentáři v kombinaci s include. Když mám

default.latte:

{contentType text/javascript}

{include 'netteAjax.latte'}

netteAjax.latte:

{syntax off}
<!-- -->
{\|\}

Tak to taky spadne. Ale pokud použiju jen

default.latte:

{contentType text/javascript}
{syntax off}
<!-- -->
{\|\}

tak se vypíše korektně

<!-- -->
{\|\}

Editoval Zax (8. 4. 2014 14:00)

David Grudl
Nette Core | 8133
+
0
-

{contentType javascript} je třeba uvést, pokud soubor není HTML.

Zax
Člen | 370
+
0
-

To mě taky napadlo, jenže po doplnění contentType do všech includovaných souborů to taky spadne

exception 'ErrorException' with message 'Possible problem: you are sending a HTTP header while already having some data in output buffer. Try OutputDebugger or start session earlier.' in phar:///wwwroot/Libs/Nette/nette.phar/Http/Response.php:53

K vyvolání této chyby stačí velice málo:

default.latte

{include 'test.latte'}

test.latte

{contentType text/javascript}

V podšabloně mi to prostě contentType nevezme.

Editoval Zax (8. 4. 2014 14:33)

David Grudl
Nette Core | 8133
+
0
-

Tam je takový trošku nešťastný trik, že to odesílá i Content-Type hlavičku. Použij jen {contentType javascript}.

Zax
Člen | 370
+
0
-

default.latte

{contentType text/javascript}

{cache tags => [jsDefault]}

{include 'jquery.latte'}
{include 'netteAjax.latte'}
{include 'netteForms.latte'}
{include 'common.latte'}

{/cache}

Ostatní šablony mají na začátku

{contentType javascript}

Funguje! Díky moc Davide, tohle by mě samotného nikdy nenapadlo.

kudlajz
Člen | 70
+
0
-