Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Template/Compiler/CodeScope.php
<?php

namespace XF\Template\Compiler;

use
XF\Template\Compiler;

use function
is_string;

class
CodeScope
{
    protected
$tempVarFormat = '$__compilerTemp';
    protected
$tempVarId = 1;

   
/**
     * @var \XF\Template\Compiler
     */
   
protected $compiler;

    protected
$output = [];
    protected
$varStack = [];
    protected
$inlinePending = [];
    protected
$indent = 1;

    public function
__construct($initialVar, Compiler $compiler)
    {
       
$this->varStack[] = $initialVar;
       
$this->compiler = $compiler;
    }

    public function
getOutput()
    {
       
$this->flushPending();
        return
$this->output;
    }

    public function
clearOutput()
    {
       
$this->flushPending();
       
$this->output = [];
    }

    public function
write($code)
    {
       
$this->flushPending();
       
$this->output[] = $this->indent() . $code;

        return
$this;
    }

    public function
inline($code)
    {
        if (
is_string($code) && $code != '')
        {
           
$this->inlinePending[] = $code;
        }

        return
$this;
    }

    public function
flushPending()
    {
        if (
$this->inlinePending)
        {
           
$code = $this->compiler->simplifyInlineCode(implode(' . ', $this->inlinePending));
           
$this->output[] = $this->indent() . $this->currentVar() . ' .= ' . $code . ';';
           
$this->inlinePending = [];
        }

        return
$this;
    }

    public function
currentVar()
    {
        return
$this->varStack[0];
    }

    public function
getTempVar()
    {
       
$name = $this->tempVarFormat . $this->tempVarId;
       
$this->tempVarId++;
        return
$name;
    }

    public function
pushTempVar($init = true)
    {
       
$var = $this->getTempVar();
       
$this->pushVar($var);
        if (
$init)
        {
           
$this->write("$var = '';");
        }

        return
$var;
    }

    public function
pushVar($var)
    {
       
$this->flushPending();

       
array_unshift($this->varStack, $var);
        return
$this;
    }

    public function
popVar()
    {
       
$this->flushPending();

        return
array_shift($this->varStack);
    }

    public function
indent()
    {
        return
str_repeat("\t", $this->indent);
    }

    public function
pushIndent()
    {
       
$this->flushPending();

       
$this->indent++;

        return
$this;
    }

    public function
popIndent()
    {
       
$this->flushPending();

       
$this->indent--;
        if (
$this->indent < 1)
        {
           
$this->indent = 1;
        }

        return
$this;
    }
}