Makro nemůže mít počáteční a atributouvou část najednou

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

Když se podívám na API Nette\Latte\Macros\MacroSet::addMacro(), má tato metoda 4 parametry. Pokud je makro použito jako atribut, tj. n:macro, mají jednotlivé parametry tento význam:

  • $name – název makra
  • $begin – kód vložený před HTML tag (např. if)
  • $end – kód vložený za HTML tag (např. endif)
  • $attr – kód vložený dovnitř HTML tagu (generování atributů)

Problém nastal když jsem napsal makro obsahující všechny tyto části:

/**
 * @static
 * @param Nette\Latte\Compiler $compiler
 */
	public static function install(Compiler $compiler)
	{
		$me->addMacro('shref', array($me, 'macroSecuredLinkStart'), 'endif', array($me, 'macroSecuredLinkAttr'));
	}

	public function macroSecuredLinkStart(\Nette\Latte\MacroNode $node, \Nette\Latte\PhpWriter $writer)
	{
		return $writer->write('$_link = $_control->link(%node.word, %node.array?); if ($_presenter->isLinkAvailable()):');
	}

	public function macroSecuredLinkAttr(\Nette\Latte\MacroNode $node, \Nette\Latte\PhpWriter $writer)
	{
		return $writer->write(' ?> href="<?php echo %escape(%modify($_link)) ?>"<?php ');
	}

Bohužel pokud je definovaná atributová část a makro je použito v n:macro formě, počáteční a koncová se vynechají. Problém je v této funkci, makro by totiž potřebovalo jak if tak else větev.

Zkusil jsem druhou část vybalit z toho else, aby se prováděla vždy. Po spuštění testů jsem ale zjistil, že některá makra toto chování naopak vyžadují, např. makro {input}.

Je možné přidat i podporu pro možnost kterou potřebuji? Má smysl abych připravil pull request?