3497e932 by Adam Heath

Add options when parsing html, and if for react use, map certain

attributes.
1 parent 3f061832
...@@ -307,9 +307,17 @@ export const createMatcher = (selector: string): Matcher => { ...@@ -307,9 +307,17 @@ export const createMatcher = (selector: string): Matcher => {
307 return newMatcherCreater() 307 return newMatcherCreater()
308 } 308 }
309 309
310 const reactAttributeMap = {
311 'class': 'className',
312 'srcset': 'srcSet',
313 'maxlength': 'maxLength',
314 }
315
310 class NodeProxyHandler { 316 class NodeProxyHandler {
317 #options
311 #cache 318 #cache
312 constructor() { 319 constructor(options = {}) {
320 this.#options = options
313 this.#cache = {} 321 this.#cache = {}
314 } 322 }
315 323
...@@ -321,13 +329,18 @@ class NodeProxyHandler { ...@@ -321,13 +329,18 @@ class NodeProxyHandler {
321 switch (prop) { 329 switch (prop) {
322 case 'attributes': 330 case 'attributes':
323 return this.#cache[ prop ] = (origValue ? Object.fromEntries(Object.entries(origValue).map(([ key, value ]) => { 331 return this.#cache[ prop ] = (origValue ? Object.fromEntries(Object.entries(origValue).map(([ key, value ]) => {
324 return [ key, decode(value) ] 332 const decoded = decode(value)
333 if (this.#options.react) {
334 const { [ key ]: newKey } = reactAttributeMap
335 if (newKey) return [ newKey, decoded ]
336 }
337 return [ key, decoded ]
325 })) : origValue) 338 })) : origValue)
326 return newValue 339 return newValue
327 case 'parent': 340 case 'parent':
328 return this.#cache[ prop ] = proxyNode(origValue) 341 return this.#cache[ prop ] = proxyNode(origValue, this.#options)
329 case 'children': 342 case 'children':
330 return this.#cache[ prop ] = origValue.map((child) => proxyNode(child)) 343 return this.#cache[ prop ] = origValue.map((child) => proxyNode(child, this.#options))
331 default: 344 default:
332 if (typeof origValue === 'function') { 345 if (typeof origValue === 'function') {
333 return this.#cache[ prop ] = (...args) => { 346 return this.#cache[ prop ] = (...args) => {
...@@ -339,16 +352,16 @@ class NodeProxyHandler { ...@@ -339,16 +352,16 @@ class NodeProxyHandler {
339 } 352 }
340 } 353 }
341 354
342 const proxyNode = (node) => { 355 const proxyNode = (node, options) => {
343 return new Proxy(node, new NodeProxyHandler()) 356 return new Proxy(node, new NodeProxyHandler(options))
344 } 357 }
345 358
346 export const parseHtml = (html: string): NodeType => { 359 export const parseHtml = (html: string, options): NodeType => {
347 const cached = parsedHtmlCache.get(html) 360 const cached = parsedHtmlCache.get(html)
348 if (cached) return proxyNode(cached) 361 if (cached) return proxyNode(cached, options)
349 const doc = ultraParse(html) 362 const doc = ultraParse(html)
350 parsedHtmlCache.set(html, doc) 363 parsedHtmlCache.set(html, doc)
351 return proxyNode(doc) 364 return proxyNode(doc, options)
352 } 365 }
353 366
354 export const findNode = (doc: NodeType, selector: string): NodeType => { 367 export const findNode = (doc: NodeType, selector: string): NodeType => {
......