19 static public $SCAN_PATTERN_NAMESPACEDECLARATION =
'/(?<!\\\\){namespace\\s*(?P<identifier>[a-zA-Z]+[a-zA-Z0-9]*)\\s*=\\s*(?P<phpNamespace>(?:[A-Za-z0-9\.]+|Tx)(?:LEGACY_NAMESPACE_SEPARATOR\\w+|FLUID_NAMESPACE_SEPARATOR\\w+)+)\\s*}/m';
36 (?: <\\/? # Start dynamic tags 37 (?:(?:NAMESPACE):[a-zA-Z0-9\\.]+) # A tag consists of the namespace prefix and word characters 38 (?: # Begin tag arguments 39 \\s*[a-zA-Z0-9:-]+ # Argument Keys 41 (?> # either... If we have found an argument, we will not back-track (That does the Atomic Bracket) 42 "(?:\\\\"|[^"])*" # a double-quoted string 43 |\'(?:\\\\\'|[^\'])*\' # or a single quoted string 45 )* # Tag arguments can be replaced many times. 49 |(?: # Start match CDATA section 50 <!\\[CDATA\\[.*?\\]\\]> 58 ^< # A Tag begins with < 59 (?P<NamespaceIdentifier>NAMESPACE): # Then comes the Namespace prefix followed by a : 60 (?P<MethodIdentifier> # Now comes the Name of the ViewHelper 63 (?P<Attributes> # Begin Tag Attributes 64 (?: # A tag might have multiple attributes 66 [a-zA-Z0-9:-]+ # The attribute name 68 (?> # either... # If we have found an argument, we will not back-track (That does the Atomic Bracket) 69 "(?:\\\\"|[^"])*" # a double-quoted string 70 |\'(?:\\\\\'|[^\'])*\' # or a single quoted string 73 )* # A tag might have multiple attributes 74 ) # End Tag Attributes 76 (?P<Selfclosing>\\/?) # A tag might be selfclosing 91 (?P<Argument> # The attribute name 95 (?> # If we have found an argument, we will not back-track (That does the Atomic Bracket) 96 (?P<ValueQuoted> # either... 97 (?:"(?:\\\\"|[^"])*") # a double-quoted string 98 |(?:\'(?:\\\\\'|[^\'])*\') # or a single quoted string 116 { # Start of shorthand syntax 117 (?: # Shorthand syntax is either composed of... 118 [a-zA-Z0-9\\->_:,.()] # Various characters 119 |"(?:\\\\"|[^"])*" # Double-quoted strings 120 |\'(?:\\\\\'|[^\'])*\' # Single-quoted strings 121 |(?R) # Other shorthand syntaxes inside, albeit not in a quoted string 124 } # End of shorthand syntax 136 ^{ # Start of shorthand syntax 137 # A shorthand syntax is either... 138 (?P<Object>[a-zA-Z0-9\\-_.]*) # ... an object accessor 139 \\s*(?P<Delimiter>(?:->)?)\\s* 141 (?P<ViewHelper> # ... a ViewHelper 142 [a-zA-Z0-9]+ # Namespace prefix of ViewHelper (as in $SCAN_PATTERN_TEMPLATE_VIEWHELPERTAG) 144 [a-zA-Z0-9\\.]+ # Method Identifier (as in $SCAN_PATTERN_TEMPLATE_VIEWHELPERTAG) 145 \\( # Opening parameter brackets of ViewHelper 146 (?P<ViewHelperArguments> # Start submatch for ViewHelper arguments. This is taken from $SCAN_PATTERN_SHORTHANDSYNTAX_ARRAYS 148 \\s*[a-zA-Z0-9\\-_]+ # The keys of the array 149 \\s*:\\s* # Key|Value delimiter : 150 (?: # Possible value options: 151 "(?:\\\\"|[^"])*" # Double qouoted string 152 |\'(?:\\\\\'|[^\'])*\' # Single quoted string 153 |[a-zA-Z0-9\\-_.]+ # variable identifiers 154 |{(?P>ViewHelperArguments)} # Another sub-array 155 ) # END possible value options 156 \\s*,? # There might be a , to separate different parts of the array 157 )* # The above cycle is repeated for all array elements 158 ) # End ViewHelper Arguments submatch 159 \\) # Closing parameter brackets of ViewHelper 161 (?P<AdditionalViewHelpers> # There can be more than one ViewHelper chained, by adding more -> and the ViewHelper (recursively) 174 (?P<NamespaceIdentifier>[a-zA-Z0-9]+) # Namespace prefix of ViewHelper (as in $SCAN_PATTERN_TEMPLATE_VIEWHELPERTAG) 176 (?P<MethodIdentifier>[a-zA-Z0-9\\.]+) 177 \\( # Opening parameter brackets of ViewHelper 178 (?P<ViewHelperArguments> # Start submatch for ViewHelper arguments. This is taken from $SCAN_PATTERN_SHORTHANDSYNTAX_ARRAYS 180 \\s*[a-zA-Z0-9\\-_]+ # The keys of the array 181 \\s*:\\s* # Key|Value delimiter : 182 (?: # Possible value options: 183 "(?:\\\\"|[^"])*" # Double qouoted string 184 |\'(?:\\\\\'|[^\'])*\' # Single quoted string 185 |[a-zA-Z0-9\\-_.]+ # variable identifiers 186 |{(?P>ViewHelperArguments)} # Another sub-array 187 ) # END possible value options 188 \\s*,? # There might be a , to separate different parts of the array 189 )* # The above cycle is repeated for all array elements 190 ) # End ViewHelper Arguments submatch 191 \\) # Closing parameter brackets of ViewHelper 202 (?P<Recursion> # Start the recursive part of the regular expression - describing the array syntax 203 { # Each array needs to start with { 204 (?P<Array> # Start submatch 206 \\s*[a-zA-Z0-9\\-_]+ # The keys of the array 207 \\s*:\\s* # Key|Value delimiter : 208 (?: # Possible value options: 209 "(?:\\\\"|[^"])*" # Double qouoted string 210 |\'(?:\\\\\'|[^\'])*\' # Single quoted string 211 |[a-zA-Z0-9\\-_.]+ # variable identifiers 212 |(?P>Recursion) # Another sub-array 213 ) # END possible value options 214 \\s*,? # There might be a , to separate different parts of the array 215 )* # The above cycle is repeated for all array elements 216 ) # End array submatch 217 } # Each array ends with } 225 (?P<ArrayPart> # Start submatch 226 (?P<Key>[a-zA-Z0-9\\-_]+) # The keys of the array 227 \\s*:\\s* # Key|Value delimiter : 228 (?: # Possible value options: 229 (?P<QuotedString> # Quoted string 230 (?:"(?:\\\\"|[^"])*") 231 |(?:\'(?:\\\\\'|[^\'])*\') 233 |(?P<VariableIdentifier>[a-zA-Z][a-zA-Z0-9\\-_.]*) # variable identifiers have to start with a letter 234 |(?P<Number>[0-9.]+) # Number 235 |{\\s*(?P<Subarray>(?:(?P>ArrayPart)\\s*,?\\s*)+)\\s*} # Another sub-array 236 ) # END possible value options 237 ) # End array part submatch 251 'f' =>
'TYPO3\\CMS\\Fluid\\ViewHelpers' 280 self::$SCAN_PATTERN_NAMESPACEDECLARATION = str_replace(
282 'LEGACY_NAMESPACE_SEPARATOR',
283 'FLUID_NAMESPACE_SEPARATOR' 289 self::$SCAN_PATTERN_NAMESPACEDECLARATION
324 public function parse($templateString) {
325 if (!is_string($templateString)) {
326 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Parse requires a template string as argument, ' . gettype($templateString) .
' given.', 1224237899);
333 $parsingState = $this->
buildObjectTree($splitTemplate, self::CONTEXT_OUTSIDE_VIEWHELPER_ARGUMENTS);
335 $variableContainer = $parsingState->getVariableContainer();
336 if ($variableContainer !== NULL && $variableContainer->exists(
'layoutName')) {
337 $parsingState->setLayoutNameNode($variableContainer->get(
'layoutName'));
340 return $parsingState;
358 $this->namespaces = array(
359 'f' =>
'TYPO3\\CMS\\Fluid\\ViewHelpers' 373 preg_match_all(self::$SCAN_PATTERN_XMLNSDECLARATION, $templateString, $matches, PREG_SET_ORDER);
374 foreach ($matches as $match) {
376 if ($match[
'identifier'] ===
'f') {
379 if (array_key_exists($match[
'identifier'], $this->namespaces)) {
380 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(sprintf(
'Namespace identifier "%s" is already registered. Do not re-declare namespaces!', $match[
'identifier']), 1331135889);
382 if (isset($this->settings[
'namespaces'][$match[
'xmlNamespace']])) {
383 $phpNamespace = $this->settings[
'namespaces'][$match[
'xmlNamespace']];
385 $matchedPhpNamespace = array();
386 if (preg_match(self::$SCAN_PATTERN_DEFAULT_XML_NAMESPACE, $match[
'xmlNamespace'], $matchedPhpNamespace) === 0) {
389 $phpNamespace = str_replace(
'/',
'\\', $matchedPhpNamespace[
'PhpNamespace']);
391 $this->namespaces[$match[
'identifier']] = $phpNamespace;
394 preg_match_all(self::$SCAN_PATTERN_NAMESPACEDECLARATION, $templateString, $matches, PREG_SET_ORDER);
395 foreach ($matches as $match) {
396 if (array_key_exists($match[
'identifier'], $this->namespaces)) {
397 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(sprintf(
'Namespace identifier "%s" is already registered. Do not re-declare namespaces!', $match[
'identifier']), 1224241246);
399 $this->namespaces[$match[
'identifier']] = $match[
'phpNamespace'];
401 if ($matches !== array()) {
402 $templateString = preg_replace(self::$SCAN_PATTERN_NAMESPACEDECLARATION,
'', $templateString);
405 return $templateString;
416 return preg_split($regularExpression, $templateString, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
431 $state = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\ParsingState');
432 $rootNode = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\RootNode');
433 $state->setRootNode($rootNode);
434 $state->pushNodeToStack($rootNode);
436 foreach ($splitTemplate as $templateElement) {
437 $matchedVariables = array();
438 if (preg_match(self::$SCAN_PATTERN_CDATA, $templateElement, $matchedVariables) > 0) {
440 } elseif (preg_match($regularExpression_openingViewHelperTag, $templateElement, $matchedVariables) > 0) {
441 $this->
openingViewHelperTagHandler($state, $matchedVariables[
'NamespaceIdentifier'], $matchedVariables[
'MethodIdentifier'], $matchedVariables[
'Attributes'], ($matchedVariables[
'Selfclosing'] ===
'' ? FALSE : TRUE));
442 } elseif (preg_match($regularExpression_closingViewHelperTag, $templateElement, $matchedVariables) > 0) {
449 if ($state->countNodeStack() !== 1) {
450 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Not all tags were closed!', 1238169398);
470 $node = $state->popNodeFromStack();
487 if (!array_key_exists($namespaceIdentifier, $this->namespaces)) {
488 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Namespace could not be resolved. This exception should never be thrown!', 1224254792);
490 $viewHelper = $this->objectManager->get($this->
resolveViewHelperName($namespaceIdentifier, $methodIdentifier));
491 $this->viewHelperNameToImplementationClassNameRuntimeCache[$namespaceIdentifier][$methodIdentifier] = get_class($viewHelper);
494 $expectedViewHelperArguments = $viewHelper->prepareArguments();
499 $currentViewHelperNode = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\ViewHelperNode', $viewHelper, $argumentsObjectTree);
501 $state->getNodeFromStack()->addChildNode($currentViewHelperNode);
503 if ($viewHelper instanceof \
TYPO3\CMS\
Fluid\Core\ViewHelper\Facets\ChildNodeAccessInterface && !($viewHelper instanceof \
TYPO3\CMS\
Fluid\Core\ViewHelper\Facets\CompilableInterface)) {
504 $state->setCompilable(FALSE);
508 if ($viewHelper instanceof \
TYPO3\CMS\
Fluid\Core\ViewHelper\Facets\PostParseInterface) {
511 call_user_func(array($viewHelper,
'postParseEvent'), $currentViewHelperNode, $argumentsObjectTree, $state->getVariableContainer());
516 $state->pushNodeToStack($currentViewHelperNode);
528 $expectedArgumentNames = array();
529 foreach ($expectedArguments as $expectedArgument) {
530 $expectedArgumentNames[] = $expectedArgument->getName();
533 foreach ($actualArguments as $argumentName => $_) {
534 if (!in_array($argumentName, $expectedArgumentNames)) {
535 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Argument "' . $argumentName .
'" was not registered.', 1237823695);
548 $actualArgumentNames = array_keys($actualArguments);
549 foreach ($expectedArguments as $expectedArgument) {
550 if ($expectedArgument->isRequired() && !in_array($expectedArgument->getName(), $actualArgumentNames)) {
551 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Required argument "' . $expectedArgument->getName() .
'" was not supplied.', 1237823699);
564 foreach ($argumentDefinitions as $argumentName => $argumentDefinition) {
565 if ($argumentDefinition->getType() ===
'boolean' && isset($argumentsObjectTree[$argumentName])) {
566 $argumentsObjectTree[$argumentName] = new \TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\BooleanNode($argumentsObjectTree[$argumentName]);
579 if (isset($this->viewHelperNameToImplementationClassNameRuntimeCache[$namespaceIdentifier][$methodIdentifier])) {
580 $name = $this->viewHelperNameToImplementationClassNameRuntimeCache[$namespaceIdentifier][$methodIdentifier];
582 $explodedViewHelperName = explode(
'.', $methodIdentifier);
584 if (count($explodedViewHelperName) > 1) {
585 $className = implode($namespaceSeparator, array_map(
'ucfirst', $explodedViewHelperName));
587 $className = ucfirst($explodedViewHelperName[0]);
589 $className .=
'ViewHelper';
590 $name = $this->namespaces[$namespaceIdentifier] . $namespaceSeparator . $className;
609 if (!array_key_exists($namespaceIdentifier, $this->namespaces)) {
610 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Namespace could not be resolved. This exception should never be thrown!', 1224256186);
612 $lastStackElement = $state->popNodeFromStack();
613 if (!($lastStackElement instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\ViewHelperNode)) {
614 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'You closed a templating tag which you never opened!', 1224485838);
616 if ($lastStackElement->getViewHelperClassName() != $this->
resolveViewHelperName($namespaceIdentifier, $methodIdentifier)) {
617 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Templating tags not properly nested. Expected: ' . $lastStackElement->getViewHelperClassName() .
'; Actual: ' . $this->
resolveViewHelperName($namespaceIdentifier, $methodIdentifier), 1224485398);
636 $viewHelperString .= $additionalViewHelpersString;
637 $numberOfViewHelpers = 0;
641 if (strlen($delimiter) === 0 && strlen($viewHelperString) > 0) {
642 $viewHelperString = $objectAccessorString . $viewHelperString;
643 $objectAccessorString =
'';
648 if (strlen($viewHelperString) > 0 && preg_match_all(self::$SPLIT_PATTERN_SHORTHANDSYNTAX_VIEWHELPER, $viewHelperString, $matches, PREG_SET_ORDER) > 0) {
650 foreach (array_reverse($matches) as $singleMatch) {
651 if (strlen($singleMatch[
'ViewHelperArguments']) > 0) {
656 $arguments = array();
659 $numberOfViewHelpers++;
664 if (strlen($objectAccessorString) > 0) {
666 $node = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\ObjectAccessorNode', $objectAccessorString);
669 $state->getNodeFromStack()->addChildNode($node);
673 for ($i=0; $i<$numberOfViewHelpers; $i++) {
674 $node = $state->popNodeFromStack();
688 if ($this->configuration !== NULL) {
693 $interceptors = $this->configuration->getInterceptors($interceptionPoint);
694 if (count($interceptors) > 0) {
695 foreach ($interceptors as $interceptor) {
696 $node = $interceptor->process($node, $interceptionPoint, $state);
711 foreach ($arguments as $argumentName => $argumentValue) {
712 if (!($argumentValue instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\AbstractNode)) {
713 $arguments[$argumentName] = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\TextNode', (
string) $argumentValue);
729 $argumentsObjectTree = array();
731 if (preg_match_all(self::$SPLIT_PATTERN_TAGARGUMENTS, $argumentsString, $matches, PREG_SET_ORDER) > 0) {
733 $this->configuration = NULL;
734 foreach ($matches as $singleMatch) {
735 $argument = $singleMatch[
'Argument'];
739 $this->configuration = $configurationBackup;
741 return $argumentsObjectTree;
755 if (strpos($argumentString,
'{') === FALSE && strpos($argumentString,
'<') === FALSE) {
756 return $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\TextNode', $argumentString);
759 $rootNode = $this->
buildObjectTree($splitArgument, self::CONTEXT_INSIDE_VIEWHELPER_ARGUMENTS)->getRootNode();
773 switch ($quotedValue[0]) {
775 $value = str_replace(
'\\"',
'"', preg_replace(
'/(^"|"$)/',
'', $quotedValue));
778 $value = str_replace(
"\\'",
"'", preg_replace(
'/(^\'|\'$)/',
'', $quotedValue));
781 $value = $quotedValue;
783 return str_replace(
'\\\\',
'\\', $value);
795 return str_replace(
'NAMESPACE', implode(
'|', array_keys($this->namespaces)), $regularExpression);
809 $sections = preg_split($this->
prepareTemplateRegularExpression(self::$SPLIT_PATTERN_SHORTHANDSYNTAX), $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
811 foreach ($sections as $section) {
812 $matchedVariables = array();
813 if (preg_match(self::$SCAN_PATTERN_SHORTHANDSYNTAX_OBJECTACCESSORS, $section, $matchedVariables) > 0) {
814 $this->
objectAccessorHandler($state, $matchedVariables[
'Object'], $matchedVariables[
'Delimiter'], isset($matchedVariables[
'ViewHelper']) ? $matchedVariables[
'ViewHelper'] :
'', isset($matchedVariables[
'AdditionalViewHelpers']) ? $matchedVariables[
'AdditionalViewHelpers'] :
'');
815 } elseif ($context === self::CONTEXT_INSIDE_VIEWHELPER_ARGUMENTS && preg_match(self::$SCAN_PATTERN_SHORTHANDSYNTAX_ARRAYS, $section, $matchedVariables) > 0) {
817 $this->
arrayHandler($state, $matchedVariables[
'Array']);
833 $state->getNodeFromStack()->addChildNode(
834 $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\ArrayNode', $this->recursiveArrayHandler($arrayText))
854 if (preg_match_all(self::$SPLIT_PATTERN_SHORTHANDSYNTAX_ARRAY_PARTS, $arrayText, $matches, PREG_SET_ORDER) > 0) {
855 $arrayToBuild = array();
856 foreach ($matches as $singleMatch) {
857 $arrayKey = $singleMatch[
'Key'];
858 if (!empty($singleMatch[
'VariableIdentifier'])) {
859 $arrayToBuild[$arrayKey] = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\ObjectAccessorNode', $singleMatch[
'VariableIdentifier']);
860 } elseif (array_key_exists(
'Number', $singleMatch) && (!empty($singleMatch[
'Number']) || $singleMatch[
'Number'] ===
'0')) {
861 $arrayToBuild[$arrayKey] = floatval($singleMatch[
'Number']);
862 } elseif ((array_key_exists(
'QuotedString', $singleMatch) && !empty($singleMatch[
'QuotedString']))) {
863 $argumentString = $this->
unquoteString($singleMatch[
'QuotedString']);
865 } elseif (array_key_exists(
'Subarray', $singleMatch) && !empty($singleMatch[
'Subarray'])) {
866 $arrayToBuild[$arrayKey] = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\ArrayNode', $this->
recursiveArrayHandler($singleMatch[
'Subarray']));
868 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'This exception should never be thrown, as the array value has to be of some type (Value given: "' . var_export($singleMatch, TRUE) .
'"). Please post your template to the bugtracker at forge.typo3.org.', 1225136013);
871 return $arrayToBuild;
873 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'This exception should never be thrown, there is most likely some error in the regular expressions. Please post your template to the bugtracker at forge.typo3.org.', 1225136014);
885 $node = $this->objectManager->get(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\TextNode', $text);
888 $state->getNodeFromStack()->addChildNode($node);
static $SCAN_PATTERN_SHORTHANDSYNTAX_OBJECTACCESSORS
parseArguments($argumentsString)
arrayHandler(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $arrayText)
static $SPLIT_PATTERN_TAGARGUMENTS
rewriteBooleanNodesInArgumentsObjectTree($argumentDefinitions, &$argumentsObjectTree)
const INTERCEPT_CLOSING_VIEWHELPER
buildObjectTree($splitTemplate, $context)
textAndShorthandSyntaxHandler(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $text, $context)
postProcessArgumentsForObjectAccessor(array $arguments)
extractNamespaceDefinitions($templateString)
callInterceptor(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\NodeInterface &$node, $interceptionPoint, \TYPO3\CMS\Fluid\Core\Parser\ParsingState $state)
static $SCAN_PATTERN_SHORTHANDSYNTAX_ARRAYS
resolveViewHelperName($namespaceIdentifier, $methodIdentifier)
textHandler(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $text)
static $SCAN_PATTERN_TEMPLATE_CLOSINGVIEWHELPERTAG
recursiveArrayHandler($arrayText)
abortIfRequiredArgumentsAreMissing($expectedArguments, $actualArguments)
static $SCAN_PATTERN_NAMESPACEDECLARATION
initializeViewHelperAndAddItToStack(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $namespaceIdentifier, $methodIdentifier, $argumentsObjectTree)
static getClassNameForAlias($alias)
const CONTEXT_OUTSIDE_VIEWHELPER_ARGUMENTS
static $SCAN_PATTERN_TEMPLATE_VIEWHELPERTAG
const NAMESPACE_SEPARATOR
openingViewHelperTagHandler(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $namespaceIdentifier, $methodIdentifier, $arguments, $selfclosing)
const INTERCEPT_OPENING_VIEWHELPER
objectAccessorHandler(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $objectAccessorString, $delimiter, $viewHelperString, $additionalViewHelpersString)
static $SPLIT_PATTERN_TEMPLATE_DYNAMICTAGS
buildArgumentObjectTree($argumentString)
static $SCAN_PATTERN_XMLNSDECLARATION
static $SPLIT_PATTERN_SHORTHANDSYNTAX
static $SCAN_PATTERN_CDATA
splitTemplateAtDynamicTags($templateString)
unquoteString($quotedValue)
closingViewHelperTagHandler(\TYPO3\CMS\Fluid\Core\Parser\ParsingState $state, $namespaceIdentifier, $methodIdentifier)
abortIfUnregisteredArgumentsExist($expectedArguments, $actualArguments)
static $SCAN_PATTERN_DEFAULT_XML_NAMESPACE
prepareTemplateRegularExpression($regularExpression)
const INTERCEPT_OBJECTACCESSOR
injectSettings(array $settings)
static $SPLIT_PATTERN_SHORTHANDSYNTAX_ARRAY_PARTS
const LEGACY_NAMESPACE_SEPARATOR
$viewHelperNameToImplementationClassNameRuntimeCache
setConfiguration(\TYPO3\CMS\Fluid\Core\Parser\Configuration $configuration=NULL)
const CONTEXT_INSIDE_VIEWHELPER_ARGUMENTS
static $SPLIT_PATTERN_SHORTHANDSYNTAX_VIEWHELPER