Passed
Push — master ( 44266f...d1b9e8 )
by ReliQ
04:53
created

Processor::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 5
nc 1
nop 5
dl 0
loc 12
rs 10
c 1
b 0
f 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ReliqArts\StyleImporter\CSS\Processor;
6
7
use ReliqArts\Contracts\Logger;
8
use ReliqArts\StyleImporter\CSS\Exception\RulesetGenerationFailed;
9
use ReliqArts\StyleImporter\CSS\Extractable;
10
use ReliqArts\StyleImporter\CSS\Extractor;
11
use ReliqArts\StyleImporter\CSS\Generator;
12
use ReliqArts\StyleImporter\CSS\Generator\Context;
13
use ReliqArts\StyleImporter\CSS\Processor as ProviderContract;
14
use ReliqArts\StyleImporter\CSS\Rules;
15
use ReliqArts\StyleImporter\CSS\Ruleset;
16
use ReliqArts\StyleImporter\CSS\Util\Sanitizer;
17
use ReliqArts\StyleImporter\Exception\InvalidArgument;
18
19
final class Processor implements ProviderContract
20
{
21
    /**
22
     * @var Extractor
23
     */
24
    private $importExtractor;
25
26
    /**
27
     * @var Extractor
28
     */
29
    private $fontFaceExtractor;
30
31
    /**
32
     * @var Extractor
33
     */
34
    private $mediaBlockExtractor;
35
36
    /**
37
     * @var Generator
38
     */
39
    private $ruleGenerator;
40
41
    /**
42
     * @var Logger
43
     */
44
    private $logger;
45
46
    /**
47
     * Processor constructor.
48
     *
49
     * @param Extractor $importExtractor
50
     * @param Extractor $fontFaceExtractor
51
     * @param Extractor $mediaBlockExtractor
52
     * @param Generator $ruleGenerator
53
     * @param Logger    $logger
54
     */
55
    public function __construct(
56
        Extractor $importExtractor,
57
        Extractor $fontFaceExtractor,
58
        Extractor $mediaBlockExtractor,
59
        Generator $ruleGenerator,
60
        Logger $logger
61
    ) {
62
        $this->importExtractor = $importExtractor;
63
        $this->mediaBlockExtractor = $mediaBlockExtractor;
64
        $this->ruleGenerator = $ruleGenerator;
65
        $this->logger = $logger;
66
        $this->fontFaceExtractor = $fontFaceExtractor;
67
    }
68
69
    /**
70
     * @param string $styles
71
     * @param string ...$htmlElements
72
     *
73
     * @return Ruleset
74
     */
75
    public function getStyles(string $styles, string ...$htmlElements): Ruleset
76
    {
77
        try {
78
            $importRules = $this->importExtractor->extract($styles);
79
            $fontFaceRules = $this->fontFaceExtractor->extract($styles);
80
            $mediaBlocks = $this->mediaBlockExtractor->extract($styles);
81
            $extracted = array_merge($importRules, $mediaBlocks);
82
            $sanitizedStyles = Sanitizer::sanitizeStyles($this->removeExtractedSections($styles, ...$extracted));
83
            $generatorContext = new Context($sanitizedStyles, ...$htmlElements);
84
85
            return $this->ruleGenerator->generate(
86
                $generatorContext
87
                    ->withImportRules(...$importRules)
88
                    ->withFontFaceRules(...$fontFaceRules)
89
                    ->withMediaBlocks(...$mediaBlocks)
90
            );
91
        } catch (InvalidArgument | RulesetGenerationFailed $exception) {
92
            $this->logger->error(
93
                sprintf('CSS processing failed; %s', $exception->getMessage()),
94
                ['trace' => $exception->getTraceAsString()]
95
            );
96
97
            return new Rules();
98
        }
99
    }
100
101
    /**
102
     * @param string      $styles
103
     * @param Extractable ...$extracted
104
     *
105
     * @return string
106
     */
107
    private function removeExtractedSections(string $styles, Extractable ...$extracted): string
108
    {
109
        return str_replace($extracted, '', $styles);
110
    }
111
}
112