diff options
-rw-r--r-- | ext/fg/frame.html | 1 | ||||
-rw-r--r-- | ext/fg/js/frame.js | 47 |
2 files changed, 33 insertions, 15 deletions
diff --git a/ext/fg/frame.html b/ext/fg/frame.html index 32758786..8246787b 100644 --- a/ext/fg/frame.html +++ b/ext/fg/frame.html @@ -13,6 +13,7 @@ <div class="content"></div> <script src="../lib/jquery-2.2.2.min.js"></script> + <script src="js/util.js"></script> <script src="js/frame.js"></script> </body> </html> diff --git a/ext/fg/js/frame.js b/ext/fg/js/frame.js index e3d152c1..fc758ffe 100644 --- a/ext/fg/js/frame.js +++ b/ext/fg/js/frame.js @@ -88,6 +88,9 @@ class FrameContext { constructor() { + this.definitions = []; + this.audio = {}; + $(window).on('message', e => { const {action, params} = e.originalEvent.data, method = this['api_' + action]; if (typeof(method) === 'function') { @@ -103,8 +106,20 @@ class FrameContext { playback: options.enableAudioPlayback }; - this.renderText('term-list.html', context).then(content => { + this.definitions = definitions; + renderText(context, 'term-list.html').then(content => { $('.content').html(content); + + $('.kanji-link').click(e => { + e.preventDefault(); + findKanji($(e.target).text()).then(defs => this.api_showKanjiDefs({options, definitions: defs})); + }); + + $('.action-play-audio').click(e => { + e.preventDefault(); + const index = $(e.currentTarget).data('index'); + this.playAudio(this.definitions[index]); + }); }); } @@ -114,25 +129,27 @@ class FrameContext { addable: options.ankiMethod !== 'disabled' }; - this.renderText('kanji-list.html', context).then(content => { + this.definitions = definitions; + renderText(context, 'kanji-list.html').then(content => { $('.content').html(content); }); } - renderText(template, data) { - return this.invokeBgApi('renderText', {data, template}); - } + playAudio(definition) { + let url = `https://assets.languagepod101.com/dictionary/japanese/audiomp3.php?kanji=${encodeURIComponent(definition.expression)}`; + if (definition.reading) { + url += `&kana=${encodeURIComponent(definition.reading)}`; + } - invokeBgApi(action, params) { - return new Promise((resolve, reject) => { - chrome.runtime.sendMessage({action, params}, ({result, error}) => { - if (error) { - reject(error); - } else { - resolve(result); - } - }); - }); + for (const key in this.audio) { + this.audio[key].pause(); + } + + const audio = this.audio[url] || new Audio(url); + audio.currentTime = 0; + audio.play(); + + this.audio[url] = audio; } } |