Vlastní implicitní escapování

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

Zdravím ve spolek,
normálně používám fórum jako readonly, ale teď jsem se nějak zasekla a tak jsem se odhodlala, že vyzkouším na vlastní kůži sílu legendární nette komunity (-;

Používám Latte na generování jiného souboru, než je HTML/JS/CSS (konkrétně zdroják pro sazbu v LaTeXu). Takže bych si potřebovala vytvořit jiné dafault makro na escapování. Jak to udělám nejlíp/nejhezčejc/nejsprávnějc?

Předem díky za podpověď!
Žirafka

EDIT: Tak nakonec jsme metodou pokus omyl zjistili, že funguje toto:

<?php
NLatteMacros::$defaultMacros['$'] = '<?php echo %:macroDollar% ?>';
?>

Ale nemělo by náhodou fungovat i toto?

<?php
$latteFilter->escape = "myEscapeFunction";
$latteFilter->context = NLatteFilter::CONTEXT_NONE;
?>

Editoval zirafka (8. 3. 2011 13:43)

Jan Tvrdík
Nette guru | 2595
+
0
-

zirafka napsal(a):

Ale nemělo by náhodou fungovat i toto?

<?php
$latteFilter->escape = "myEscapeFunction";
$latteFilter->context = NLatteFilter::CONTEXT_NONE;
?>

Ne, nemělo. $latteFilter->escape a $latteFilter->context jsou pomocné funkce, jejichž hodnota se přepíná za chodu. Udržují aktuální kontext a aktuální funkci použitou pro escapování.

zirafka
Člen | 12
+
0
-

Díky za odpověď.

<?php
NLatteMacros::$defaultMacros['$'] = '<?php echo myEscapeFunction(%:macroDollar%) ?>';
?>

je tedy nejčistší cesta, jak to udělat, nebo to jde i elegantněji?

Jan Tvrdík napsal(a):

zirafka napsal(a):

Ale nemělo by náhodou fungovat i toto?

<?php
$latteFilter->escape = "myEscapeFunction";
$latteFilter->context = NLatteFilter::CONTEXT_NONE;
?>

Ne, nemělo. $latteFilter->escape a $latteFilter->context jsou pomocné funkce, jejichž hodnota se přepíná za chodu. Udržují aktuální kontext a aktuální funkci použitou pro escapování.

Jan Tvrdík
Nette guru | 2595
+
0
-

Tak jsem se na to díval ještě jednou a viděl bych to asi takto: LaTeX je z pohledu Nette kontext, takže ideální by bylo nadefinovat nový typ kontextu, což ale pořádně nejde, protože by to vyžadovalo podědit LatteFilter (to jde) a změnit private metody na protected (to vyžaduje pull request do Nette). Pokud se rozhodneš netvořit si vlastní kontext (což bude výrazně jednodušší), tak stačí pomocí makra {contentType latex} (uvedeného na začátku šablony) resetovat kontext na NONE a následně přeregistrovat helper escape v šabloně pomocí $tpl->registerHelper('escape', myEscapeFunction').