TagHelperCompiler::needsToBeRecompiled()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 9
rs 9.9666
c 0
b 0
f 0
cc 2
nc 2
nop 2
1
<?php
2
3
namespace BeyondCode\TagHelper;
4
5
use Sunra\PhpSimple\HtmlDomParser;
6
use Illuminate\Filesystem\Filesystem;
7
use BeyondCode\TagHelper\Html\HtmlElement;
8
9
class TagHelperCompiler
10
{
11
    /** @var TagHelper */
12
    protected $tagHelper;
13
14
    /** @var Filesystem */
15
    protected $files;
16
17
    public function __construct(TagHelper $tagHelper, Filesystem $files)
18
    {
19
        $this->tagHelper = $tagHelper;
20
        $this->files = $files;
21
    }
22
23
    public function needsToBeRecompiled($path, $compiled)
24
    {
25
        if (! $this->files->exists($compiled)) {
26
            return true;
27
        }
28
29
        return $this->files->lastModified($path) >=
30
            $this->files->lastModified($compiled);
31
    }
32
33
    public function compile(string $viewContent)
34
    {
35
        return array_reduce(
36
            $this->tagHelper->getRegisteredTagHelpers(),
37
            [$this, 'parseHtml'],
38
            $viewContent
39
        );
40
    }
41
42
    protected function getTagSelector(Helper $tagHelper): string
43
    {
44
        $selector = $tagHelper->getTargetElement();
45
        if (! is_null($tagHelper->getTargetAttribute())) {
46
            $selector .= "[{$tagHelper->getTargetAttribute()}]";
47
            $selector .= ", {$tagHelper->getTargetElement()}[:{$tagHelper->getTargetAttribute()}]";
48
        }
49
50
        return $selector;
51
    }
52
53
    protected function parseHtml(string $viewContents, Helper $tagHelper)
54
    {
55
        $html = HtmlDomParser::str_get_html($viewContents, $lowercase = true, $forceTagsClosed = true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN = false);
56
57
        if ($html === false) {
58
            return $viewContents;
59
        }
60
61
        $elements = array_reverse($html->find($this->getTagSelector($tagHelper)));
62
63
        foreach ($elements as $element) {
64
            $tagHelper->process(HtmlElement::create($element));
65
        }
66
67
        return $html;
68
    }
69
}
70