library/smarty/libs/sysplugins/smarty_internal_compile_extends.php
changeset 0 4869aea77e21
new file mode 100644
--- /dev/null
+++ b/library/smarty/libs/sysplugins/smarty_internal_compile_extends.php
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * Smarty Internal Plugin Compile extend
+ * Compiles the {extends} tag
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ * @author     Uwe Tews
+ */
+
+/**
+ * Smarty Internal Plugin Compile extend Class
+ *
+ * @package    Smarty
+ * @subpackage Compiler
+ */
+class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $required_attributes = array('file');
+    /**
+     * Attribute definition: Overwrites base class.
+     *
+     * @var array
+     * @see Smarty_Internal_CompileBase
+     */
+    public $shorttag_order = array('file');
+
+    /**
+     * Compiles code for the {extends} tag
+     *
+     * @param array $args array with attributes from parser
+     * @param object $compiler compiler object
+     *
+     * @return string compiled code
+     */
+    public function compile($args, $compiler) {
+        // check and get attributes
+        $_attr = $this->getAttributes($compiler, $args);
+        if ($_attr['nocache'] === true) {
+            $compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
+        }
+        if (strpos($_attr['file'], '$_tmp') !== false) {
+            $compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno);
+        }
+
+        $name = $_attr['file'];
+        /** @var Smarty_Internal_Template $_smarty_tpl
+         * used in evaluated code
+         */
+        $_smarty_tpl = $compiler->template;
+        eval("\$tpl_name = $name;");
+        // create template object
+        $_template = new $compiler->smarty->template_class($tpl_name, $compiler->smarty, $compiler->template);
+        // check for recursion
+        $uid = $_template->source->uid;
+        if (isset($compiler->extends_uid[$uid])) {
+            $compiler->trigger_template_error("illegal recursive call of \"$include_file\"", $compiler->lex->line - 1);
+        }
+        $compiler->extends_uid[$uid] = true;
+        if (empty($_template->source->components)) {
+            array_unshift($compiler->sources, $_template->source);
+        } else {
+            foreach ($_template->source->components as $source) {
+                array_unshift($compiler->sources, $source);
+                $uid = $source->uid;
+                if (isset($compiler->extends_uid[$uid])) {
+                    $compiler->trigger_template_error("illegal recursive call of \"{$source->filepath}\"", $compiler->lex->line - 1);
+                }
+                $compiler->extends_uid[$uid] = true;
+            }
+        }
+        unset ($_template);
+        $compiler->inheritance_child = true;
+        $compiler->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY);
+        return '';
+    }
+}