/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (empty($options['allowRawStatements'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('x_tags_only_used_where_full_statements_allowed', array('tag' => 'callback'))); } if (empty($attributes['class'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'class', 'tag' => 'callback'))); } if (empty($attributes['method'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'method', 'tag' => 'callback'))); } $noEscapeOptions = array_merge($options, array('varEscape' => false)); $class = $compiler->compileAndCombineSegments($attributes['class'], $noEscapeOptions); $method = $compiler->compileAndCombineSegments($attributes['method'], $noEscapeOptions); $compiled = $compiler->compileIntoVariable($children, $var, $options); if (!empty($attributes['params'])) { $params = $compiler->compileAndCombineSegments($attributes['params'], $noEscapeOptions); } else { $params = 'array()'; } $statement = $compiler->getNewRawStatement(); $statement->addStatement($compiled); $statement->addStatement('$' . $compiler->getOutputVar() . ' .= $this->callTemplateCallback(' . $class . ', ' . $method . ', $' . $var . ', ' . $params . ");\n" . 'unset($' . $var . ");\n"); return $statement; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if ($tag == 'breadcrumb') { throw $compiler->getNewCompilerException(new XenForo_Phrase('breadcrumb_tag_must_be_within_navigation_tag')); } if (empty($options['allowRawStatements'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('x_tags_only_used_where_full_statements_allowed', array('tag' => 'navigation'))); } $rawStatement = $compiler->getNewRawStatement(); $rawStatement->addStatement("\$__extraData['navigation'] = array();\n"); foreach ($children as $child) { if ($compiler->isSegmentNamedTag($child, 'breadcrumb')) { if (isset($child['attributes']['source'])) { $sourceVar = $compiler->compileVarRef($child['attributes']['source'], $options); $rawStatement->addStatement('$__extraData[\'navigation\'] = XenForo_Template_Helper_Core::appendBreadCrumbs($__extraData[\'navigation\'], ' . $sourceVar . ");\n"); } else { $parts = array(); foreach ($child['attributes'] as $name => $value) { $parts[] = "'" . $compiler->escapeSingleQuotedString($name) . "' => " . $compiler->compileAndCombineSegments($value, $options); } $parts[] = "'value' => " . $compiler->compileAndCombineSegments($child['children'], $options); $rawStatement->addStatement('$__extraData[\'navigation\'][] = array(' . implode(', ', $parts) . ");\n"); } } else { if (is_string($child) && trim($child) === '') { // whitespace -- ignore it } else { throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_data_found_in_navigation_tag'), $child); } } } return $rawStatement; }
/** * Compiles the function call. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { $argc = count($arguments); if ($argc != 1 && $argc != 2) { throw $compiler->getNewCompilerArgumentException(); } if (empty($arguments[1])) { $arguments[1] = '0'; } return 'XenForo_Template_Helper_Core::numberFormat(' . $compiler->compileAndCombineSegments($arguments[0], array_merge($options, array('varEscape' => false))) . ', ' . $compiler->compileAndCombineSegments($arguments[1], array_merge($options, array('varEscape' => false))) . ')'; }
/** * Compiles the function call. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { $argc = count($arguments); if ($argc != 2 && $argc != 3) { throw $compiler->getNewCompilerArgumentException(); } $condition = $compiler->parseConditionExpression($arguments[0], $options); $true = $compiler->compileAndCombineSegments($arguments[1], $options); if (!isset($arguments[2])) { $arguments[2] = ''; } $false = $compiler->compileAndCombineSegments($arguments[2], $options); return '(' . $condition . ' ? (' . $true . ') : (' . $false . '))'; }
/** * Compile the function and return PHP handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { if (count($arguments) < 1) { throw $compiler->getNewCompilerArgumentException(); } $noEscapeOptions = array_merge($options, array('varEscape' => false)); $functionCompiled = $compiler->compileAndCombineSegments(array_shift($arguments), $noEscapeOptions); $outputArgs = array(); foreach ($arguments as $argument) { $outputArgs[] = $compiler->compileAndCombineSegments($argument, $noEscapeOptions); } $argumentsCompiled = $compiler->buildNamedParamCode($outputArgs); return 'XenForo_Template_Helper_Core::callHelper(' . $functionCompiled . ', ' . $argumentsCompiled . ')'; }
/** * Compile the function and return PHP handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { if (count($arguments) != 1) { throw $compiler->getNewCompilerArgumentException(); } return "XenForo_Template_Helper_Core::styleProperty(" . $compiler->compileAndCombineSegments($arguments[0], array_merge($options, array('varEscape' => false))) . ")"; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (empty($options['allowRawStatements'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('x_tags_only_used_where_full_statements_allowed', array('tag' => 'require'))); } $requirements = $compiler->getNamedAttributes($attributes, array('css', 'js')); if (!$requirements) { throw $compiler->getNewCompilerException(new XenForo_Phrase('require_tag_does_not_specify_any_known_types_css_or_js')); } if (isset($requirements['css'])) { $css = $requirements['css']; if (empty($css) || count($css) != 1 || !is_string($css[0])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('only_literal_css_templates_may_be_included_by_require_tag')); } if (substr($css[0], -4) != '.css') { throw $compiler->getNewCompilerException(new XenForo_Phrase('all_required_css_templates_must_end_in_')); } $requirements['css'][0] = substr($css[0], 0, -4); } $statement = $compiler->getNewRawStatement(); foreach ($requirements as $attribute => $value) { $statement->addStatement('$this->addRequiredExternal(\'' . $compiler->escapeSingleQuotedString($attribute) . '\', ' . $compiler->compileAndCombineSegments($value) . ");\n"); } return $statement; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (empty($attributes['url'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'url', 'tag' => 'formaction'))); } return 'XenForo_Template_Helper_Core::getHiddenInputsFromUrl(' . $compiler->compileAndCombineSegments($attributes['url'], $options) . ')'; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (empty($options['allowRawStatements'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('x_tags_only_used_where_full_statements_allowed', array('tag' => 'set'))); } if (empty($attributes['var'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'var', 'tag' => 'set'))); } $var = $compiler->compileVarRef($attributes['var'], array_merge($options, array('disableVarMap' => true))); $var = substr($var, 1); // need to take off leading $ if (empty($children)) { $children = null; } if (!empty($attributes['value'])) { if ($children) { throw $compiler->getNewCompilerException(new XenForo_Phrase('tag_contained_children_and_value_attribute')); } $value = $compiler->compileAndCombineSegments($attributes['value'], array_merge($options, array('varEscape' => false))); $childOutput = '$' . $var . ' = ' . $value . ";\n"; } else { $childOutput = $compiler->compileIntoVariable($children, $var, $options, false); } $statement = $compiler->getNewRawStatement(); $statement->addStatement($childOutput); return $statement; }
/** * Compile the var named in the first argument and return PHP code to access and urlencode it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { if (count($arguments) != 1) { throw $compiler->getNewCompilerArgumentException(); } return 'urlencode(' . $compiler->compileAndCombineSegments($arguments[0], array_merge($options, array('varEscape' => false))) . ')'; }
/** * Compiles the function call. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { $argc = count($arguments); if ($argc < 4) { throw $compiler->getNewCompilerArgumentException(); } $perPage = array_shift($arguments); $totalItems = array_shift($arguments); $page = array_shift($arguments); $linkType = array_shift($arguments); $data = 'false'; if (isset($arguments[0])) { $dataRef = array_shift($arguments); $data = $compiler->compileAndCombineSegments($dataRef, array_merge($options, array('varEscape' => false))); } $params = $compiler->getNamedParamsAsPhpCode($compiler->parseNamedArguments($arguments), array_merge($options, array('varEscape' => false))); $phpFunction = $function == 'adminpagenav' ? 'adminPageNav' : 'pageNav'; return 'XenForo_Template_Helper_Core::' . $phpFunction . '(' . $compiler->compileAndCombineSegments($perPage, $options) . ', ' . $compiler->compileAndCombineSegments($totalItems, $options) . ', ' . $compiler->compileAndCombineSegments($page, $options) . ', ' . $compiler->compileAndCombineSegments($linkType, $options) . ', ' . $data . ', ' . $params . ')'; }
/** * Compiles the function call. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { $argc = count($arguments); if ($argc != 1 && $argc != 2) { throw $compiler->getNewCompilerArgumentException(); } if (empty($arguments[1])) { $arguments[1] = ''; } switch ($function) { case 'date': case 'time': case 'datetime': $phpFunction = $function; break; default: $phpFunction = 'datetime'; } return 'XenForo_Template_Helper_Core::' . $phpFunction . '(' . $compiler->compileAndCombineSegments($arguments[0], array_merge($options, array('varEscape' => false))) . ', ' . $compiler->compileAndCombineSegments($arguments[1], array_merge($options, array('varEscape' => false))) . ')'; }
/** * Compiles the function call. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { $argc = count($arguments); if ($argc < 1) { throw $compiler->getNewCompilerArgumentException(); } $type = array_shift($arguments); $data = 'false'; if (isset($arguments[0])) { $dataRef = array_shift($arguments); $data = $compiler->compileAndCombineSegments($dataRef, array_merge($options, array('varEscape' => false))); } $params = $compiler->getNamedParamsAsPhpCode($compiler->parseNamedArguments($arguments), array_merge($options, array('varEscape' => false))); $phpFunction = $function == 'adminlink' ? 'adminLink' : 'link'; if ($options['varEscape'] != 'htmlspecialchars') { $varEscapeParam = ', ' . ($options['varEscape'] ? "'{$options['varEscape']}'" : 'false'); } else { $varEscapeParam = ''; } return 'XenForo_Template_Helper_Core::' . $phpFunction . "(" . $compiler->compileAndCombineSegments($type, $options) . ', ' . $data . ', ' . $params . $varEscapeParam . ')'; }
/** * Compile the var named in the first argument and return PHP code to access and escape it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { if (count($arguments) < 1) { throw $compiler->getNewCompilerArgumentException(); } $compileOptions = array_merge($options, array('varEscape' => false)); if (!empty($arguments[1])) { $doubleEncode = $compiler->parseConditionExpression($arguments[1], $options); } else { $doubleEncode = 'true'; } return 'htmlspecialchars(' . $compiler->compileAndCombineSegments($arguments[0], $compileOptions) . ', ENT_QUOTES, \'UTF-8\', ' . $doubleEncode . ')'; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (!empty($attributes['time'])) { $time = $compiler->compileVarRef($attributes['time'], $options); } else { if (!empty($children)) { $time = $compiler->compileAndCombineSegments($children, $options); } else { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'time', 'tag' => 'datetime'))); } } return 'XenForo_Template_Helper_Core::callHelper(\'datetimehtml\', array(' . $time . ',' . $compiler->getNamedParamsAsPhpCode($attributes, $options, array('code')) . '))'; }
/** * Compile the var named in the first argument and return PHP code to access it raw. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { if (count($arguments) > 2) { throw $compiler->getNewCompilerArgumentException(); } $compileOptions = array_merge($options, array('varEscape' => false)); $raw = $compiler->compileVarRef($arguments[0], $options); if (empty($arguments[1])) { return $raw; } else { return 'XenForo_Template_Helper_Core::rawCondition(' . $raw . ', ' . $compiler->compileAndCombineSegments($arguments[1], $compileOptions) . ')'; } }
/** * Compile the var named in the first argument and return PHP code to access and escape it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { if (count($arguments) < 1) { throw $compiler->getNewCompilerArgumentException(); } $compileOptions = array_merge($options, array('varEscape' => false)); if (!empty($arguments[1])) { $doubleEncode = $compiler->parseConditionExpression($arguments[1], $options); } else { $doubleEncode = 'true'; } // note: ISO-8859-1 is fine since we use UTF-8 and are only replacing basic chars return 'htmlspecialchars(' . $compiler->compileAndCombineSegments($arguments[0], $compileOptions) . ', ENT_COMPAT, \'ISO-8859-1\', ' . $doubleEncode . ')'; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { // user array if (!empty($attributes['user'])) { $user = $compiler->compileVarRef($attributes['user'], $options); } else { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'user', 'tag' => 'avatar'))); } // avatar image mode (span or img) if (isset($attributes['img'])) { $img = $compiler->parseConditionExpression($attributes['img'], $options); } else { $img = 'false'; } return 'XenForo_Template_Helper_Core::callHelper(\'avatarhtml\', array(' . $user . ',' . $img . ',' . $compiler->getNamedParamsAsPhpCode($attributes, $options, array('code')) . ',' . $compiler->compileAndCombineSegments($children, $options) . '))'; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { // user array if (!empty($attributes['user'])) { $user = $compiler->compileVarRef($attributes['user'], $options); unset($attributes['user']); } else { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_x_attribute_for_y_tag', array('attribute' => 'user', 'tag' => 'username'))); } if (!empty($attributes['rich'])) { $rich = $compiler->parseConditionExpression($attributes['rich'], $options); } else { $rich = 'false'; } unset($attributes['rich']); return 'XenForo_Template_Helper_Core::userNameHtml(' . $user . ',' . $compiler->compileAndCombineSegments($children, $options) . ',' . $rich . ',' . $compiler->getNamedParamsAsPhpCode($attributes, $options, array('code')) . ')'; }
/** * Compile the content in the first argument and escape it for JS based on the second. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the function called * @param array Arguments to the function (should have at least 1) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $function, array $arguments, array $options) { $argc = count($arguments); if ($argc != 1 && $argc != 2) { throw $compiler->getNewCompilerArgumentException(); } if (empty($arguments[1])) { $arguments[1] = 'double'; } if (!is_string($arguments[1])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('argument_must_be_string')); } switch ($arguments[1]) { case 'double': case 'single': break; default: throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_argument')); } return 'XenForo_Template_Helper_Core::jsEscape(' . $compiler->compileAndCombineSegments($arguments[0], $options) . ', \'' . $arguments[1] . '\')'; }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (empty($attributes['perpage'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'perpage', 'tag' => 'pagenav'))); } if (empty($attributes['total'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'total', 'tag' => 'pagenav'))); } if (empty($attributes['page'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'page', 'tag' => 'pagenav'))); } if (empty($attributes['link'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('missing_attribute_x_for_tag_y', array('attribute' => 'link', 'tag' => 'pagenav'))); } if (!empty($attributes['linkdata'])) { $linkData = $compiler->compileAndCombineSegments($attributes['linkdata'], array_merge($options, array('varEscape' => false))); } else { $linkData = 'false'; } if (!empty($attributes['unreadlink'])) { $unreadLink = $compiler->compileAndCombineSegments($attributes['unreadlink'], $options); } else { $unreadLink = 'false'; } if (!empty($attributes['linkparams'])) { $linkParams = $compiler->compileAndCombineSegments($attributes['linkparams'], array_merge($options, array('varEscape' => false))); } else { $linkParams = 'array()'; } if (!empty($attributes['options'])) { $tagOptions = $compiler->compileAndCombineSegments($attributes['options'], array_merge($options, array('varEscape' => false))); } else { $tagOptions = 'array()'; } $type = $tag == 'adminpagenav' ? 'admin' : 'public'; return 'XenForo_Template_Helper_Core::callHelper(\'pagenavhtml\', array(' . '\'' . $type . '\', ' . $compiler->compileAndCombineSegments($attributes['perpage'], $options) . ', ' . $compiler->compileAndCombineSegments($attributes['total'], $options) . ', ' . $compiler->compileAndCombineSegments($attributes['page'], $options) . ', ' . $compiler->compileAndCombineSegments($attributes['link'], $options) . ', ' . $linkData . ', ' . $linkParams . ', ' . $unreadLink . ', ' . $tagOptions . '))'; }
/** * Compiles the standard data and removes it from the optional extra data for * use as separate arguments. * * @param XenForo_Template_Compiler * @param array Options for the compiler * @param array Row options. Will be modified by reference. * @param array Control options. Will be modified by reference. * * @return array Standardized data (label, name, value) */ protected function _compileStandardData(XenForo_Template_Compiler $compiler, array $compilerOptions, array &$rowOptions, array &$controlOptions = array()) { if (isset($rowOptions['label'])) { $label = $rowOptions['label']; unset($rowOptions['label']); } else { $label = ''; } if (isset($controlOptions['name'])) { $name = $controlOptions['name']; unset($controlOptions['name']); } else { $name = ''; } if (isset($controlOptions['value'])) { $value = $controlOptions['value']; unset($controlOptions['value']); } else { $value = ''; } return array('label' => $compiler->compileAndCombineSegments($label, $compilerOptions), 'name' => $compiler->compileAndCombineSegments($name, $compilerOptions), 'value' => $compiler->compileAndCombineSegments($value, $compilerOptions)); }
/** * Compile the specified tag and return PHP code to handle it. * * @param XenForo_Template_Compiler The invoking compiler * @param string Name of the tag called * @param array Attributes for the tag (may be empty) * @param array Nodes (tags/curlies/text) within this tag (may be empty) * @param array Compilation options * * @return string */ public function compile(XenForo_Template_Compiler $compiler, $tag, array $attributes, array $children, array $options) { if (empty($options['allowRawStatements'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('x_tags_only_used_where_full_statements_allowed', array('tag' => 'include'))); } if (empty($attributes['template']) || count($attributes['template']) != 1 || !is_string($attributes['template'][0])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_template_include_specified')); } $include = $attributes['template'][0]; $template = $compiler->includeParsedTemplate($include); $statement = $compiler->getNewRawStatement(); $tempVars = array(); $mapVars = array(); foreach ($children as $child) { if ($compiler->isSegmentNamedTag($child, 'map')) { $childAttr = $child['attributes']; if (empty($childAttr['from']) || empty($childAttr['to'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('included_template_variable_mappings_must_include_from_and_to_attributes')); } $from = $compiler->compileVarRef($childAttr['from'], $options); if (count($childAttr['to']) != 1 || !is_string($childAttr['to'][0])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_template_include_variable_mapping_specified')); } if (!preg_match('#^\\$([a-zA-Z_][a-zA-Z0-9_]*)$#', $childAttr['to'][0])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_template_include_variable_mapping_specified')); } // "from $outer" and "to $inner"; when processed (within inner template), need to map the other direction. $mapVars[substr($childAttr['to'][0], 1)] = substr($from, 1); } else { if ($compiler->isSegmentNamedTag($child, 'set')) { // take var as "to" and compile into a temporary variable $childAttr = $child['attributes']; if (empty($childAttr['var'])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('included_template_variable_assignments_must_include_var_attribute')); } if (count($childAttr['var']) != 1 || !is_string($childAttr['var'][0])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_template_include_variable_assignment_specified')); } $mapRegex = '#^\\$([a-zA-Z_][a-zA-Z0-9_]*)$#'; if (!preg_match($mapRegex, $childAttr['var'][0])) { throw $compiler->getNewCompilerException(new XenForo_Phrase('invalid_template_include_variable_assignment_specified')); } if (!empty($childAttr['value'])) { if ($child['children']) { throw $compiler->getNewCompilerException(new XenForo_Phrase('tag_contained_children_and_value_attribute')); } $value = $compiler->compileAndCombineSegments($childAttr['value'], array_merge($options, array('varEscape' => false))); $setVar = $compiler->getUniqueVar(); $childOutput = '$' . $setVar . ' = ' . $value . ";\n"; } else { $childOutput = $compiler->compileIntoVariable($child['children'], $setVar, $options); } $statement->addStatement($childOutput); $mapVars[substr($childAttr['var'][0], 1)] = $setVar; $tempVars[] = $setVar; } } } if ($template) { $oldMap = $compiler->getVariableMap(); $compiler->setVariableMap($mapVars, true); $compiled = $compiler->compileIntoVariable($template, $var, $options); $tempVars[] = $var; $compiler->setVariableMap($oldMap); $statement->addStatement($compiled); $statement->addStatement('$' . $compiler->getOutputVar() . ' .= $' . $var . ";\n" . 'unset($' . implode(', $', $tempVars) . ");\n"); return $statement; } else { return ''; } }