@@ -25,7 +25,7 @@ export function parseDOM(markup) {
2525
2626const Document_Level = [ '#document' , 'html' , 'head' , 'body' ] ,
2727 serializer = new XMLSerializer ( ) ,
28- documentXML = document . implementation . createDocument ( null , 'xml' ) ;
28+ documentXML = document . implementation . createDocument ( null , 'xml' , null ) ;
2929
3030function stringOf ( node ) {
3131 if ( node . querySelectorAll )
@@ -64,12 +64,13 @@ export function stringifyDOM(list) {
6464}
6565
6666/**
67- * @param {Node } root
67+ * @param {Node } root
6868 * @param {function(node: Node): Number } [filter] - https://developer.mozilla.org/en-US/docs/Web/API/NodeFilter/acceptNode
69+ * @param {Boolean } [sub] - Go into Sub DOM
6970 *
7071 * @yield {Node}
7172 */
72- export function * walkDOM ( root , filter ) {
73+ export function * walkDOM ( root , filter , sub ) {
7374 var iterator = document . createNodeIterator ( root , NodeFilter . SHOW_ALL , {
7475 acceptNode :
7576 filter instanceof Function
@@ -78,7 +79,16 @@ export function* walkDOM(root, filter) {
7879 } ) ,
7980 node ;
8081
81- while ( ( node = iterator . nextNode ( ) ) ) yield node ;
82+ while ( ( node = iterator . nextNode ( ) ) ) {
83+ yield node ;
84+
85+ if ( ! sub ) continue ;
86+
87+ const subDOM = node . content || node . shadowRoot ;
88+
89+ if ( subDOM instanceof DocumentFragment )
90+ yield * walkDOM ( subDOM , filter , sub ) ;
91+ }
8292}
8393
8494/**
@@ -89,26 +99,29 @@ export function* walkDOM(root, filter) {
8999 * @param {function(text: Text): void } parser.text
90100 * @param {... function(node: Element): Boolean } parser.element - Key for CSS selector, Value for Callback
91101 */
92- export function scanTemplate (
93- root ,
94- expression ,
95- { attribute, text, ...element }
96- ) {
102+ export function scanDOM ( root , expression , { attribute, text, ...element } ) {
103+ function scanAttr ( node ) {
104+ Array . from ( node . attributes ) . forEach (
105+ attr => expression . test ( attr . value ) && attribute ( attr )
106+ ) ;
107+ }
108+
97109 const iterator = walkDOM ( root , node => {
98- if ( node . matches )
110+ if ( node . matches ) {
111+ scanAttr ( node ) ;
112+
99113 for ( let selector in element )
100114 if ( node . matches ( selector ) && element [ selector ] ( node ) === false )
101115 return NodeFilter . FILTER_REJECT ;
116+ }
102117
103118 return NodeFilter . FILTER_ACCEPT ;
104119 } ) ;
105120
106121 Array . from ( iterator , node => {
107122 switch ( node . nodeType ) {
108123 case 1 :
109- Array . from ( node . attributes ) . forEach (
110- attr => expression . test ( attr . value ) && attribute ( attr )
111- ) ;
124+ scanAttr ( node ) ;
112125 break ;
113126 case 3 :
114127 if ( expression . test ( node . nodeValue ) ) text ( node ) ;
0 commit comments