Add additional filter options to querySelectorAll too
This commit is contained in:
parent
ccc32617d9
commit
ad6b138129
@ -195,6 +195,41 @@ export class YXmlFragment extends AbstractType {
|
|||||||
* @public
|
* @public
|
||||||
*/
|
*/
|
||||||
querySelector (query) {
|
querySelector (query) {
|
||||||
|
const iterator = new YXmlTreeWalker(this, this._walkFilter(query))
|
||||||
|
const next = iterator.next()
|
||||||
|
|
||||||
|
if (next.done) {
|
||||||
|
return null
|
||||||
|
} else {
|
||||||
|
return next.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all YXmlElements that match the query.
|
||||||
|
* Similar to Dom's {@link querySelectorAll}.
|
||||||
|
*
|
||||||
|
* Query support:
|
||||||
|
* - tagname
|
||||||
|
* - id
|
||||||
|
* - attributes
|
||||||
|
*
|
||||||
|
* @param {CSS_Selector|Filters} query The query on the children.
|
||||||
|
* @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query.
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
querySelectorAll (query) {
|
||||||
|
return Array.from(new YXmlTreeWalker(this, this._walkFilter(query)))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates filter function to run against children when walking tree.
|
||||||
|
*
|
||||||
|
* @param {CSS_Selector|Filters} query The query on the children.
|
||||||
|
* @return {function(AbstractType<any>):boolean}
|
||||||
|
*/
|
||||||
|
_walkFilter (query) {
|
||||||
/**
|
/**
|
||||||
* @type {Filters}
|
* @type {Filters}
|
||||||
*/
|
*/
|
||||||
@ -211,7 +246,7 @@ export class YXmlFragment extends AbstractType {
|
|||||||
filters.tagname = filters.tagname.toUpperCase()
|
filters.tagname = filters.tagname.toUpperCase()
|
||||||
}
|
}
|
||||||
|
|
||||||
const iterator = new YXmlTreeWalker(this, element => {
|
return element => {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
if (filters.tagname && element.nodeName && element.nodeName.toUpperCase() === filters.tagname) {
|
if (filters.tagname && element.nodeName && element.nodeName.toUpperCase() === filters.tagname) {
|
||||||
return true
|
return true
|
||||||
@ -239,32 +274,9 @@ export class YXmlFragment extends AbstractType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
})
|
|
||||||
const next = iterator.next()
|
|
||||||
if (next.done) {
|
|
||||||
return null
|
|
||||||
} else {
|
|
||||||
return next.value
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns all YXmlElements that match the query.
|
|
||||||
* Similar to Dom's {@link querySelectorAll}.
|
|
||||||
*
|
|
||||||
* @todo Does not yet support all queries. Currently only query by tagName.
|
|
||||||
*
|
|
||||||
* @param {CSS_Selector} query The query on the children
|
|
||||||
* @return {Array<YXmlElement|YXmlText|YXmlHook|null>} The elements that match this query.
|
|
||||||
*
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
querySelectorAll (query) {
|
|
||||||
query = query.toUpperCase()
|
|
||||||
// @ts-ignore
|
|
||||||
return Array.from(new YXmlTreeWalker(this, element => element.nodeName && element.nodeName.toUpperCase() === query))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates YXmlEvent and calls observers.
|
* Creates YXmlEvent and calls observers.
|
||||||
*
|
*
|
||||||
|
@ -72,6 +72,9 @@ export const testTreewalker = tc => {
|
|||||||
t.assert(allParagraphs.length === 2, 'found exactly two paragraphs')
|
t.assert(allParagraphs.length === 2, 'found exactly two paragraphs')
|
||||||
t.assert(allParagraphs[0] === paragraph1, 'querySelectorAll found paragraph1')
|
t.assert(allParagraphs[0] === paragraph1, 'querySelectorAll found paragraph1')
|
||||||
t.assert(allParagraphs[1] === paragraph2, 'querySelectorAll found paragraph2')
|
t.assert(allParagraphs[1] === paragraph2, 'querySelectorAll found paragraph2')
|
||||||
|
t.assert(xml0.querySelectorAll({ tagname: 'p' }).length === 2, 'found exactly two paragraphs by tagname')
|
||||||
|
t.assert(xml0.querySelectorAll({ id: paragraph1ID })[0] === paragraph1, 'querySelectorAll found paragraph1 by id')
|
||||||
|
t.assert(xml0.querySelectorAll({ attributes: { custom: '123' } })[0] === paragraph1, 'querySelectorAll found paragraph1 by attribute')
|
||||||
t.assert(xml0.querySelector('p') === paragraph1, 'querySelector found paragraph1 by string query')
|
t.assert(xml0.querySelector('p') === paragraph1, 'querySelector found paragraph1 by string query')
|
||||||
t.assert(xml0.querySelector({ tagname: 'p' }) === paragraph1, 'querySelector found paragraph1 by tagname')
|
t.assert(xml0.querySelector({ tagname: 'p' }) === paragraph1, 'querySelector found paragraph1 by tagname')
|
||||||
t.assert(xml0.querySelector({ id: paragraph1ID }) === paragraph1, 'querySelector found paragraph1 by id')
|
t.assert(xml0.querySelector({ id: paragraph1ID }) === paragraph1, 'querySelector found paragraph1 by id')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user