Merge pull request #4036 from dokuwiki/issue4033
[dokuwiki.git] / _test / vendor / scotteh / php-dom-wrapper / README.md
blob1ebc9bc8f6fa151c37ead7c1b3036913320ee894
1 # PHP DOM Wrapper
2 [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/scotteh/php-dom-wrapper/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/scotteh/php-dom-wrapper/?branch=master)
4 ## Intro
6 PHP DOM Wrapper is a simple DOM wrapper library to manipulate and traverse HTML documents. Based around jQuery's manipulation and traversal methods, largely mimicking the behaviour of it's jQuery counterparts.
8 ## Author
10  - Andrew Scott (andrew@andrewscott.net.au)
12 ## Requirements
14  - PHP 7.1 or later
15  - PSR-4 compatible autoloader
17 ## Install
19 Install with [Composer](https://getcomposer.org/doc/).
21 ```
22 composer require scotteh/php-dom-wrapper
23 ```
25 ## Autoloading
27 This library requires an autoloader, if you aren't already using one you can include [Composers autoloader](https://getcomposer.org/doc/01-basic-usage.md#autoloading).
29 ``` php
30 require 'vendor/autoload.php';
31 ```
33 ## Methods
35 ### Manipulation
37 | Method | jQuery Equivalent *(if different)* |
38 |--------|------------------------------|
39 | [addClass()](#addClass)    |
40 | [follow()](#follow)       | *after()* |
41 | [appendWith()](#appendWith)      | *append()* |
42 | [appendTo()](#appendTo)    |
43 | [attr()](#attr)        |
44 | [clone()](#clone)       |
45 | [destroy()](#destroy)      | *remove()* |
46 | [detach()](#detach)      |
47 | [empty()](#empty)       |
48 | [hasClass()](#hasClass)    |
49 | [html()](#html)        |
50 | [precede()](#precede)      | *before()* |
51 | [prependWith()](#prependWith)     | *prepend()* |
52 | [prependTo()](#prependTo)   |
53 | [removeAttr()](#removeAttr)  |
54 | [removeClass()](#removeClass) |
55 | [substituteWith()](#substituteWith) | *replaceWith()* |
56 | [text()](#text)        |
57 | [unwrap()](#unwrap)      |
58 | [wrap()](#wrap)        |
59 | [wrapAll()](#wrapAll)     |
60 | [wrapInner()](#wrapInner)   |
62 ### Traversal
64 | Method | jQuery Equivalent *(if different)* |
65 |--------|------------------------------|
66 | [add()](#add)          |
67 | [children()](#children)     |
68 | [closest()](#closest)      |
69 | [contents()](#contents)     |
70 | [eq()](#eq)           |
71 | [filter()](#filter)       |
72 | [find()](#find)         |
73 | [first()](#first)        |
74 | [has()](#has)          |
75 | [is()](#is)           |
76 | [last()](#last)         |
77 | [map()](#map)          |
78 | [following()](#following)         | *next()* |
79 | [followingAll()](#followingAll)      | *nextAll()* |
80 | [followingUntil()](#followingUntil)    | *nextUntil()* |
81 | [not()](#not)          |
82 | [parent()](#parent)       |
83 | [parents()](#parents)      |
84 | [parentsUntil()](#parentsUntil) |
85 | [preceding()](#preceding)         | *prev()* |
86 | [precedingAll()](#precedingAll)      | *prevAll()* |
87 | [precedingUntil()](#precedingUntil)    | *prevUntil()* |
88 | [siblings()](#siblings)     |
89 | [slice()](#slice)        |
91 ### Other
93 | Method | jQuery Equivalent *(if different)* |
94 |--------|------------------------------|
95 | [count()](#count)        | *length* (property) |
96 | [each()](#each)
98 ## Usage
100 Example #1:
101 ``` php
102 use DOMWrap\Document;
104 $html = '<ul><li>First</li><li>Second</li><li>Third</li></ul>';
106 $doc = new Document();
107 $doc->html($html);
108 $nodes = $doc->find('li');
110 // Returns '3'
111 var_dump($nodes->count());
113 // Append as a child node to each <li>
114 $nodes->appendWith('<b>!</b>');
116 // Returns: <html><body><ul><li>First<b>!</b></li><li>Second<b>!</b></li><li>Third<b>!</b></li></ul></body></html>
117 var_dump($doc->html());
122 ## Methods
124 ### Manipulation
126 #### addClass
129 self addClass(string|callable $class)
132 ##### Example
134 ```php
135 $doc = (new Document())->html('<p>first paragraph</p><p>second paragraph</p>');
136 $doc->find('p')->addClass('text-center');
139 *Result:*
141 ``` html
142 <p class="text-center">first paragraph</p><p class="text-center">second paragraph</p>
147 #### follow
150 self follow(string|NodeList|\DOMNode|callable $input)
153 Insert the argument as a sibling directly after each of the nodes operated on.
155 ##### Example
157 ``` php
158 $doc = (new Document())->html('<ul><li>first</li><li>second</li></ul>');
159 $doc->find('li')->first()->follow('<li>first-and-a-half</li>');
163 *Result:*
165 ``` html
166 <ul>
167     <li>first</li>
168     <li>first-and-a-half</li>
169     <li>second</li>
170 </ul>
175 #### appendWith
178 self appendWith(string|NodeList|\DOMNode|callable $input)
181 ##### Example
183 ``` php
184 $doc = (new Document())->html('<div>The quick brown fox jumps over the lazy dog</div>');
185 $doc->find('div')->appendWith('<strong> Appended!</strong>');
188 *Result:*
190 ``` html
191 <div>The quick brown fox jumps over the lazy dog<strong> Appended!</strong></div>
196 #### appendTo
199 self appendTo(string|NodeList|\DOMNode $selector)
202 ##### Example
204 ``` php
205 $doc = (new Document())->html('<div>The quick brown fox jumps over the lazy dog</div>');
206 $doc->create('<strong> Appended!</strong>')->appendTo('div');
209 *Result:*
210 ``` html
211 <div>The quick brown fox jumps over the lazy dog<strong> Appended!</strong></div>
216 #### attr
219 self|string attr(string $name[, mixed $value = null])
222 ##### Example #1 (Set)
224 ``` php
225 $doc = (new Document())->html('<div class="text-center"></div>');
226 $doc->attr('class', 'text-left');
229 *Result:*
231 ``` html
232 <div class="text-left"></div>
235 ##### Example #2 (Get)
237 ``` php
238 $doc = (new Document())->html('<div class="text-center"></div>');
239 echo $doc->attr('text-center');
242 *Result:*
244 ``` html
245 text-center
250 #### precede
253 self precede(string|NodeList|\DOMNode|callable $input)
256 Insert the argument as a sibling just before each of the nodes operated on.
258 ##### Example
260 ``` php
261 $doc = (new Document())->html('<ul><li>first</li><li>second</li></ul>');
262 doc->find('li')->first()->precede('<li>zeroth</li>');
265 *Result:*
267 ``` html
268 <ul>
269     <li>zeroth</li>
270     <li>first</li>
271     <li>second</li>
272 </ul>
277 #### clone
280 NodeList|\DOMNode clone()
283 ##### Example
285 ``` php
286 $doc = (new Document())->html('<ul><li>Item</li></ul>');
287 $doc->find('div')->clone()->appendTo('ul'); 
290 *Result:*
292 ``` html
293 <ul><li>Item</li><li>Item</li></ul>
298 #### destroy
301 self destroy([string $selector = null])
304 ##### Example
306 ``` php
307 $doc = (new Document())->html('<ul><li class="first"></li><li class="second"></li></ul>');
308 $doc->find('.first')->destroy();
311 *Result:*
312 ``` html
313 <ul><li class="second"></li></ul>
318 #### detach
321 NodeList detach([string $selector = null])
324 ##### Example
326 ``` php
327 $doc = (new Document())->html('<ul class="first"><li>Item</li></ul><ul class="second"></ul>');
328 $el = $doc->find('ul.first li')->detach();
329 $doc->first('ul.second').append($el); 
332 *Result:*
334 ``` html
335 <ul class="first"></ul><ul class="second"><li>Item</li></ul>
340 #### empty
343 self empty()
346 ##### Example
348 ``` php
349 $doc = (new Document())->html('<div>The quick brown fox jumps over the lazy dog</div>');
350 $doc->find('div')->empty(); 
353 *Result:*
355 ``` html
356 <div></div>
361 #### hasClass
364 bool hasClass(string $class)
367 ##### Example
369 ``` php
370 $doc = (new Document())->html('<div class="text-center"></div>');
371 echo $doc->first('div')->hasClass('text-center');
374 *Result:*
376 ``` html
377 true
382 #### html
385 string|self html([string|NodeList|\DOMNode|callable $input = null])
388 ##### Example #1 (Set)
390 ``` php
391 $doc = (new Document());
392 $doc->html('<div class="example"></div>');
395 *Result:*
397 ``` html
398 <div class="example"></div>
401 ##### Example #1 (Get)
403 ``` php
404 $doc = (new Document())->html('<div class="example"></div>');
405 $doc->find('div')->appendWith('<span>Example!</span>');
406 echo $doc->html();
409 *Result:*
411 ``` html
412 <div class="example"><span>Example!</span></div>
417 #### prependWith
420 self prependWith(string|NodeList|\DOMNode|callable $input)
423 ##### Example
425 ``` php
426 $doc = (new Document())->html('<div>The quick brown fox jumps over the lazy dog</div>');
427 $doc->find('div')->prependWith('<strong>Prepended! </strong>');
430 *Result:*
432 ``` html
433 <div><strong>Prepended! </strong>The quick brown fox jumps over the lazy dog</div>
438 #### prependTo
441 self prependTo(string|NodeList|\DOMNode $selector)
444 ##### Example
446 ``` php
447 $doc = (new Document())->html('<div>The quick brown fox jumps over the lazy dog</div>');
448 $doc->create('<strong>Prepended! </strong>')->appendTo('div');
451 *Result:*
452 ``` html
453 <div><strong>Prepended! </strong>The quick brown fox jumps over the lazy dog</div>
458 #### removeAttr
461 self removeAttr(string $name)
464 ##### Example
466 ``` php
467 $doc = (new Document())->html('<div class="first second"></div>');
468 $doc->find('div').removeAttr('class');
471 *Result:*
472 ``` html
473 <div></div>
478 #### removeClass
481 self removeClass(string|callable $class)
484 ##### Example
486 ``` php
487 $doc = (new Document())->html('<div class="first second"></div>');
488 $doc->find('div').removeClass('first');
491 *Result:*
492 ``` html
493 <div class="second"></div>
498 #### substituteWith
501 self substituteWith(string|NodeList|\DOMNode|callable $input)
504 ##### Example
506 ``` php
511 #### text
514 string|self text([string|NodeList|\DOMNode|callable $input = null])
517 ##### Example
519 ``` php
524 #### unwrap
527 self unwrap()
530 Unwrap each current node by removing its parent, replacing the parent
531 with its children (i.e. the current node and its siblings).
533 Note that each node is operated on separately, so when you call
534 `unwrap()` on a `NodeList` containing two siblings, *two* parents will
535 be removed.
537 ##### Example
539 ``` php
540 $doc = (new Document())->html('<div id="outer"><div id="first"/><div id="second"/></div>');
541 $doc->find('#first')->unwrap();
544 *Result:*
546 ``` html
547 <div id="first"></div>
548 <div id="second"></div>
553 #### wrap
556 self wrap(string|NodeList|\DOMNode|callable $input)
559 Wrap the current node or nodes in the given structure.
561 The wrapping structure can be nested, but should only contain one node
562 on each level (any extra siblings are removed). The outermost node
563 replaces the node operated on, while the node operated on is put into
564 the innermost node.
566 If called on a `NodeList`, each of nodes in the list will be separately
567 wrapped. When such a list contains multiple nodes, the argument to
568 wrap() cannot be a `NodeList` or `\DOMNode`, since those can be used
569 to wrap a node only once. A string or callable returning a string or a
570 unique `NodeList` or `\DomNode` every time can be used in this case.
572 When a callable is passed, it is called once for each node operated on,
573 passing that node and its index. The callable should return either a
574 string, or a unique `NodeList` or `\DOMNode` ever time it is called.
576 Note that this returns the original node like all other methods, not the
577 (new) node(s) wrapped around it.
579 ##### Example
581 ``` php
582 $doc = (new Document())->html('<span>foo<span><span>bar</span>');
583 $doc->find->('span')->wrap('<div><p/></div>');
586 *Result:*
588 ``` html
589 <div><p><span>foo</span></p></div>
590 <div><p><span>bar</span></p></div>
596 #### wrapAll
599 self wrapAll(string|NodeList|\DOMNode|callable $input)
602 Like [wrap()](#wrap), but when operating on multiple nodes, all of them
603 will be wrapped together in a single instance of the given structure,
604 rather than each of them individually.
606 Note that the wrapping structure replaces the first node operated on, so
607 if the other nodes operated on are not siblings of the first, they will
608 be moved inside the document.
610 ##### Example
612 ``` php
613 $doc = (new Document())->html('<span>foo<span><span>bar</span>');
614 $doc->find->('span')->wrapAll('<div><p/></div>');
617 *Result:*
619 ``` html
620 <div><p>
621     <span>foo</span>
622     <span>bar</span>
623 </p></div>
628 #### wrapInner
631 self wrapInner(string|NodeList|\DOMNode|callable $input)
634 Like [wrap()](#wrap), but rather than wrapping the nodes that are being
635 operated on, this wraps their contents.
637 ##### Example
639 ``` php
640 $doc = (new Document())->html('<span>foo<span><span>bar</span>');
641 $doc->find('span')->wrapInner('<b><i/></b>');
644 *Result:*
646 ``` html
647 <span><b><i>foo</i></b></span>
648 <span><b><i>bar</i></b></span>
654 ### Traversal
656 #### add
659 NodeList add(string|NodeList|\DOMNode $input)
661     
662 Add additional node(s) to the existing set.
664 ##### Example
666 ``` php
667 $nodes = $doc->find('a');
668 $nodes->add($doc->find('p'));
673 #### children
676 NodeList children()
678     
679 Return all children of each element node in the current set.
681 ##### Example
683 ``` php
684 $nodes = $doc->find('p');
685 $childrenOfParagraphs = $nodes->children();
690 #### closest
693 Element|NodeList|null closest(string|NodeList|\DOMNode|callable $input)
695     
696 Return the first element matching the supplied input by traversing up through the ancestors of each node in the current set. 
698 ##### Example
700 ``` php
701 $nodes = $doc->find('a');
702 $closestAncestors = $nodes->closest('p');
707 #### contents
710 NodeList contents()
712     
713 Return all children of each node in the current set.
715 ##### Example
717 ``` php
718 $nodes = $doc->find('p');
719 $contents = $nodes->contents();
724 #### eq
727 \DOMNode|null eq(int $index)
729     
730 Return node in the current set at the specified index.
732 ##### Example
734 ``` php
735 $nodes = $doc->find('a');
736 $nodeAtIndexOne = $nodes->eq(1);
741 #### filter
744 NodeList filter(string|NodeList|\DOMNode|callable $input)
746     
747 Return nodes in the current set that match the input. 
749 ##### Example
751 ``` php
752 $nodes = $doc->filter('a')
753 $exampleATags = $nodes->filter('[href*=https://example.org/]');
758 #### find
761 NodeList find(string $selector[, string $prefix = 'descendant::'])
763     
764 Return the decendants of the current set filtered by the selector and optional XPath axes.
766 ##### Example
768 ``` php
769 $nodes = $doc->find('a');
774 #### first
777 mixed first()
779     
780 Return the first node of the current set.
782 ##### Example
784 ``` php
785 $nodes = $doc->find('a');
786 $firstNode = $nodes->first();
791 #### has
794 NodeList has(string|NodeList|\DOMNode|callable $input)
796     
797 Return nodes with decendants of the current set matching the input. 
799 ##### Example
801 ``` php
802 $nodes = $doc->find('a');
803 $anchorTags = $nodes->has('span');
808 #### is
811 bool is(string|NodeList|\DOMNode|callable $input)
813     
814 Test if nodes from the current set match the input. 
816 ##### Example
818 ``` php
819 $nodes = $doc->find('a');
820 $isAnchor = $nodes->is('[anchor]');
825 #### last
828 mixed last()
830     
831 Return the last node of the current set.
833 ##### Example
835 ``` php
836 $nodes = $doc->find('a');
837 $lastNode = $nodes->last();
842 #### map
845 NodeList map(callable $function)
847     
848 Apply a callback to nodes in the current set and return a new NodeList.
850 ##### Example
852 ``` php
853 $nodes = $doc->find('a');
854 $nodeValues = $nodes->map(function($node) {
855     return $node->nodeValue;
861 #### following
864 \DOMNode|null following([string|NodeList|\DOMNode|callable $selector = null])
866     
867 Return the sibling immediately following each element node in the current set. 
869 *Optionally filtered by selector.*
871 ##### Example
873 ``` php
874 $nodes = $doc->find('a');
875 $follwingNodes = $nodes->following();
880 #### followingAll
883 NodeList followingAll([string|NodeList|\DOMNode|callable $selector = null])
885     
886 Return all siblings following each element node in the current set.
888 *Optionally filtered by selector.*
890 ##### Example
892 ``` php
893 $nodes = $doc->find('a');
894 $follwingAllNodes = $nodes->followingAll('[anchor]');
899 #### followingUntil
902 NodeList followingUntil([[string|NodeList|\DOMNode|callable $input = null], string|NodeList|\DOMNode|callable $selector = null])
904     
905 Return all siblings following each element node in the current set upto but not including the node matched by $input.
907 *Optionally filtered by input.*<br>
908 *Optionally filtered by selector.*
910 ##### Example
912 ``` php
913 $nodes = $doc->find('a');
914 $follwingUntilNodes = $nodes->followingUntil('.submit');
919 #### not
922 NodeList not(string|NodeList|\DOMNode|callable $input)
924     
925 Return element nodes from the current set not matching the input. 
927 ##### Example
929 ``` php
930 $nodes = $doc->find('a');
931 $missingHrefAttribute = $nodes->not('[href]');
936 #### parent
939 Element|NodeList|null parent([string|NodeList|\DOMNode|callable $selector = null])
941     
942 Return the immediate parent of each element node in the current set. 
944 *Optionally filtered by selector.*
946 ##### Example
948 ``` php
949 $nodes = $doc->find('a');
950 $parentNodes = $nodes->parent();
955 #### parents
958 NodeList parent([string $selector = null])
960     
961 Return the ancestors of each element node in the current set. 
963 *Optionally filtered by selector.*
965 ##### Example
967 ``` php
968 $nodes = $doc->find('a');
969 $ancestorDivNodes = $nodes->parents('div');
974 #### parentsUntil
977 NodeList parentsUntil([[string|NodeList|\DOMNode|callable $input, [string|NodeList|\DOMNode|callable $selector = null])
979     
980 Return the ancestors of each element node in the current set upto but not including the node matched by $selector.
982 *Optionally filtered by input.*<br>
983 *Optionally filtered by selector.*
985 ##### Example
987 ``` php
988 $nodes = $doc->find('a');
989 $ancestorDivNodes = $nodes->parentsUntil('div');
994 #### preceding
997 \DOMNode|null preceding([string|NodeList|\DOMNode|callable $selector = null])
999     
1000 Return the sibling immediately preceding each element node in the current set. 
1002 *Optionally filtered by selector.*
1004 ##### Example
1006 ``` php
1007 $nodes = $doc->find('a');
1008 $precedingNodes = $nodes->preceding();
1013 #### precedingAll
1016 NodeList precedingAll([string|NodeList|\DOMNode|callable $selector = null])
1018     
1019 Return all siblings preceding each element node in the current set.
1021 *Optionally filtered by selector.*
1023 ##### Example
1025 ``` php
1026 $nodes = $doc->find('a');
1027 $precedingAllNodes = $nodes->precedingAll('[anchor]');
1031 #### precedingUntil
1034 NodeList precedingUntil([[string|NodeList|\DOMNode|callable $input = null], string|NodeList|\DOMNode|callable $selector = null])
1036     
1037 Return all siblings preceding each element node in the current set upto but not including the node matched by $input.
1039 *Optionally filtered by input.*<br>
1040 *Optionally filtered by selector.*
1042 ##### Example
1044 ``` php
1045 $nodes = $doc->find('a');
1046 $precedingUntilNodes = $nodes->precedingUntil('.submit');
1051 #### siblings
1054 NodeList siblings([[string|NodeList|\DOMNode|callable $selector = null])
1056     
1057 Return siblings of each element node in the current set.
1059 *Optionally filtered by selector.*
1061 ##### Example
1063 ``` php
1064 $nodes = $doc->find('p');
1065 $siblings = $nodes->siblings();
1070 #### slice
1073 NodeList slice(int $start[, int $end])
1075     
1076 Return a subset of the current set based on the start and end indexes.
1078 ##### Example
1080 ``` php
1081 $nodes = $doc->find('p');
1082 // Return nodes 1 through to 3 as a new NodeList
1083 $slicedNodes = $nodes->slice(1, 3);
1088 ### Additional Methods
1090 #### count
1093 int count()
1096 ##### Example
1098 ``` php
1099 $nodes = $doc->find('p');
1101 echo $nodes->count();
1106 #### each
1109 self each(callable $function)
1112 ##### Example
1114 ``` php
1115 $nodes = $doc->find('p');
1117 $nodes->each(function($node){
1118     echo $node->nodeName . "\n";
1122 ## Licensing
1124 PHP DOM Wrapper is licensed by Andrew Scott under the BSD 3-Clause License, see the LICENSE file for more details.