Completed
Push — master ( 1ba1ea...0e3150 )
by Auke
03:41
created

template   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 80
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Test Coverage

Coverage 75%

Importance

Changes 8
Bugs 2 Features 2
Metric Value
wmc 9
c 8
b 2
f 2
lcom 0
cbo 0
dl 0
loc 80
ccs 21
cts 28
cp 0.75
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A substituteAll() 0 4 1
A substitute() 0 16 4
A compileSubstitute() 0 6 1
A run() 0 8 2
A compile() 0 15 1
1
<?php
2
3
namespace arc;
4
5
class template
6
{
7
    /**
8
     * This method replaces {$key} entries in a string with the value of that key in an arguments list
9
     * If the key isn't in the arguments array, it will remain in the returned string as-is.
10
     * The arguments list may be an object or an array and the values may be basic types or callable.
11
     * In the latter case, the key will be substituted with the return value of the callable. The callable
12
     * is called with the key matched.
13
     * <code>
14
     *   $parsedTemplate = \arc\template::substitute( 'Hello {$world} {$foo}', [ 'world' => 'World!' ] );
15
     *   // => 'Hello World! {$foo}'
16
     *</code>
17
     * @param string $template
18
     * @param array $arguments
19
     * @return string
20
     */
21 8
    public static function substitute($template, $arguments)
22
    {
23 8
        if (is_object($arguments) && !($arguments instanceof \ArrayObject )) {
24
            $arguments = get_object_vars( $arguments );
25
        }
26 8
        $regex = '\{\$(' . join( array_keys( (array) $arguments ), '|' ) . ')\}';
27
28 8
        return preg_replace_callback( '/'.$regex.'/', function ($matches) use ($arguments) {
29 8
            $argument = $arguments[ $matches[1] ];
30 8
            if (is_callable( $argument )) {
31 2
                $argument = call_user_func( $argument, $matches[1] );
32 1
            }
33
34 8
            return $argument;
35 8
        }, $template );
36
    }
37
38
    /**
39
     * This method is identical to \arc\template::substitute but it removes any keys left over.
40
     * <code>
41
     *   $parsedTemplate = \arc\template::substituteAll( 'Hello {$world} {$foo}', [ 'world' => 'World!' ] );
42
     *   // => 'Hello World! '
43
     *</code>
44
     * @param string $template
45
     * @param array $arguments
46
     * @return string
47
     */
48 2
    public static function substituteAll($template, $arguments)
49
    {
50 2
        return preg_replace('/\{\$.*\}/', '', self::substitute( $template, $arguments ) );
51
    }
52
53 4
    public static function compile($template)
54
    {
55
        $prefix = <<<'EOFUNC'
56
            extract( $arguments, EXTR_REFS );
57 2
            ob_start();
58 2
EOFUNC;
59
        $postfix = <<<'EOFUNC'
60
            $result = ob_get_contents();
61
            ob_end_clean();
62
63 2
            return $result;
64 2
EOFUNC;
65
66 4
        return create_function( '$arguments', $prefix .' ?'.'>'. $template .'<?'.'php ' . $postfix );
67
    }
68
69 2
    public static function compileSubstitute($template)
70
    {
71 2
        $template = preg_replace('/EOTEMPLATE;.*$/', '', $template);
72
73 2
        return self::compile( "<"."?php\n echo <<<EOTEMPLATE\n".$template."\nEOTEMPLATE;\n ?".">");
74
    }
75
76
    public static function run($template, $arguments)
77
    {
78
        if (!is_callable($template)) {
79
            $template = self::compile( $template );
80
        }
81
82
        return $template( $arguments );
83
    }
84
}
85