latte+javascript – syntax off je ignorován
- Zax
- Člen | 370
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.
- Zax
- Člen | 370
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)
- Zax
- Člen | 370
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 | 8218
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
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.