summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/bg/js/dictionary.js24
-rw-r--r--ext/bg/js/options.js1
-rw-r--r--ext/bg/js/settings.js2
-rw-r--r--ext/bg/js/translator.js22
-rw-r--r--ext/bg/settings.html4
-rw-r--r--ext/fg/js/float.js18
-rw-r--r--ext/fg/js/frontend.js1
-rw-r--r--ext/fg/js/popup.js6
-rw-r--r--ext/mixed/js/display.js15
9 files changed, 72 insertions, 21 deletions
diff --git a/ext/bg/js/dictionary.js b/ext/bg/js/dictionary.js
index fea5f3e5..368bb18d 100644
--- a/ext/bg/js/dictionary.js
+++ b/ext/bg/js/dictionary.js
@@ -245,22 +245,26 @@ function dictTermsMergeByGloss(result, definitions, appendTo, mergedIndices) {
result.expression.add(definition.expression);
result.reading.add(definition.reading);
- // result->expressions[ Expression1[ Reading1[ Tag1, Tag2 ] ], Expression2, ... ]
- if (!result.expressions.has(definition.expression)) {
- result.expressions.set(definition.expression, new Map());
- }
- if (!result.expressions.get(definition.expression).has(definition.reading)) {
- result.expressions.get(definition.expression).set(definition.reading, new Set());
- }
-
for (const tag of definition.definitionTags) {
if (!definitionsByGloss[gloss].definitionTags.find(existingTag => existingTag.name === tag.name)) {
definitionsByGloss[gloss].definitionTags.push(tag);
}
}
- for (const tag of definition.termTags) {
- result.expressions.get(definition.expression).get(definition.reading).add(tag);
+ if (!appendTo) {
+ // result->expressions[ Expression1[ Reading1[ Tag1, Tag2 ] ], Expression2, ... ]
+ if (!result.expressions.has(definition.expression)) {
+ result.expressions.set(definition.expression, new Map());
+ }
+ if (!result.expressions.get(definition.expression).has(definition.reading)) {
+ result.expressions.get(definition.expression).set(definition.reading, []);
+ }
+
+ for (const tag of definition.termTags) {
+ if (!result.expressions.get(definition.expression).get(definition.reading).find(existingTag => existingTag.name === tag.name)) {
+ result.expressions.get(definition.expression).get(definition.reading).push(tag);
+ }
+ }
}
}
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js
index 925c8432..373a1a6b 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -185,6 +185,7 @@ function optionsSetDefaults(options) {
enable: true,
audioSource: 'jpod101',
audioVolume: 100,
+ autoPlayAudio: false,
resultOutputMode: 'group',
debugInfo: false,
maxResults: 32,
diff --git a/ext/bg/js/settings.js b/ext/bg/js/settings.js
index dcc9c43d..7bc6a651 100644
--- a/ext/bg/js/settings.js
+++ b/ext/bg/js/settings.js
@@ -24,6 +24,7 @@ async function formRead() {
optionsNew.general.showGuide = $('#show-usage-guide').prop('checked');
optionsNew.general.compactTags = $('#compact-tags').prop('checked');
optionsNew.general.compactGlossaries = $('#compact-glossaries').prop('checked');
+ optionsNew.general.autoPlayAudio = $('#auto-play-audio').prop('checked');
optionsNew.general.resultOutputMode = $('#result-output-mode').val();
optionsNew.general.audioSource = $('#audio-playback-source').val();
optionsNew.general.audioVolume = parseFloat($('#audio-playback-volume').val());
@@ -153,6 +154,7 @@ async function onReady() {
$('#show-usage-guide').prop('checked', options.general.showGuide);
$('#compact-tags').prop('checked', options.general.compactTags);
$('#compact-glossaries').prop('checked', options.general.compactGlossaries);
+ $('#auto-play-audio').prop('checked', options.general.autoPlayAudio);
$('#result-output-mode').val(options.general.resultOutputMode);
$('#audio-playback-source').val(options.general.audioSource);
$('#audio-playback-volume').val(options.general.audioVolume);
diff --git a/ext/bg/js/translator.js b/ext/bg/js/translator.js
index 005dd5de..c6af1f4e 100644
--- a/ext/bg/js/translator.js
+++ b/ext/bg/js/translator.js
@@ -75,9 +75,11 @@ class Translator {
const rawDefinitionsBySequence = await this.database.findTermsBySequence(Number(sequence), options.general.mainDictionary);
for (const definition of rawDefinitionsBySequence) {
- const tags = await this.expandTags(definition.definitionTags, definition.dictionary);
- tags.push(dictTagBuildSource(definition.dictionary));
- definition.definitionTags = tags;
+ const definitionTags = await this.expandTags(definition.definitionTags, definition.dictionary);
+ definitionTags.push(dictTagBuildSource(definition.dictionary));
+ definition.definitionTags = definitionTags;
+ const termTags = await this.expandTags(definition.termTags, definition.dictionary);
+ definition.termTags = termTags;
}
const definitionsByGloss = dictTermsMergeByGloss(result, rawDefinitionsBySequence);
@@ -91,9 +93,11 @@ class Translator {
for (const reading of result.expressions.get(expression).keys()) {
for (const definition of await this.database.findTermsExact(expression, reading, secondarySearchTitles)) {
- const tags = await this.expandTags(definition.definitionTags, definition.dictionary);
- tags.push(dictTagBuildSource(definition.dictionary));
- definition.definitionTags = tags;
+ const definitionTags = await this.expandTags(definition.definitionTags, definition.dictionary);
+ definitionTags.push(dictTagBuildSource(definition.dictionary));
+ definition.definitionTags = definitionTags;
+ const termTags = await this.expandTags(definition.termTags, definition.dictionary);
+ definition.termTags = termTags;
secondarySearchResults.push(definition);
}
}
@@ -113,11 +117,11 @@ class Translator {
const expressions = [];
for (const expression of result.expressions.keys()) {
for (const reading of result.expressions.get(expression).keys()) {
- const tags = await this.expandTags(result.expressions.get(expression).get(reading), result.dictionary);
+ const termTags = result.expressions.get(expression).get(reading);
expressions.push({
expression: expression,
reading: reading,
- termTags: dictTagsSort(tags),
+ termTags: dictTagsSort(termTags),
termFrequency: (score => {
if (score > 0) {
return 'popular';
@@ -126,7 +130,7 @@ class Translator {
} else {
return 'normal';
}
- })(tags.map(tag => tag.score).reduce((p, v) => p + v, 0))
+ })(termTags.map(tag => tag.score).reduce((p, v) => p + v, 0))
});
}
}
diff --git a/ext/bg/settings.html b/ext/bg/settings.html
index 65043d44..c77f550c 100644
--- a/ext/bg/settings.html
+++ b/ext/bg/settings.html
@@ -44,6 +44,10 @@
</div>
<div class="checkbox">
+ <label><input type="checkbox" id="auto-play-audio"> Play audio automatically</label>
+ </div>
+
+ <div class="checkbox">
<label><input type="checkbox" id="show-advanced-options"> Show advanced options</label>
</div>
diff --git a/ext/fg/js/float.js b/ext/fg/js/float.js
index ff50483d..1f08702d 100644
--- a/ext/fg/js/float.js
+++ b/ext/fg/js/float.js
@@ -20,6 +20,8 @@
class DisplayFloat extends Display {
constructor() {
super($('#spinner'), $('#definitions'));
+ this.autoPlayAudioTimer = null;
+
$(window).on('message', utilAsync(this.onMessage.bind(this)));
}
@@ -54,6 +56,10 @@ class DisplayFloat extends Display {
this.kanjiShow(definitions, options, context);
},
+ clearAutoPlayTimer: () => {
+ this.clearAutoPlayTimer();
+ },
+
orphaned: () => {
this.onOrphaned();
}
@@ -83,6 +89,18 @@ class DisplayFloat extends Display {
super.onKeyDown(e);
}
}
+
+ autoPlayAudio() {
+ this.clearAutoPlayTimer();
+ this.autoPlayAudioTimer = window.setTimeout(() => super.autoPlayAudio(), 400);
+ }
+
+ clearAutoPlayTimer() {
+ if (this.autoPlayAudioTimer) {
+ window.clearTimeout(this.autoPlayAudioTimer);
+ this.autoPlayAudioTimer = null;
+ }
+ }
}
window.yomichan_display = new DisplayFloat();
diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js
index 3a90b3ad..266f9640 100644
--- a/ext/fg/js/frontend.js
+++ b/ext/fg/js/frontend.js
@@ -254,6 +254,7 @@ class Frontend {
searchClear() {
docImposterDestroy();
this.popup.hide();
+ this.popup.clearAutoPlayTimer();
if (this.options.scanning.selectText && this.textSourceLast) {
this.textSourceLast.deselect();
diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js
index d1009fe9..a17b184a 100644
--- a/ext/fg/js/popup.js
+++ b/ext/fg/js/popup.js
@@ -125,6 +125,12 @@ class Popup {
this.invokeApi('kanjiShow', {definitions, options, context});
}
+ clearAutoPlayTimer() {
+ if (this.injected) {
+ this.invokeApi('clearAutoPlayTimer');
+ }
+ }
+
invokeApi(action, params={}) {
this.container.contentWindow.postMessage({action, params}, '*');
}
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js
index 5d3c4f2e..43eb93c1 100644
--- a/ext/mixed/js/display.js
+++ b/ext/mixed/js/display.js
@@ -185,8 +185,7 @@ class Display {
80: /* p */ () => {
if (e.altKey) {
if ($('.entry').eq(this.index).data('type') === 'term') {
- const expressionIndex = this.options.general.resultOutputMode === 'merge' ? 0 : -1;
- this.audioPlay(this.definitions[this.index], expressionIndex);
+ this.audioPlay(this.definitions[this.index], this.firstExpressionIndex);
}
return true;
@@ -258,6 +257,10 @@ class Display {
this.container.html(content);
this.entryScrollIntoView(context && context.index || 0);
+ if (this.options.general.autoPlayAudio && this.options.general.audioSource !== 'disabled') {
+ this.autoPlayAudio();
+ }
+
$('.action-add-note').click(this.onNoteAdd.bind(this));
$('.action-view-note').click(this.onNoteView.bind(this));
$('.action-play-audio').click(this.onAudioPlay.bind(this));
@@ -309,6 +312,10 @@ class Display {
}
}
+ autoPlayAudio() {
+ this.audioPlay(this.definitions[0], this.firstExpressionIndex);
+ }
+
async adderButtonUpdate(modes, sequence) {
try {
const states = await apiDefinitionsAddable(this.definitions, modes);
@@ -422,6 +429,10 @@ class Display {
}
}
+ get firstExpressionIndex() {
+ return this.options.general.resultOutputMode === 'merge' ? 0 : -1;
+ }
+
static clozeBuild(sentence, source) {
const result = {
sentence: sentence.text.trim()