xref: /template/strap/ComboStrap/Template.php (revision 1fa8c418ed5809db58049141be41b7738471dd32)
137748cd8SNickeau<?php
237748cd8SNickeau
337748cd8SNickeau
437748cd8SNickeaunamespace ComboStrap;
5*1fa8c418SNickeauuse Psr\Log\LogLevel;
6*1fa8c418SNickeau
737748cd8SNickeau/**
837748cd8SNickeau * Class Template
937748cd8SNickeau * @package ComboStrap
1037748cd8SNickeau * https://stackoverflow.com/questions/17869964/replacing-string-within-php-file
1137748cd8SNickeau */
1237748cd8SNickeauclass Template
1337748cd8SNickeau{
1437748cd8SNickeau
1537748cd8SNickeau    const VARIABLE_PREFIX = "$";
16*1fa8c418SNickeau    const VARIABLE_PATTERN_CAPTURE_VARIABLE = "/(\\" . self::VARIABLE_PREFIX . "[\w]*)/im";
17*1fa8c418SNickeau    const VARIABLE_PATTERN_CAPTURE_NAME = "/\\" . self::VARIABLE_PREFIX . "([\w]*)/im";
18*1fa8c418SNickeau
1937748cd8SNickeau    protected $_string;
2037748cd8SNickeau    protected $_data = array();
2137748cd8SNickeau
2237748cd8SNickeau    public function __construct($string = null)
2337748cd8SNickeau    {
2437748cd8SNickeau        $this->_string = $string;
2537748cd8SNickeau    }
2637748cd8SNickeau
2737748cd8SNickeau    /**
2837748cd8SNickeau     * @param $string
2937748cd8SNickeau     * @return Template
3037748cd8SNickeau     */
3137748cd8SNickeau    public static function create($string)
3237748cd8SNickeau    {
3337748cd8SNickeau        return new Template($string);
3437748cd8SNickeau    }
3537748cd8SNickeau
3637748cd8SNickeau    public function set($key, $value)
3737748cd8SNickeau    {
3837748cd8SNickeau        $this->_data[$key] = $value;
3937748cd8SNickeau        return $this;
4037748cd8SNickeau    }
4137748cd8SNickeau
42*1fa8c418SNickeau    public function render(): string
4337748cd8SNickeau    {
4437748cd8SNickeau
45*1fa8c418SNickeau
46*1fa8c418SNickeau        $variablePattern = self::VARIABLE_PATTERN_CAPTURE_VARIABLE;
47*1fa8c418SNickeau        $splits = preg_split($variablePattern, $this->_string, -1, PREG_SPLIT_DELIM_CAPTURE);
4837748cd8SNickeau        $rendered = "";
4937748cd8SNickeau        foreach ($splits as $part) {
50*1fa8c418SNickeau            if (substr($part, 0, 1) === self::VARIABLE_PREFIX) {
5137748cd8SNickeau                $variable = trim(substr($part, 1));
52*1fa8c418SNickeau                if(isset($this->_data[$variable])) {
5337748cd8SNickeau                    $value = $this->_data[$variable];
5437748cd8SNickeau                } else  {
55*1fa8c418SNickeau                    LogUtility::msg("The variable ($variable) was not found and have not been replaced");
56*1fa8c418SNickeau                    $value = $variable;
57*1fa8c418SNickeau                }
58*1fa8c418SNickeau            } else {
5937748cd8SNickeau                $value = $part;
6037748cd8SNickeau            }
6137748cd8SNickeau            $rendered .= $value;
6237748cd8SNickeau        }
6337748cd8SNickeau        return $rendered;
6437748cd8SNickeau
6537748cd8SNickeau    }
6637748cd8SNickeau
6737748cd8SNickeau    /**
6837748cd8SNickeau     *
6937748cd8SNickeau     * @return false|string
7037748cd8SNickeau     * @deprecated Just for demo, don't use because the input is not validated
7137748cd8SNickeau     *
7237748cd8SNickeau     */
7337748cd8SNickeau    public function renderViaEval()
7437748cd8SNickeau    {
7537748cd8SNickeau        extract($this->_data);
7637748cd8SNickeau        ob_start();
7737748cd8SNickeau        eval("echo $this->_string ;");
7837748cd8SNickeau        return ob_get_clean();
7937748cd8SNickeau    }
80*1fa8c418SNickeau
81*1fa8c418SNickeau    /**
82*1fa8c418SNickeau     * @return array - an array of variable name
83*1fa8c418SNickeau     */
84*1fa8c418SNickeau    public function getVariablesDetected(): array
85*1fa8c418SNickeau    {
86*1fa8c418SNickeau        $result = preg_match_all(self::VARIABLE_PATTERN_CAPTURE_NAME, $this->_string, $matches);
87*1fa8c418SNickeau        if ($result >= 1) {
88*1fa8c418SNickeau            return $matches[1];
89*1fa8c418SNickeau        } else {
90*1fa8c418SNickeau            return [];
91*1fa8c418SNickeau        }
92*1fa8c418SNickeau
93*1fa8c418SNickeau
94*1fa8c418SNickeau    }
9537748cd8SNickeau}
96