Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
13 / 13
CRAP
100.00% covered (success)
100.00%
1 / 1
AbstractNode
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
13 / 13
17
100.00% covered (success)
100.00%
1 / 1
 getIndent
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setIndent
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getParent
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 setParent
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 addChild
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
1
 addChildren
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
4
 hasChildren
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 hasChildNodes
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getChild
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getChildren
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getChildNodes
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 removeChild
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
2
 removeChildren
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2/**
3 * Pop PHP Framework (http://www.popphp.org/)
4 *
5 * @link       https://github.com/popphp/popphp-framework
6 * @author     Nick Sagona, III <dev@nolainteractive.com>
7 * @copyright  Copyright (c) 2009-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
8 * @license    http://www.popphp.org/license     New BSD License
9 */
10
11/**
12 * @namespace
13 */
14namespace Pop\Dom;
15
16use InvalidArgumentException;
17
18/**
19 * Abstract node class
20 *
21 * @category   Pop
22 * @package    Pop\Dom
23 * @author     Nick Sagona, III <dev@nolainteractive.com>
24 * @copyright  Copyright (c) 2009-2024 NOLA Interactive, LLC. (http://www.nolainteractive.com)
25 * @license    http://www.popphp.org/license     New BSD License
26 * @version    4.0.0
27 */
28abstract class AbstractNode implements NodeInterface
29{
30
31    /**
32     * Object child nodes
33     * @var array
34     */
35    protected array $childNodes = [];
36
37    /**
38     * Indentation for formatting purposes
39     * @var ?string
40     */
41    protected ?string $indent = null;
42
43    /**
44     * Child output
45     * @var ?string
46     */
47    protected ?string $output = null;
48
49    /**
50     * Parent node
51     * @var ?AbstractNode
52     */
53    protected ?AbstractNode $parent = null;
54
55    /**
56     * Return the indent
57     *
58     * @return string
59     */
60    public function getIndent(): string
61    {
62        return $this->indent;
63    }
64
65    /**
66     * Set the indent
67     *
68     * @param  string $indent
69     * @return AbstractNode
70     */
71    public function setIndent(string $indent): AbstractNode
72    {
73        $this->indent = $indent;
74        return $this;
75    }
76
77    /**
78     * Return the parent node
79     *
80     * @return AbstractNode|null
81     */
82    public function getParent(): AbstractNode|null
83    {
84        return $this->parent;
85    }
86
87    /**
88     * Set the parent node
89     *
90     * @param  AbstractNode $parent
91     * @return AbstractNode
92     */
93    public function setParent(NodeInterface $parent): AbstractNode
94    {
95        $this->parent = $parent;
96        return $this;
97    }
98
99    /**
100     * Add a child to the object
101     *
102     * @param  Child $c
103     * @throws InvalidArgumentException
104     * @return AbstractNode
105     */
106    public function addChild(Child $c): AbstractNode
107    {
108        $c->setParent($this);
109        $this->childNodes[] = $c;
110        return $this;
111    }
112
113    /**
114     * Add children to the object
115     *
116     * @param  mixed $children
117     * @throws Exception
118     * @return AbstractNode
119     */
120    public function addChildren(mixed $children): AbstractNode
121    {
122        if (is_array($children)) {
123            foreach ($children as $child) {
124                $this->addChild($child);
125            }
126        } else if ($children instanceof Child) {
127            $this->addChild($children);
128        } else {
129            throw new Exception(
130                'Error: The parameter passed must be an instance of Pop\Dom\Child or an array of Pop\Dom\Child instances.'
131            );
132        }
133
134        return $this;
135    }
136
137    /**
138     * Get whether or not the child object has children
139     *
140     * @return bool
141     */
142    public function hasChildren(): bool
143    {
144        return (count($this->childNodes) > 0);
145    }
146
147    /**
148     * Get whether or not the child object has children (alias)
149     *
150     * @return bool
151     */
152    public function hasChildNodes(): bool
153    {
154        return (count($this->childNodes) > 0);
155    }
156
157    /**
158     * Get the child nodes of the object
159     *
160     * @param  int $i
161     * @return Child|null
162     */
163    public function getChild(int $i): Child|null
164    {
165        return $this->childNodes[(int)$i] ?? null;
166    }
167
168    /**
169     * Get the child nodes of the object
170     *
171     * @return array
172     */
173    public function getChildren(): array
174    {
175        return $this->childNodes;
176    }
177
178    /**
179     * Get the child nodes of the object (alias)
180     *
181     * @return array
182     */
183    public function getChildNodes(): array
184    {
185        return $this->childNodes;
186    }
187
188    /**
189     * Remove all child nodes from the object
190     *
191     * @param  int  $i
192     * @return void
193     */
194    public function removeChild(int $i): void
195    {
196        if (isset($this->childNodes[$i])) {
197            unset($this->childNodes[$i]);
198        }
199    }
200
201    /**
202     * Remove all child nodes from the object
203     *
204     * @return void
205     */
206    public function removeChildren(): void
207    {
208        $this->childNodes = [];
209    }
210
211}