/** * Return compiled PHP code for a handlebars token * * @param array<string,array|string|integer> $context current compile context * @param array<string,array|boolean> $info parsed information * * @return string Return compiled code segment for the token */ protected static function compileToken(&$context, $info) { list($raw, $vars, $token, $indent) = $info; $context['tokens']['partialind'] = $indent; $context['currentToken'] = $token; // Do not touch the tag, keep it as is. if ($raw === -1) { return ".'" . Token::toString($token) . "'."; } if ($ret = static::operator($token[Token::POS_OP], $context, $vars)) { return $ret; } if (isset($vars[0][0])) { if ($ret = static::customHelper($context, $vars, $raw)) { return $ret; } if ($vars[0][0] === 'else') { return static::doElse($context); } if ($vars[0][0] === 'lookup') { return static::compileLookup($context, $vars, $raw); } } return static::compileVariable($context, $vars, $raw); }
/** * Collect handlebars usage information, detect template error. * * @param string[] $token detected handlebars {{ }} token * @param array<string,array|string|integer> $context current compile context */ protected static function token(&$token, &$context) { $context['currentToken'] =& $token; if (static::rawblock($token, $context)) { return Token::toString($token); } if (static::delimiter($token, $context)) { return; } if (static::isDelimiter($context)) { static::spacing($token, $context); return; } if (static::comment($token, $context)) { static::spacing($token, $context); return; } list($raw, $vars) = Parser::parse($token, $context); $partials = static::partialBlock($context, $vars); $partials = static::inlinePartial($context, $vars) || $partials; if ($partials) { $context['stack'] = array_slice($context['stack'], 0, -4); $context['currentToken'][Token::POS_LOTHER] = ''; $context['currentToken'][Token::POS_LSPACE] = ''; return; } // Handle spacing (standalone tags, partial indent) static::spacing($token, $context, ($token[Token::POS_OP] === '' || $token[Token::POS_OP] === '&') && (!$context['flags']['else'] || !isset($vars[0][0]) || $vars[0][0] !== 'else') || $context['flags']['nostd'] > 0); if (static::operator($token[Token::POS_OP], $context, $vars)) { return isset($token[Token::POS_BACKFILL]) ? null : array($raw, $vars); } if (count($vars) == 0) { return $context['error'][] = 'Wrong variable naming in ' . Token::toString($token); } if (!isset($vars[0])) { return $context['error'][] = 'Do not support name=value in ' . Token::toString($token) . ', you should use it after a custom helper.'; } $context['usedFeature'][$raw ? 'raw' : 'enc']++; foreach ($vars as $var) { if (!isset($var[0]) || $var[0] === 0) { if ($context['level'] == 0) { $context['usedFeature']['rootthis']++; } $context['usedFeature']['this']++; } } if (!isset($vars[0][0])) { return array($raw, $vars); } if ($vars[0][0] === 'else' && $context['flags']['else']) { static::doElse($context, $vars); return array($raw, $vars); } if (!static::helper($context, $vars[0][0])) { static::lookup($context, $vars); static::log($context, $vars); } return array($raw, $vars); }