Latte makro: simulace chování s „inner-“
- Eda
- Backer | 220
Ahoj.
Potřebuju napsat n:makro, které i bez předpony -inner
bude
pracovat jen s vnitřním obsahem elementu.
Na co to potřebuju? Na makro n:translate
, které bez
-inner
nemá smysl. A to -inner
tam pokaždé psát
je otrava a není to hezké.
<h1 n:translate>stringId</h1>
vs.
<h1 n:inner-translate>stringId</h1>
Koukal jsem se na implementaci nettího makra translate, ta vypadá takto:
public function macroTranslate(MacroNode $node, PhpWriter $writer)
{
if ($node->closing) {
return $writer->write('echo %modify($template->translate(ob_get_clean()))');
} elseif ($node->isEmpty = ($node->args !== '')) {
return $writer->write('echo %modify($template->translate(%node.args))');
} else {
return 'ob_start()';
}
}
Zkoušel jsem si při zavírání makra dumpnout MacroNode, ale v contentu
je už celý obsah včetně krajních HTML značek
<h1>stringID</h1>
. Jak se dostanu k tomu vnitřnímu
obsahu elementu? Jde to vůbec nějak?
Díky :-)
- David Grudl
- Nette Core | 8228
V tuto chvíli jedině oddělit kraje regulárem https://github.com/…rmMacros.php#L194
- Eda
- Backer | 220
Ok, zatím mi z toho vyšla tato implementace.
public function macroTranslate(MacroNode $node, PhpWriter $writer)
{
if ($node->closing && !$node->isEmpty) {
preg_match('#^(.*? n:\w+>)(.*)(<[^?].*)\z#s', $node->content, $parts);
$node->content =
$parts[1] .
'<?php ob_start(); ?>' .
$parts[2] .
$writer->write('<?php echo %modify($template->translate(ob_get_clean())); ?>') .
$parts[3];
}
}
Na jednoduchých příkladech to funguje dobře, jindy ale narážím na to, že např makro n:inner-block se provede dřív, než mé translate. Tzn. pak se mi do bloku přiřadí jen stringId, nikoliv až jeho překlad. Tohle by šlo nějak řešit?