/** * {_'something'} * {_'something: %foo', foo => 'bar'} * {_ foo => 'bar'}something %foo{/_} * {_ n => 55}%n message{_}%n messages{/_} */ public function macroTranslate(MacroNode $node, PhpWriter $writer) { $tokens = $writer->preprocess(); $msgTokens = new MacroTokens(); $argTokens = NULL; $currTokens = $msgTokens; while ($tokens->nextToken()) { if ($tokens->depth === 0) { if ($tokens->isCurrent('=>') && $argTokens === NULL) { $argTokens = $msgTokens; $msgTokens = NULL; } elseif ($tokens->isCurrent(',') && $argTokens === NULL) { $argTokens = new MacroTokens(); $currTokens = $argTokens; continue; } } $currTokens->append($tokens->currentToken()); } if ($node->parentNode && $node->parentNode->name == '_') { if (isset($node->parentNode->data->plural)) { throw new CompileException("Invalid plural form of {_} macro"); } $node->isEmpty = true; $node->parentNode->data->plural = true; return 'ob_start()'; } $msg = $msgTokens !== NULL ? trim($writer->quoteFilter($msgTokens)->joinAll()) : NULL; if ($msg == "") { $msg = NULL; } $args = 'array(' . ($argTokens !== NULL ? trim($writer->quoteFilter($argTokens)->joinAll()) . ', ' : '') . '\'__hint__\' => $template->getFile() . ":' . $this->compiler->getLine() . '")'; if ($node->closing) { if (isset($node->data->plural)) { return $writer->write('echo %modify($template->translate(array_reverse(array(ob_get_clean(), ob_get_clean())), ' . $args . '))'); } else { return $writer->write('echo %modify($template->translate(ob_get_clean(), ' . $args . '))'); } } elseif ($msg !== NULL) { $node->isEmpty = true; return $writer->write('echo %modify($template->translate(' . $msg . ', ' . $args . '))'); } else { return 'ob_start()'; } }
/** * {var ...} * {default ...} */ public function macroVar(MacroNode $node, PhpWriter $writer) { if ($node->args === '' && $node->parentNode && $node->parentNode->name === 'switch') { return '} else {'; } elseif ($node->name === 'assign') { trigger_error('Macro {assign} is deprecated; use {var} instead.', E_USER_DEPRECATED); } $var = TRUE; $tokens = $writer->preprocess(); $res = new Latte\MacroTokens(); while ($tokens->nextToken()) { if ($var && $tokens->isCurrent(Latte\MacroTokens::T_SYMBOL, Latte\MacroTokens::T_VARIABLE)) { if ($node->name === 'default') { $res->append("'" . ltrim($tokens->currentValue(), '$') . "'"); } else { $res->append('$' . ltrim($tokens->currentValue(), '$')); } $var = NULL; } elseif ($tokens->isCurrent('=', '=>') && $tokens->depth === 0) { $res->append($node->name === 'default' ? '=>' : '='); $var = FALSE; } elseif ($tokens->isCurrent(',') && $tokens->depth === 0) { $res->append($node->name === 'default' ? ',' : ';'); $var = TRUE; } elseif ($var === NULL && $node->name === 'default' && !$tokens->isCurrent(Latte\MacroTokens::T_WHITESPACE)) { throw new CompileException("Unexpected '" . $tokens->currentValue() . "' in {default {$node->args}}"); } else { $res->append($tokens->currentToken()); } } $out = $writer->quoteFilter($res)->joinAll(); return $node->name === 'default' ? "extract(array({$out}), EXTR_SKIP)" : $out; }