82b35ef4 by Adam Heath

Allow for finding multiple matching nodes.

1 parent 3312ebad
...@@ -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})
409 const matcher = createMatcher(selector) 408 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 if (matcher(node, parent, index)) {
414 found.push(node)
415 if (options.single) throw node
416 }
413 }) 417 })
414 } catch (e) { 418 } catch (e) {
415 if (e instanceof Error) throw e 419 if (e instanceof Error) throw e
416 docCache.set(selector, [ e ])
417 return e
418 } 420 }
421 docCache.set(selector, found)
422 }
423 return options.single ? found[ 0 ] : found
419 } 424 }
......