Allow for finding multiple matching nodes.
Showing
1 changed file
with
18 additions
and
13 deletions
| ... | @@ -396,24 +396,29 @@ export const parseHtml = (html: string, options): NodeType => { | ... | @@ -396,24 +396,29 @@ export const parseHtml = (html: string, options): NodeType => { | 
| 396 | return proxyNode(cached, options) | 396 | return proxyNode(cached, options) | 
| 397 | } | 397 | } | 
| 398 | 398 | ||
| 399 | export const findNode = (doc: NodeType, selector: string): NodeType => { | 399 | export const findNode = (doc: NodeType, selector: string, options = { single: true }): NodeType => { | 
| 400 | if (!selector) return doc | 400 | if (!selector) return doc | 
| 401 | let docCache = findNodeCache.get(doc) | 401 | let docCache = findNodeCache.get(doc) | 
| 402 | if (!docCache) { | 402 | if (!docCache) { | 
| 403 | docCache = new TTLCache({ ttl: 10*60 }) | 403 | docCache = new TTLCache({ ttl: 10*60 }) | 
| 404 | findNodeCache.set(doc, docCache) | 404 | findNodeCache.set(doc, docCache) | 
| 405 | } | 405 | } | 
| 406 | const found = docCache.get(selector) | 406 | let found = docCache.get(selector) | 
| 407 | if (found !== undefined) return found[0] | 407 | if (found === undefined) { | 
| 408 | //console.log('cache miss', {selector}) | 408 | const matcher = createMatcher(selector) | 
| 409 | const matcher = createMatcher(selector) | 409 | found = [] | 
| 410 | try { | 410 | try { | 
| 411 | walkSync(doc, (node, parent, index) => { | 411 | walkSync(doc, (node, parent, index) => { | 
| 412 | if (matcher(node, parent, index)) throw node | 412 | if (node && node.type !== ELEMENT_NODE) return | 
| 413 | }) | 413 | if (matcher(node, parent, index)) { | 
| 414 | } catch (e) { | 414 | found.push(node) | 
| 415 | if (e instanceof Error) throw e | 415 | if (options.single) throw node | 
| 416 | docCache.set(selector, [ e ]) | 416 | } | 
| 417 | return e | 417 | }) | 
| 418 | } catch (e) { | ||
| 419 | if (e instanceof Error) throw e | ||
| 420 | } | ||
| 421 | docCache.set(selector, found) | ||
| 418 | } | 422 | } | 
| 423 | return options.single ? found[ 0 ] : found | ||
| 419 | } | 424 | } | ... | ... | 
- 
Please register or sign in to post a comment