Latte makro: simulace chování s „inner-“

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

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

V tuto chvíli jedině oddělit kraje regulárem https://github.com/…rmMacros.php#L194

Eda
Backer | 220
+
0
-

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?