Completed
Push — master ( 1c6e90...10273b )
by Michael
02:54
created

Curty::getNotFoundSymbol()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 4
nc 2
nop 0
1
<?php
2
3
namespace Schnittstabil\Curty;
4
5
use Closure;
6
use Schnittstabil\Get;
7
8
/**
9
 * Curty micro templating.
10
 */
11
class Curty
12
{
13
    /**
14
     * Render template until a fixed point is reached.
15
     *
16
     * @param string       $tpl Curty template
17
     * @param object|array $ctx Context (variable lookup table)
18
     *
19
     * @return string
20
     */
21
    public function __invoke(string $tpl, $ctx) : string
22
    {
23
        do {
24
            $old = $tpl;
25
            $tpl = $this->render($tpl, $ctx);
26
        } while ($tpl !== $old);
27
28
        return $tpl;
29
    }
30
31
    /**
32
     * Render template.
33
     *
34
     * @param string       $tpl Curty template
35
     * @param object|array $ctx Context (variable lookup table)
36
     *
37
     * @return string
38
     */
39
    public function render(string $tpl, $ctx) : string
40
    {
41
        if (!preg_match_all('/{{([^{]+?)}}/', $tpl, $matches)) {
42
            return $tpl;
43
        }
44
45
        foreach ($matches[1] as $key) {
46
            try {
47
                $replace = $this->getValue($key, $ctx);
48
            } catch (\Schnittstabil\Get\OutOfBoundsException $e) {
49
                continue;
50
            }
51
52
            $tpl = str_replace('{{'.$key.'}}', $this->renderValue($replace), $tpl);
53
        }
54
55
        return $tpl;
56
    }
57
58
    protected function getValue(string $key, $ctx)
59
    {
60
        $value = Get\valueOrFail($key, $ctx);
61
62
        if ($value instanceof Closure) {
63
            return $value($this);
64
        }
65
66
        return $value;
67
    }
68
69
    protected function renderValue($value) : string
70
    {
71
        if (is_bool($value)) {
72
            return var_export($value, true);
73
        }
74
75
        if (is_scalar($value) || method_exists($value, '__toString')) {
76
            return (string) $value;
77
        }
78
79
        return @json_encode($value, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRESERVE_ZERO_FRACTION);
80
    }
81
}
82