XMLReader::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 1
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * (c) Steve Nebes <[email protected]>
4
 *
5
 * For the full copyright and license information, please view the LICENSE
6
 * file that was distributed with this source code.
7
 */
8
9
declare(strict_types=1);
10
11
namespace SN\DaisyDiff\Xml;
12
13
use SN\DaisyDiff\Html\Dom\DomTreeBuilder;
14
15
/**
16
 * XMLReader implementation.
17
 */
18
class XMLReader
19
{
20
    /** @var DomTreeBuilder */
21
    private $domTreeBuilder;
22
23
    /**
24
     * @param DomTreeBuilder $domTreeBuilder
25
     */
26 49
    public function __construct(DomTreeBuilder $domTreeBuilder)
27
    {
28 49
        $this->domTreeBuilder = $domTreeBuilder;
29 49
    }
30
31
    /**
32
     * @param string $xml
33
     * @return void
34
     *
35
     * @throws \RuntimeException
36
     */
37 49
    public function parse(string $xml): void
38
    {
39 49
        $this->domTreeBuilder->startDocument();
40
41
        // Wrap xml in valid block.
42 49
        $clean = \mb_convert_encoding($xml, 'HTML-ENTITIES', 'UTF-8');
43 49
        $clean = \sprintf('<?xml version="1.0" encoding="UTF-8"?>%s<body>%s</body>', Sanitizer::getDocType(), $clean);
44
45
        // Create parser.
46 49
        $parser = \xml_parser_create('');
47 49
        \xml_set_element_handler($parser, [$this->domTreeBuilder, 'startElement'], [$this->domTreeBuilder, 'endElement']);
48 49
        \xml_set_character_data_handler($parser, [$this->domTreeBuilder, 'characters']);
49
50
        // Force xml tags to be lowercase.
51 49
        \xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, false);
52
53
        // Parse!
54 49
        if (!\xml_parse($parser, $clean, true)) {
55
            $error = \xml_error_string(xml_get_error_code($parser));
56
            $line  = \xml_get_current_line_number($parser);
57
            $col   = \xml_get_current_column_number($parser);
58
59
            throw new \RuntimeException("XML Error: {$error} at line {$line} and column {$col}\n");
60
        }
61
62 49
        \xml_parser_free($parser);
63
64 49
        $this->domTreeBuilder->endDocument();
65 49
    }
66
}
67