1 | <?php |
||
2 | /** |
||
3 | * @author Niels A.D. |
||
4 | * @author Todd Burry <[email protected]> |
||
5 | * @copyright 2010 Niels A.D., 2014 Todd Burry |
||
6 | * @license http://opensource.org/licenses/LGPL-2.1 LGPL-2.1 |
||
7 | * @package pQuery |
||
8 | */ |
||
9 | |||
10 | use pQuery\IQuery; |
||
11 | |||
12 | /** |
||
13 | * A jQuery-like object for php. |
||
14 | */ |
||
15 | class pQuery implements ArrayAccess, IteratorAggregate, IQuery { |
||
16 | /// Properties /// |
||
17 | |||
18 | /** |
||
19 | * @var IQuery[] |
||
20 | */ |
||
21 | protected $nodes = array(); |
||
22 | |||
23 | /// Methods /// |
||
24 | |||
25 | 36 | public function __construct($nodes = array()) { |
|
26 | 36 | $this->nodes = $nodes; |
|
27 | 36 | } |
|
28 | |||
29 | 3 | public function addClass($classname) { |
|
30 | 3 | foreach ($this->nodes as $node) { |
|
31 | 3 | $node->addClass($classname); |
|
32 | 3 | } |
|
33 | 3 | return $this; |
|
34 | } |
||
35 | |||
36 | 1 | public function after($content) { |
|
37 | 1 | foreach ($this->nodes as $node) { |
|
38 | 1 | $node->after($content); |
|
39 | 1 | } |
|
40 | 1 | return $this; |
|
41 | } |
||
42 | |||
43 | 1 | public function append($content) { |
|
44 | 1 | foreach ($this->nodes as $node) { |
|
45 | 1 | $node->append($content); |
|
46 | 1 | } |
|
47 | 1 | return $this; |
|
48 | } |
||
49 | |||
50 | 7 | public function attr($name, $value = null) { |
|
51 | 7 | if (empty($this->nodes) && $value === null) |
|
52 | 7 | return ''; |
|
53 | |||
54 | 7 | foreach ($this->nodes as $node) { |
|
55 | 7 | if ($value === null) |
|
56 | 7 | return $node->attr($name); |
|
57 | 1 | $node->attr($name, $value); |
|
58 | 1 | } |
|
59 | 1 | return $this; |
|
60 | } |
||
61 | |||
62 | 1 | public function before($content) { |
|
63 | 1 | foreach ($this->nodes as $node) { |
|
64 | 1 | $node->before($content); |
|
65 | 1 | } |
|
66 | 1 | return $this; |
|
67 | } |
||
68 | |||
69 | 1 | public function clear() { |
|
70 | 1 | foreach ($this->nodes as $node) { |
|
71 | 1 | $node->clear(); |
|
72 | 1 | } |
|
73 | 1 | return $this; |
|
74 | } |
||
75 | |||
76 | /** |
||
77 | * Get the count of matched elements. |
||
78 | * |
||
79 | * @return int Returns the count of matched elements. |
||
80 | */ |
||
81 | 8 | public function count() { |
|
82 | 8 | return count($this->nodes); |
|
83 | } |
||
84 | |||
85 | /** |
||
86 | * Format/beautify a DOM. |
||
87 | * |
||
88 | * @param pQuery\DomNode $dom The dom to format. |
||
89 | * @param array $options Extra formatting options. See {@link pQuery\HtmlFormatter::$options}. |
||
90 | * @return bool Returns `true` on sucess and `false` on failure. |
||
91 | */ |
||
92 | // public static function format($dom, $options = array()) { |
||
93 | // $formatter = new pQuery\HtmlFormatter($options); |
||
94 | // return $formatter->format($dom); |
||
95 | // } |
||
96 | |||
97 | 3 | public function getIterator() { |
|
98 | 3 | return new ArrayIterator($this->nodes); |
|
99 | } |
||
100 | |||
101 | 2 | public function hasClass($classname) { |
|
102 | 2 | foreach ($this->nodes as $node) { |
|
103 | 2 | if ($node->hasClass($classname)) |
|
104 | 2 | return true; |
|
105 | 2 | } |
|
106 | 2 | return false; |
|
107 | } |
||
108 | |||
109 | 3 | public function html($value = null) { |
|
110 | 3 | if (empty($this->nodes) && $value === null) |
|
111 | 3 | return ''; |
|
112 | |||
113 | 3 | foreach ($this->nodes as $node) { |
|
114 | 3 | if ($value === null) |
|
115 | 3 | return $node->html(); |
|
116 | 1 | $node->html($value); |
|
117 | 1 | } |
|
118 | 1 | return $this; |
|
119 | } |
||
120 | |||
121 | 1 | public function offsetExists($offset) { |
|
122 | 1 | return isset($this->nodes[$offset]); |
|
123 | } |
||
124 | |||
125 | 2 | public function offsetGet($offset) { |
|
126 | 2 | return isset($this->nodes[$offset]) ? $this->nodes[$offset] : null; |
|
127 | } |
||
128 | |||
129 | 2 | public function offsetSet($offset, $value) { |
|
130 | |||
131 | 2 | if (is_null($offset) || !isset($this->nodes[$offset])) { |
|
132 | 1 | throw new \BadMethodCallException("You are not allowed to add new nodes to the pQuery object."); |
|
133 | } else { |
||
134 | 1 | $this->nodes[$offset]->replaceWith($value); |
|
135 | } |
||
136 | 1 | } |
|
137 | |||
138 | 1 | public function offsetUnset($offset) { |
|
139 | 1 | if (isset($this->nodes[$offset])) { |
|
140 | 1 | $this->nodes[$offset]->remove(); |
|
141 | 1 | unset($this->nodes[$offset]); |
|
142 | 1 | } |
|
143 | 1 | } |
|
144 | |||
145 | /** |
||
146 | * Query a file or url. |
||
147 | * |
||
148 | * @param string $path The path to the url. |
||
149 | * @param resource $context A context suitable to be passed into {@link file_get_contents} |
||
150 | * @return pQuery\DomNode Returns the root dom node for the html file. |
||
151 | */ |
||
152 | 9 | public static function parseFile($path, $context = null) { |
|
153 | 9 | $html_str = file_get_contents($path, false, $context); |
|
154 | 9 | return static::parseStr($html_str); |
|
155 | } |
||
156 | |||
157 | /** |
||
158 | * Query a string of html. |
||
159 | * |
||
160 | * @param string $html |
||
161 | * @return pQuery\DomNode Returns the root dom node for the html string. |
||
162 | */ |
||
163 | 37 | public static function parseStr($html) { |
|
164 | 37 | $parser = new pQuery\Html5Parser($html); |
|
165 | 37 | return $parser->root; |
|
166 | } |
||
167 | |||
168 | 1 | public function prepend($content = null) { |
|
169 | 1 | foreach ($this->nodes as $node) { |
|
170 | 1 | $node->prepend($content); |
|
171 | 1 | } |
|
172 | 1 | return $this; |
|
173 | } |
||
174 | |||
175 | 4 | public function prop($name, $value = null) { |
|
176 | 4 | if (empty($this->nodes) && $value === null) |
|
177 | 4 | return ''; |
|
178 | |||
179 | 4 | foreach ($this->nodes as $node) { |
|
180 | 4 | if ($value === null) |
|
181 | 4 | return $node->prop($name); |
|
182 | 3 | $node->prop($name, $value); |
|
183 | 3 | } |
|
184 | 3 | return $this; |
|
185 | } |
||
186 | |||
187 | 1 | public function remove($selector = null) { |
|
188 | 1 | foreach ($this->nodes as $node) { |
|
189 | 1 | $node->remove($selector); |
|
190 | 1 | } |
|
191 | 1 | if ($selector === null) |
|
192 | 1 | $this->nodes = array(); |
|
193 | |||
194 | 1 | return $this; |
|
195 | } |
||
196 | |||
197 | 1 | public function removeAttr($name) { |
|
198 | 1 | foreach ($this->nodes as $node) { |
|
199 | 1 | $node->removeAttr($name); |
|
200 | 1 | } |
|
201 | 1 | return $this; |
|
202 | } |
||
203 | |||
204 | 2 | public function removeClass($classname) { |
|
205 | 2 | foreach ($this->nodes as $node) { |
|
206 | 2 | $node->removeClass($classname); |
|
207 | 2 | } |
|
208 | 2 | return $this; |
|
209 | } |
||
210 | |||
211 | 1 | public function replaceWith($content) { |
|
212 | 1 | foreach ($this->nodes as &$node) { |
|
213 | 1 | $node = $node->replaceWith($content); |
|
214 | 1 | } |
|
215 | 1 | return $this; |
|
216 | } |
||
217 | |||
218 | 1 | public function tagName($value = null) { |
|
219 | 1 | foreach ($this->nodes as $node) { |
|
220 | 1 | if ($value === null) |
|
221 | 1 | return $node->tagName(); |
|
222 | 1 | $node->tagName($value); |
|
223 | 1 | } |
|
224 | 1 | return $this; |
|
225 | } |
||
226 | |||
227 | 3 | public function text($value = null) { |
|
228 | 3 | if (empty($this->nodes) && $value === null) |
|
229 | 3 | return ''; |
|
230 | |||
231 | 3 | foreach ($this->nodes as $node) { |
|
232 | 3 | if ($value === null) |
|
233 | 3 | return $node->text(); |
|
234 | 2 | $node->text($value); |
|
235 | 2 | } |
|
236 | 2 | return $this; |
|
237 | } |
||
238 | |||
239 | 1 | public function toggleClass($classname, $switch = null) { |
|
240 | 1 | foreach ($this->nodes as $node) { |
|
241 | 1 | $node->toggleClass($classname, $switch); |
|
242 | 1 | } |
|
243 | |||
244 | 1 | return $this; |
|
245 | } |
||
246 | |||
247 | 1 | public function unwrap() { |
|
248 | 1 | foreach ($this->nodes as $node) { |
|
249 | 1 | $node->unwrap(); |
|
250 | 1 | } |
|
251 | 1 | return $this; |
|
252 | } |
||
253 | |||
254 | 5 | public function val($value = null) { |
|
255 | 5 | if (empty($this->nodes) && $value === null) |
|
256 | 5 | return ''; |
|
257 | |||
258 | 5 | foreach ($this->nodes as $node) { |
|
259 | 5 | if ($value === null) |
|
260 | 5 | return $node->val(); |
|
261 | 4 | $node->val($value); |
|
262 | 4 | } |
|
263 | 4 | return $this; |
|
264 | } |
||
265 | |||
266 | 2 | public function wrap($wrapping_element) { |
|
267 | 2 | foreach ($this->nodes as $node) { |
|
268 | 2 | $node->wrap($wrapping_element); |
|
269 | 2 | } |
|
270 | 2 | return $this; |
|
271 | } |
||
272 | |||
273 | 1 | public function wrapInner($wrapping_element) { |
|
274 | 1 | foreach ($this->nodes as $node) { |
|
275 | 1 | $node->wrapInner($wrapping_element); |
|
276 | 1 | } |
|
277 | 1 | return $this; |
|
278 | } |
||
279 | } |
||
280 |