Ejemplo n.º 1
0
 /**
  * {_'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()';
     }
 }
Ejemplo n.º 2
0
 /**
  * {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;
 }