diff options
| author | Alex Yatskov <alex@foosoft.net> | 2017-03-25 10:05:03 -0700 | 
|---|---|---|
| committer | Alex Yatskov <alex@foosoft.net> | 2017-03-25 10:05:03 -0700 | 
| commit | 0e167876923ba6f20c8b84e518436f2b523e06f9 (patch) | |
| tree | 0f8731272038a4f7032548c52653bc41a97fab3a | |
| parent | 4e5ded5735f353428ad0497923d43e9bd3db8645 (diff) | |
refactor
| -rw-r--r-- | ext/bg/search.html | 1 | ||||
| -rw-r--r-- | ext/fg/frame.html | 1 | ||||
| -rw-r--r-- | ext/mixed/js/display.js | 76 | ||||
| -rw-r--r-- | ext/mixed/js/util.js | 80 | 
4 files changed, 84 insertions, 74 deletions
| diff --git a/ext/bg/search.html b/ext/bg/search.html index 2fd44fc7..b8ab21b0 100644 --- a/ext/bg/search.html +++ b/ext/bg/search.html @@ -34,6 +34,7 @@          <script src="/mixed/lib/jquery-3.1.1.min.js"></script>          <script src="/bg/js/util.js"></script> +        <script src="/mixed/js/util.js"></script>          <script src="/mixed/js/display.js"></script>          <script src="/mixed/lib/wanakana.min.js"></script>          <script src="/bg/js/display-window.js"></script> diff --git a/ext/fg/frame.html b/ext/fg/frame.html index 09d1689e..35bc0284 100644 --- a/ext/fg/frame.html +++ b/ext/fg/frame.html @@ -33,6 +33,7 @@          <script src="/mixed/lib/jquery-3.1.1.min.js"></script>          <script src="/mixed/lib/wanakana.min.js"></script>          <script src="/fg/js/util.js"></script> +        <script src="/mixed/js/util.js"></script>          <script src="/mixed/js/display.js"></script>          <script src="/fg/js/display-frame.js"></script>      </body> diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index c7f20a92..29a292c1 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -256,7 +256,7 @@ class Display {          if (mode !== 'kanji') {              const filename = Display.audioBuildFilename(definition);              if (filename) { -                promise = this.audioBuildUrl(definition).then(url => definition.audio = {url, filename}).catch(() => {}); +                promise = audioBuildUrl(definition, this.responseCache).then(url => definition.audio = {url, filename}).catch(() => {});              }          } @@ -279,7 +279,7 @@ class Display {              this.audioCache[key].pause();          } -        this.audioBuildUrl(definition).then(url => { +        audioBuildUrl(definition, this.responseCache).then(url => {              if (!url) {                  url = '/mixed/mp3/button.mp3';              } @@ -302,78 +302,6 @@ class Display {          }).catch(this.handleError.bind(this)).then(() => this.spinner.hide());      } -    audioBuildUrl(definition) { -        return new Promise((resolve, reject) => { -            const response = this.responseCache[definition.expression]; -            if (response) { -                resolve(response); -            } else { -                const data = { -                    post: 'dictionary_reference', -                    match_type: 'exact', -                    search_query: definition.expression -                }; - -                const params = []; -                for (const key in data) { -                    params.push(`${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`); -                } - -                const xhr = new XMLHttpRequest(); -                xhr.open('POST', 'https://www.japanesepod101.com/learningcenter/reference/dictionary_post'); -                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); -                xhr.addEventListener('error', () => reject('failed to scrape audio data')); -                xhr.addEventListener('load', () => { -                    this.responseCache[definition.expression] = xhr.responseText; -                    resolve(xhr.responseText); -                }); - -                xhr.send(params.join('&')); -            } -        }).then(response => { -            const dom = new DOMParser().parseFromString(response, 'text/html'); -            const entries = []; - -            for (const row of dom.getElementsByClassName('dc-result-row')) { -                try { -                    const url = row.getElementsByClassName('ill-onebuttonplayer').item(0).getAttribute('data-url'); -                    const expression = row.getElementsByClassName('dc-vocab').item(0).innerText; -                    const reading = row.getElementsByClassName('dc-vocab_kana').item(0).innerText; - -                    if (url && expression && reading) { -                        entries.push({url, expression, reading}); -                    } -                } catch (e) { -                    // NOP -                } -            } - -            return entries; -        }).then(entries => { -            for (const entry of entries) { -                if (!definition.reading || definition.reading === entry.reading) { -                    return entry.url; -                } -            } -        }); -    } - -    static audioBuildFilename(definition) { -        if (!definition.reading && !definition.expression) { -            return; -        } - -        let filename = 'yomichan'; -        if (definition.reading) { -            filename += `_${definition.reading}`; -        } -        if (definition.expression) { -            filename += `_${definition.expression}`; -        } - -        return filename += '.mp3'; -    } -      static entryIndexFind(element) {          return $('.entry').index(element.closest('.entry'));      } diff --git a/ext/mixed/js/util.js b/ext/mixed/js/util.js new file mode 100644 index 00000000..13f124a0 --- /dev/null +++ b/ext/mixed/js/util.js @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2017  Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + + +/* + * Audio + */ + +function audioBuildUrl(definition, cache) { +    return new Promise((resolve, reject) => { +        const response = cache[definition.expression]; +        if (response) { +            resolve(response); +        } else { +            const data = { +                post: 'dictionary_reference', +                match_type: 'exact', +                search_query: definition.expression +            }; + +            const params = []; +            for (const key in data) { +                params.push(`${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`); +            } + +            const xhr = new XMLHttpRequest(); +            xhr.open('POST', 'https://www.japanesepod101.com/learningcenter/reference/dictionary_post'); +            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); +            xhr.addEventListener('error', () => reject('failed to scrape audio data')); +            xhr.addEventListener('load', () => { +                cache[definition.expression] = xhr.responseText; +                resolve(xhr.responseText); +            }); + +            xhr.send(params.join('&')); +        } +    }).then(response => { +        const dom = new DOMParser().parseFromString(response, 'text/html'); +        for (const row of dom.getElementsByClassName('dc-result-row')) { +            try { +                const url = row.getElementsByClassName('ill-onebuttonplayer').item(0).getAttribute('data-url'); +                const reading = row.getElementsByClassName('dc-vocab_kana').item(0).innerText; +                if (url && reading && (!definition.reading || definition.reading === reading)) { +                    return url; +                } +            } catch (e) { +                // NOP +            } +        } +    }); +} + +function audioBuildFilename(definition) { +    if (definition.reading && definition.expression) { +        let filename = 'yomichan'; +        if (definition.reading) { +            filename += `_${definition.reading}`; +        } +        if (definition.expression) { +            filename += `_${definition.expression}`; +        } + +        return filename += '.mp3'; +    } +} |