OptionalField::addElement()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 21
ccs 11
cts 11
cp 1
rs 9.584
c 0
b 0
f 0
cc 4
nc 4
nop 3
crap 4
1
<?php declare(strict_types=1);
2
/*
3
 * This file is part of the feed-io package.
4
 *
5
 * (c) Alexandre Debril <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace FeedIo\Rule;
12
13
use FeedIo\Feed\ElementsAwareInterface;
14
use FeedIo\Feed\NodeInterface;
15
use FeedIo\Feed\Node\ElementInterface;
16
use FeedIo\RuleAbstract;
17
18
class OptionalField extends RuleAbstract
19
{
20
    const NODE_NAME = 'default';
21
22
    /**
23
     * @param  NodeInterface $node
24
     * @param  \DOMElement   $domElement
25
     */
26 14
    public function setProperty(NodeInterface $node, \DOMElement $domElement) : void
27
    {
28 14
        $element = $this->createElementFromDomNode($node, $domElement);
29
30 14
        $node->addElement($element);
31 14
    }
32
33
    /**
34
     * @param NodeInterface $node
35
     * @param ElementInterface $element
36
     * @param \DOMNode $domNode
37
     */
38 14
    private function addSubElements(NodeInterface $node, ElementInterface $element, \DOMNode $domNode) : void
39
    {
40 14
        if (!$domNode->hasChildNodes() || !$this->hasSubElements($domNode)) {
41
            // no elements to add
42 14
            return;
43
        }
44
45 3
        $this->addElementsFromNodeList($node, $element, $domNode->childNodes);
46 3
    }
47
48
    /**
49
     * @param NodeInterface $node
50
     * @param ElementInterface $element
51
     * @param \DOMNodeList $childNodeList
52
     */
53 3
    private function addElementsFromNodeList(NodeInterface $node, ElementInterface $element, \DOMNodeList $childNodeList) : void
54
    {
55 3
        foreach ($childNodeList as $childNode) {
56 3
            if ($childNode instanceof \DOMText) {
57
                continue;
58
            }
59
60 3
            $element->addElement($this->createElementFromDomNode($node, $childNode));
61
        }
62 3
    }
63
64
    /**
65
     * @param \DOMNode $domNode
66
     * @return bool
67
     */
68 14
    private function hasSubElements(\DOMNode $domNode) : bool
69
    {
70 14
        foreach ($domNode->childNodes as $childDomNode) {
71 14
            if (!$childDomNode instanceof \DOMText) {
72 3
                return true;
73
            }
74
        }
75
76 13
        return false;
77
    }
78
79
    /**
80
     * @param NodeInterface $node
81
     * @param \DOMNode $domNode
82
     * @return ElementInterface
83
     */
84 14
    private function createElementFromDomNode(NodeInterface $node, \DOMNode $domNode) : ElementInterface
85
    {
86 14
        $element = $node->newElement();
87 14
        $element->setName($domNode->nodeName);
88 14
        $element->setValue($domNode->nodeValue);
89
90 14
        foreach ($domNode->attributes as $attribute) {
91 3
            $element->setAttribute($attribute->name, $attribute->value);
92
        }
93 14
        $this->addSubElements($node, $element, $domNode);
94
95 14
        return $element;
96
    }
97
98
    /**
99
     * @param \DomElement $domElement
100
     * @param ElementInterface $element
101
     * @return \DomElement
102
     */
103 6
    public function buildDomElement(\DomElement $domElement, ElementInterface $element) : \DOMElement
104
    {
105 6
        $domElement->nodeValue = $element->getValue();
106
107 6
        foreach ($element->getAttributes() as $name => $value) {
108 1
            $domElement->setAttribute($name, $value);
109
        }
110
111
        /** @var ElementInterface $subElement */
112 6
        foreach ($element->getAllElements() as $subElement) {
113 1
            $subDomElement = $domElement->ownerDocument->createElement($subElement->getName());
114 1
            $this->buildDomElement($subDomElement, $subElement);
115 1
            $domElement->appendChild($subDomElement);
116
        }
117
118 6
        return $domElement;
119
    }
120
121
    /**
122
     * @inheritDoc
123
     */
124 7
    protected function hasValue(NodeInterface $node) : bool
125
    {
126 7
        return $node instanceof ElementsAwareInterface;
127
    }
128
129
    /**
130
     * @inheritDoc
131
     */
132 7
    protected function addElement(\DomDocument $document, \DOMElement $rootElement, NodeInterface $node) : void
133
    {
134 7
        $addedElementsCount = 0;
135
136 7
        if ($node instanceof ElementsAwareInterface) {
137 7
            foreach ($node->getElementIterator($this->getNodeName()) as $element) {
138 6
                $domElement = $document->createElement($this->getNodeName());
139
140 6
                $this->buildDomElement($domElement, $element);
141
142 6
                $rootElement->appendChild($domElement);
143
144 6
                $addedElementsCount++;
145
            }
146
        }
147
148 7
        if (! $addedElementsCount) {
149
            // add an implicit empty element if the node had no elements matching this rule
150 1
            $rootElement->appendChild($document->createElement($this->getNodeName()));
151
        }
152 7
    }
153
}
154