diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-09-10 11:30:01 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-10 11:30:01 -0400 |
commit | 17ebe6a754d53fad97ab607f17e2bba8d8565361 (patch) | |
tree | bb08462d21c2726f563f955685bed726abf12d61 /ext/bg/js/audio-uri-builder.js | |
parent | 58e5ddfde00eb28ac3a12cd2c83c1088a63d7d23 (diff) |
Create abstraction class for parsing DOM (#798)
Diffstat (limited to 'ext/bg/js/audio-uri-builder.js')
-rw-r--r-- | ext/bg/js/audio-uri-builder.js | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/ext/bg/js/audio-uri-builder.js b/ext/bg/js/audio-uri-builder.js index a6b563d8..1c64e008 100644 --- a/ext/bg/js/audio-uri-builder.js +++ b/ext/bg/js/audio-uri-builder.js @@ -16,6 +16,7 @@ */ /* global + * SimpleDOMParser * jp */ @@ -99,12 +100,23 @@ class AudioUriBuilder { }); const responseText = await response.text(); - const dom = new DOMParser().parseFromString(responseText, 'text/html'); + const dom = new SimpleDOMParser(responseText); for (const row of dom.getElementsByClassName('dc-result-row')) { try { - const url = row.querySelector('audio>source[src]').getAttribute('src'); - const reading = row.getElementsByClassName('dc-vocab_kana').item(0).textContent; - if (url && reading && (!definition.reading || definition.reading === reading)) { + const audio = dom.getElementByTagName('audio', row); + if (audio === null) { continue; } + + const source = dom.getElementByTagName('source', audio); + if (source === null) { continue; } + + const url = dom.getAttribute(source, 'src'); + if (url === null) { continue; } + + const readings = dom.getElementsByClassName('dc-vocab_kana'); + if (readings.length === 0) { continue; } + + const reading = dom.getTextContent(readings[0]); + if (reading && (!definition.reading || definition.reading === reading)) { return this.normalizeUrl(url, 'https://www.japanesepod101.com', '/learningcenter/reference/'); } } catch (e) { @@ -127,13 +139,16 @@ class AudioUriBuilder { }); const responseText = await response.text(); - const dom = new DOMParser().parseFromString(responseText, 'text/html'); + const dom = new SimpleDOMParser(responseText); try { const audio = dom.getElementById(`audio_${definition.expression}:${definition.reading}`); if (audio !== null) { - const url = audio.getElementsByTagName('source').item(0).getAttribute('src'); - if (url) { - return this.normalizeUrl(url, 'https://jisho.org', '/search/'); + const source = dom.getElementByTagName('source', audio); + if (source !== null) { + const url = dom.getAttribute(source, 'src'); + if (url !== null) { + return this.normalizeUrl(url, 'https://jisho.org', '/search/'); + } } } } catch (e) { |