/** @c pluralize filter. */ public function handleFPluralize(TemplateCompilerEx $compiler, TemplateNodeEx $node, &$filter, array &$args) { $singularSuffix = ''; $pluralSuffix = 's'; if (isset($args[0])) { $compiler->raiseIf($args[0][0] != 'string', $node, 'Filter "pluralize" does not support variable/numeric suffix argument', TemplateError::E_INVALID_ARGUMENT); $suffixes = TemplateUtils::split(',', mb_substr($args[0][1], 1, -1)); if ($suffixes[1] == '') { $pluralSuffix = $suffixes[0]; } else { list($singularSuffix, $pluralSuffix) = $suffixes; } $singularSuffix = TemplateUtils::escape($singularSuffix); $pluralSuffix = TemplateUtils::escape($pluralSuffix); } return '((%s)>1?\'' . $pluralSuffix . '\':\'' . $singularSuffix . '\')'; }
/** Handles filter chains. Wraps given code, and returns new one. @param[in] $node Filter chain source node @param[in] $filterExpr Filter chain expression (e.g. a|b|c:d) @param[in] $code Code to wrap in filters @return New code that uses filters */ public function parseFilterChain(TemplateNodeEx $node, $filterExpr, $code) { $filterChain = TemplateUtils::splitEscaped('|', $filterExpr); $resultCode = $code; // Hook-point: parseFilterChain:entry $this->runHooks('parseFilterChain:entry', array(&$filterChain)); // foreach ($filterChain as &$filter) { list($name, $args) = TemplateUtils::split(':', $filter); if ($args) { $args = TemplateUtils::splitEscaped(',', $args); } else { $args = array(); } foreach ($args as &$arg) { if (mb_substr($arg, 0, 1) == '"') { $arg = array('string', '\'' . TemplateUtils::escape(mb_substr($arg, 1, -1)) . '\''); } elseif (preg_match('~^\\-?[0-9]+(?:\\.[0-9]+)?$~', $arg)) { $arg = array('number', $arg); } else { list($code, ) = $this->parseVariableExpression($node, $arg); $arg = array('variable', '@' . $code); } } $filterInfo = $this->commonVerifyElement($node, 'filter', $name, $args); $filterCode = call_user_func_array($filterInfo['handler'], array($this, $node, &$name, &$args)); $resultCode = sprintf($filterCode, $resultCode); } return $resultCode; }
/** Tests the behaviour of @ref TemplateUtils::escape. */ public function testUtilsEscape() { $this->assertEquals('\\\'', TemplateUtils::escape('\'')); $this->assertEquals('\'."\\n".\'', TemplateUtils::escape("\n")); $this->assertEquals('\'."\\t".\'', TemplateUtils::escape("\t")); $this->assertEquals('\'."\\r".\'', TemplateUtils::escape("\r")); }