This repository has been archived by the owner on Jan 8, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2.6k
/
NodeList.php
213 lines (189 loc) · 4.12 KB
/
NodeList.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Dom;
use ArrayAccess;
use Countable;
use DOMDocument;
use DOMNodeList;
use DOMNode;
use Iterator;
/**
* Nodelist for DOM XPath query
*/
class NodeList implements Iterator, Countable, ArrayAccess
{
/**
* CSS Selector query
* @var string
*/
protected $cssQuery;
/**
* @var DOMDocument
*/
protected $document;
/**
* @var DOMNodeList
*/
protected $nodeList;
/**
* Current iterator position
* @var int
*/
protected $position = 0;
/**
* XPath query
* @var string
*/
protected $xpathQuery;
/**
* Constructor
*
* @param string $cssQuery
* @param string|array $xpathQuery
* @param DOMDocument $document
* @param DOMNodeList $nodeList
*/
public function __construct($cssQuery, $xpathQuery, DOMDocument $document, DOMNodeList $nodeList)
{
$this->cssQuery = $cssQuery;
$this->xpathQuery = $xpathQuery;
$this->document = $document;
$this->nodeList = $nodeList;
}
/**
* Retrieve CSS Query
*
* @return string
*/
public function getCssQuery()
{
return $this->cssQuery;
}
/**
* Retrieve XPath query
*
* @return string
*/
public function getXpathQuery()
{
return $this->xpathQuery;
}
/**
* Retrieve DOMDocument
*
* @return DOMDocument
*/
public function getDocument()
{
return $this->document;
}
/**
* Iterator: rewind to first element
*
* @return DOMNode
*/
public function rewind()
{
$this->position = 0;
return $this->nodeList->item(0);
}
/**
* Iterator: is current position valid?
*
* @return bool
*/
public function valid()
{
if (in_array($this->position, range(0, $this->nodeList->length - 1)) && $this->nodeList->length > 0) {
return true;
}
return false;
}
/**
* Iterator: return current element
*
* @return DOMNode
*/
public function current()
{
return $this->nodeList->item($this->position);
}
/**
* Iterator: return key of current element
*
* @return int
*/
public function key()
{
return $this->position;
}
/**
* Iterator: move to next element
*
* @return DOMNode
*/
public function next()
{
++$this->position;
return $this->nodeList->item($this->position);
}
/**
* Countable: get count
*
* @return int
*/
public function count()
{
return $this->nodeList->length;
}
/**
* ArrayAccess: offset exists
*
* @param int $key
* @return bool
*/
public function offsetExists($key)
{
if (in_array($key, range(0, $this->nodeList->length - 1)) && $this->nodeList->length > 0) {
return true;
}
return false;
}
/**
* ArrayAccess: get offset
*
* @param int $key
* @return mixed
*/
public function offsetGet($key)
{
return $this->nodeList->item($key);
}
/**
* ArrayAccess: set offset
*
* @param mixed $key
* @param mixed $value
* @throws Exception\BadMethodCallException when attemptingn to write to a read-only item
*/
public function offsetSet($key, $value)
{
throw new Exception\BadMethodCallException('Attempting to write to a read-only list');
}
/**
* ArrayAccess: unset offset
*
* @param mixed $key
* @throws Exception\BadMethodCallException when attemptingn to unset a read-only item
*/
public function offsetUnset($key)
{
throw new Exception\BadMethodCallException('Attempting to unset on a read-only list');
}
}