XMLReader   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Test Coverage

Coverage 77.78%

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 47
ccs 14
cts 18
cp 0.7778
rs 10
c 0
b 0
f 0
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A parse() 0 28 2
A __construct() 0 3 1
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