diff --git a/README.md b/README.md index 4949308f15..3b29a2278c 100644 --- a/README.md +++ b/README.md @@ -128,4 +128,4 @@ Yomitan uses several third-party libraries to function. ## Attribution -`button.mp3` is provided by [UNIVERSFIELD](https://pixabay.com/sound-effects/error-8-206492/) and licensed under the [Pixabay Content License](https://pixabay.com/service/license-summary/). +`fallback-bloop.mp3` is provided by [UNIVERSFIELD](https://pixabay.com/sound-effects/error-8-206492/) and licensed under the [Pixabay Content License](https://pixabay.com/service/license-summary/). diff --git a/dev/data/manifest-variants.json b/dev/data/manifest-variants.json index 0dd2a22f6b..5b7e1bdb80 100644 --- a/dev/data/manifest-variants.json +++ b/dev/data/manifest-variants.json @@ -33,6 +33,9 @@ "service_worker": "sw.js", "type": "module" }, + "omnibox": { + "keyword": "yomi" + }, "content_scripts": [ { "run_at": "document_idle", diff --git a/ext/css/display.css b/ext/css/display.css index d76f202c87..c74f7e2aaf 100644 --- a/ext/css/display.css +++ b/ext/css/display.css @@ -1977,6 +1977,15 @@ button.footer-notification-close-button { :root[data-anki-enabled=false] .action-button[data-action=save-note] { display: none; } + +:root[data-average-frequency=true] .frequency-group-item:not([data-details='Average']) { + display: none; +} + +:root[data-average-frequency=false] .frequency-group-item[data-details='Average'] { + display: none; +} + :root[data-audio-enabled=false] .action-button[data-action=play-audio] { display: none; } diff --git a/ext/data/audio/button.mp3 b/ext/data/audio/button.mp3 deleted file mode 100644 index 1b69267915..0000000000 Binary files a/ext/data/audio/button.mp3 and /dev/null differ diff --git a/ext/data/audio/fallback-bloop.mp3 b/ext/data/audio/fallback-bloop.mp3 new file mode 100644 index 0000000000..e3d948736f Binary files /dev/null and b/ext/data/audio/fallback-bloop.mp3 differ diff --git a/ext/data/audio/fallback-click.mp3 b/ext/data/audio/fallback-click.mp3 new file mode 100644 index 0000000000..7a9728d1c8 Binary files /dev/null and b/ext/data/audio/fallback-click.mp3 differ diff --git a/ext/data/schemas/options-schema.json b/ext/data/schemas/options-schema.json index c47f7063fd..c43b2b1c3c 100644 --- a/ext/data/schemas/options-schema.json +++ b/ext/data/schemas/options-schema.json @@ -102,6 +102,7 @@ "showGuide", "enableContextMenuScanSelected", "compactTags", + "averageFrequency", "glossaryLayoutMode", "mainDictionary", "popupTheme", @@ -236,6 +237,10 @@ "type": "boolean", "default": false }, + "averageFrequency": { + "type": "boolean", + "default": false + }, "glossaryLayoutMode": { "type": "string", "enum": ["default", "compact"], @@ -391,7 +396,7 @@ "enabled", "volume", "autoPlay", - "playFallbackSound", + "fallbackSoundType", "sources" ], "properties": { @@ -409,9 +414,10 @@ "type": "boolean", "default": false }, - "playFallbackSound": { - "type": "boolean", - "default": true + "fallbackSoundType": { + "type": "string", + "enum": ["none", "click", "bloop"], + "default": "click" }, "sources": { "type": "array", diff --git a/ext/data/templates/anki-field-templates-upgrade-v61.handlebars b/ext/data/templates/anki-field-templates-upgrade-v61.handlebars new file mode 100644 index 0000000000..781d9f6387 --- /dev/null +++ b/ext/data/templates/anki-field-templates-upgrade-v61.handlebars @@ -0,0 +1,9 @@ +{{#*inline "sentence-furigana-plain"}} + {{~#if definition.cloze~}} + {{~#if (hasMedia "textFuriganaPlain" definition.cloze.sentence)~}} + {{{getMedia "textFuriganaPlain" definition.cloze.sentence escape=false}}} + {{~else~}} + {{{definition.cloze.sentence}}} + {{~/if~}} + {{~/if~}} +{{/inline}} \ No newline at end of file diff --git a/ext/data/templates/default-anki-field-templates.handlebars b/ext/data/templates/default-anki-field-templates.handlebars index a065e3848c..8efe3df51e 100644 --- a/ext/data/templates/default-anki-field-templates.handlebars +++ b/ext/data/templates/default-anki-field-templates.handlebars @@ -472,4 +472,14 @@ {{~/if~}} {{/inline}} +{{#*inline "sentence-furigana-plain"}} + {{~#if definition.cloze~}} + {{~#if (hasMedia "textFuriganaPlain" definition.cloze.sentence)~}} + {{{getMedia "textFuriganaPlain" definition.cloze.sentence escape=false}}} + {{~else~}} + {{{definition.cloze.sentence}}} + {{~/if~}} + {{~/if~}} +{{/inline}} + {{~> (lookup . "marker") ~}} diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js index a533805c52..a9dbbc3e54 100644 --- a/ext/js/background/backend.js +++ b/ext/js/background/backend.js @@ -1373,6 +1373,8 @@ export class Backend { this._setupContextMenu(options); + this._attachOmniboxListener(); + void this._accessibilityController.update(this._getOptionsFull(false)); this._sendMessageAllTabsIgnoreResponse({action: 'applicationOptionsUpdated', params: {source}}); @@ -1404,6 +1406,18 @@ export class Backend { } } + /** */ + _attachOmniboxListener() { + try { + chrome.omnibox.onInputEntered.addListener((text) => { + const newURL = 'search.html?query=' + encodeURIComponent(text); + void chrome.tabs.create({url: newURL}); + }); + } catch (e) { + log.error(e); + } + } + /** * @param {boolean} useSchema * @returns {import('settings').Options} diff --git a/ext/js/data/anki-note-builder.js b/ext/js/data/anki-note-builder.js index d7dcbcbac2..a9e7d144ee 100644 --- a/ext/js/data/anki-note-builder.js +++ b/ext/js/data/anki-note-builder.js @@ -522,8 +522,9 @@ export class AnkiNoteBuilder { break; } if (data !== null) { - const value = this._createFuriganaHtml(data, readingMode); - results.push({text, readingMode, details: {value}}); + const valueHtml = this._createFuriganaHtml(data, readingMode); + const valuePlain = this._createFuriganaPlain(data, readingMode); + results.push({text, readingMode, detailsHtml: {value: valueHtml}, detailsPlain: {value: valuePlain}}); } } return results; @@ -551,6 +552,27 @@ export class AnkiNoteBuilder { return result; } + /** + * @param {import('api').ParseTextLine[]} data + * @param {?import('anki-templates').TextFuriganaReadingMode} readingMode + * @returns {string} + */ + _createFuriganaPlain(data, readingMode) { + let result = ''; + for (const term of data) { + for (const {text, reading} of term) { + if (reading.length > 0) { + const reading2 = this._convertReading(reading, readingMode); + result += ` ${text}[${reading2}]`; + } else { + result += text; + } + } + } + result = result.substring(1); + return result; + } + /** * @param {string} reading * @param {?import('anki-templates').TextFuriganaReadingMode} readingMode diff --git a/ext/js/data/anki-template-util.js b/ext/js/data/anki-template-util.js index 4c8127ae5f..94384a29f0 100644 --- a/ext/js/data/anki-template-util.js +++ b/ext/js/data/anki-template-util.js @@ -63,6 +63,7 @@ export function getStandardFieldMarkers(type) { 'popup-selection-text', 'sentence', 'sentence-furigana', + 'sentence-furigana-plain', 'tags', 'url', ]; @@ -91,6 +92,7 @@ export function getStandardFieldMarkers(type) { 'popup-selection-text', 'sentence', 'sentence-furigana', + 'sentence-furigana-plain', 'stroke-count', 'tags', 'url', diff --git a/ext/js/data/options-util.js b/ext/js/data/options-util.js index 6c2bb816cf..7412eb9023 100644 --- a/ext/js/data/options-util.js +++ b/ext/js/data/options-util.js @@ -571,6 +571,9 @@ export class OptionsUtil { this._updateVersion57, this._updateVersion58, this._updateVersion59, + this._updateVersion60, + this._updateVersion61, + this._updateVersion62, ]; /* eslint-enable @typescript-eslint/unbound-method */ if (typeof targetVersion === 'number' && targetVersion < result.length) { @@ -1594,6 +1597,35 @@ export class OptionsUtil { } } + /** + * - Replaced audio.playFallbackSound with audio.fallbackSoundType + * @type {import('options-util').UpdateFunction} + */ + async _updateVersion60(options) { + for (const profile of options.profiles) { + profile.options.audio.fallbackSoundType = profile.options.audio.playFallbackSound ? 'click' : 'none'; + delete profile.options.audio.playFallbackSound; + } + } + + /** + * - Added sentence-furigana-plain handlebar + * @type {import('options-util').UpdateFunction} + */ + async _updateVersion61(options) { + await this._applyAnkiFieldTemplatesPatch(options, '/data/templates/anki-field-templates-upgrade-v61.handlebars'); + } + + /** + * - Added options.general.averageFrequency + * @type {import('options-util').UpdateFunction} + */ + async _updateVersion62(options) { + for (const profile of options.profiles) { + profile.options.general.averageFrequency = false; + } + } + /** * @param {string} url * @returns {Promise} diff --git a/ext/js/dictionary/dictionary-data-util.js b/ext/js/dictionary/dictionary-data-util.js index 61045a82cf..97dbb1026b 100644 --- a/ext/js/dictionary/dictionary-data-util.js +++ b/ext/js/dictionary/dictionary-data-util.js @@ -83,23 +83,108 @@ export function groupTermFrequencies(dictionaryEntry, dictionaryInfo) { } const results = []; + + /** @type {import('dictionary').AverageFrequencyListGroup} */ + const averages = new Map(); for (const [dictionary, map2] of map1.entries()) { + /** @type {import('dictionary-data-util').TermFrequency[]} */ const frequencies = []; const dictionaryAlias = aliasMap.get(dictionary) ?? dictionary; for (const {term, reading, values} of map2.values()) { - frequencies.push({ + const termFrequency = { term, reading, values: [...values.values()], - }); + }; + frequencies.push(termFrequency); + + const averageFrequencyData = makeAverageFrequencyData(termFrequency, averages.get(term)); + if (averageFrequencyData) { + averages.set(term, averageFrequencyData); + } } const currentDictionaryInfo = dictionaryInfo.find(({title}) => title === dictionary); const freqCount = currentDictionaryInfo?.counts?.termMeta.freq ?? 0; results.push({dictionary, frequencies, dictionaryAlias, freqCount}); } + + results.push({dictionary: 'Average', frequencies: makeAverageFrequencyArray(averages), dictionaryAlias: 'Average', freqCount: 1}); + return results; } +/** + * @param {import('dictionary-data-util').TermFrequency} termFrequency + * @param {import('dictionary').AverageFrequencyListTerm | undefined} averageTerm + * @returns {import('dictionary').AverageFrequencyListTerm | undefined} + */ +function makeAverageFrequencyData(termFrequency, averageTerm) { + const valuesArray = [...termFrequency.values.values()]; + const newReading = termFrequency.reading ?? ''; + + /** @type {import('dictionary').AverageFrequencyListTerm} */ + const termMap = typeof averageTerm === 'undefined' ? new Map() : averageTerm; + + const frequencyData = termMap.get(newReading) ?? {currentAvg: 1, count: 0}; + + if (valuesArray[0].frequency === null) { return; } + + frequencyData.currentAvg = frequencyData.count / frequencyData.currentAvg + 1 / valuesArray[0].frequency; + frequencyData.currentAvg = (frequencyData.count + 1) / frequencyData.currentAvg; + frequencyData.count += 1; + + termMap.set(newReading, frequencyData); + return termMap; +} + +/** + * @param {import('dictionary').AverageFrequencyListGroup} averages + * @returns {import('dictionary-data-util').TermFrequency[]} + */ +function makeAverageFrequencyArray(averages) { + // Merge readings if one is null and there's only two readings + // More than one non-null reading cannot be merged since it cannot be determined which reading to merge with + for (const currentTerm of averages.keys()) { + const readingsMap = averages.get(currentTerm); + if (!readingsMap) { continue; } // Skip if readingsMap is undefined + + const readingArray = [...readingsMap.keys()]; + const nullIndex = readingArray.indexOf(''); + + if (readingArray.length === 2 && nullIndex >= 0) { + const key1 = readingArray[0]; + const key2 = readingArray[1]; + + const value1 = readingsMap.get(key1); + const value2 = readingsMap.get(key2); + + if (!value1 || !value2) { continue; } // Skip if any value is undefined + + const avg1 = value1.currentAvg; + const count1 = value1.count; + const avg2 = value2.currentAvg; + const count2 = value2.count; + + const newcount = count1 + count2; + const newavg = newcount / (count1 / avg1 + count2 / avg2); + + const validKey = nullIndex === 0 ? key2 : key1; + readingsMap.set(validKey, {currentAvg: newavg, count: newcount}); + readingsMap.delete(''); + } + } + + // Convert averages Map back to array format + return [...averages.entries()].flatMap(([termName, termMap]) => [...termMap.entries()].map(([readingName, data]) => ({ + term: termName, + reading: readingName, + values: [{ + frequency: Math.round(data.currentAvg), + displayValue: Math.round(data.currentAvg).toString(), + }], + }))); +} + /** * @param {import('dictionary').KanjiFrequency[]} sourceFrequencies * @param {import('dictionary-importer').Summary[]} dictionaryInfo diff --git a/ext/js/display/display-audio.js b/ext/js/display/display-audio.js index ef035857ce..87f5691370 100644 --- a/ext/js/display/display-audio.js +++ b/ext/js/display/display-audio.js @@ -36,8 +36,8 @@ export class DisplayAudio { this._playbackVolume = 1; /** @type {boolean} */ this._autoPlay = false; - /** @type {boolean} */ - this._playFallbackSound = true; + /** @type {import('settings').FallbackSoundType} */ + this._fallbackSoundType = 'none'; /** @type {?import('core').Timeout} */ this._autoPlayAudioTimer = null; /** @type {number} */ @@ -170,10 +170,10 @@ export class DisplayAudio { _onOptionsUpdated({options}) { const { general: {language}, - audio: {enabled, autoPlay, playFallbackSound, volume, sources}, + audio: {enabled, autoPlay, fallbackSoundType, volume, sources}, } = options; this._autoPlay = enabled && autoPlay; - this._playFallbackSound = playFallbackSound; + this._fallbackSoundType = fallbackSoundType; this._playbackVolume = Number.isFinite(volume) ? Math.max(0, Math.min(1, volume / 100)) : 1; /** @type {Set} */ @@ -454,7 +454,7 @@ export class DisplayAudio { const sourceIndex = sources.indexOf(source); title = `From source ${1 + sourceIndex}: ${source.name}`; } else { - audio = this._audioSystem.getFallbackAudio(this._playFallbackSound); + audio = this._audioSystem.getFallbackAudio(this._fallbackSoundType); title = 'Could not find audio'; } diff --git a/ext/js/display/display.js b/ext/js/display/display.js index d2437ef459..daf51a4ebc 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -1202,6 +1202,7 @@ export class Display extends EventDispatcher { data.resultOutputMode = `${options.general.resultOutputMode}`; data.glossaryLayoutMode = `${options.general.glossaryLayoutMode}`; data.compactTags = `${options.general.compactTags}`; + data.averageFrequency = `${options.general.averageFrequency}`; data.frequencyDisplayMode = `${options.general.frequencyDisplayMode}`; data.termDisplayMode = `${options.general.termDisplayMode}`; data.enableSearchTags = `${options.scanning.enableSearchTags}`; diff --git a/ext/js/media/audio-system.js b/ext/js/media/audio-system.js index 7a7e40bebd..0dfa2d20f9 100644 --- a/ext/js/media/audio-system.js +++ b/ext/js/media/audio-system.js @@ -27,8 +27,8 @@ export class AudioSystem extends EventDispatcher { super(); /** @type {?HTMLAudioElement} */ this._fallbackAudio = null; - /** @type {?boolean} */ - this._playFallbackSound = null; + /** @type {?import('settings').FallbackSoundType} */ + this._fallbackSoundType = null; } /** @@ -45,14 +45,24 @@ export class AudioSystem extends EventDispatcher { } /** - * @param {boolean} playFallbackSound + * @param {import('settings').FallbackSoundType} fallbackSoundType * @returns {HTMLAudioElement} */ - getFallbackAudio(playFallbackSound) { - if (this._fallbackAudio === null || this._playFallbackSound !== playFallbackSound) { - // audio handler expects audio url to always be present, empty string must be used instead of `new Audio()` - this._fallbackAudio = playFallbackSound ? new Audio('/data/audio/button.mp3') : new Audio(''); - this._playFallbackSound = playFallbackSound; + getFallbackAudio(fallbackSoundType) { + if (this._fallbackAudio === null || this._fallbackSoundType !== fallbackSoundType) { + this._fallbackSoundType = fallbackSoundType; + switch (fallbackSoundType) { + case 'click': + this._fallbackAudio = new Audio('/data/audio/fallback-click.mp3'); + break; + case 'bloop': + this._fallbackAudio = new Audio('/data/audio/fallback-bloop.mp3'); + break; + case 'none': + // audio handler expects audio url to always be present, empty string must be used instead of `new Audio()` + this._fallbackAudio = new Audio(''); + break; + } } return this._fallbackAudio; } diff --git a/ext/js/templates/template-renderer-media-provider.js b/ext/js/templates/template-renderer-media-provider.js index 52b40382dc..4d0258b462 100644 --- a/ext/js/templates/template-renderer-media-provider.js +++ b/ext/js/templates/template-renderer-media-provider.js @@ -102,7 +102,8 @@ export class TemplateRendererMediaProvider { case 'clipboardImage': return this._getSimpleMediaData(media, 'clipboardImage'); case 'clipboardText': return this._getSimpleMediaData(media, 'clipboardText'); case 'popupSelectionText': return this._getSimpleMediaData(media, 'popupSelectionText'); - case 'textFurigana': return this._getTextFurigana(media, args[1], namedArgs); + case 'textFurigana': return this._getTextFurigana(media, args[1], namedArgs, 'furiganaHtml'); + case 'textFuriganaPlain': return this._getTextFurigana(media, args[1], namedArgs, 'furiganaPlain'); case 'dictionaryMedia': return this._getDictionaryMedia(media, args[1], namedArgs); default: return null; } @@ -155,16 +156,22 @@ export class TemplateRendererMediaProvider { * @param {import('anki-templates').Media} media * @param {unknown} text * @param {import('core').SerializableObject} namedArgs + * @param {import('anki-note-builder').TextFuriganaFormats} furiganaFormat * @returns {?import('anki-templates').MediaObject} */ - _getTextFurigana(media, text, namedArgs) { + _getTextFurigana(media, text, namedArgs, furiganaFormat) { if (typeof text !== 'string') { return null; } const readingMode = this._normalizeReadingMode(namedArgs.readingMode); const {textFurigana} = media; if (Array.isArray(textFurigana)) { for (const entry of textFurigana) { if (entry.text !== text || entry.readingMode !== readingMode) { continue; } - return entry.details; + switch (furiganaFormat) { + case 'furiganaHtml': + return entry.detailsHtml; + case 'furiganaPlain': + return entry.detailsPlain; + } } } this._addRequirement({ diff --git a/ext/settings.html b/ext/settings.html index 924c230fe5..e730f6658d 100644 --- a/ext/settings.html +++ b/ext/settings.html @@ -1090,6 +1090,15 @@

Yomitan Settings

+
+
+
Average frequencies
+
Compress frequency tags into one "Average" frequency tag based on the harmonic mean.
+
+
+ +
+
@@ -1461,15 +1470,23 @@

Yomitan Settings

-
-
-
Enable audio fallback sound
-
Play sound when Yomitan fails to fetch audio.
-
-
- +
+
+
+
Audio fallback sound
+
+ The sound to play when Yomitan fails to fetch audio. +
+
+
+ +
-
+
Audio volume
diff --git a/ext/templates-modals.html b/ext/templates-modals.html index 04cf78793c..c19d262ddf 100644 --- a/ext/templates-modals.html +++ b/ext/templates-modals.html @@ -1122,6 +1122,10 @@

Pronunciation Dictionaries

{sentence-furigana} Sentence, quote, or phrase that the term or kanji appears in from the source content, with furigana added. + + {sentence-furigana-plain} + Sentence, quote, or phrase that the term or kanji appears in from the source content, with furigana added in brackets. + {url} Address of the web page in which the term or kanji appeared in. diff --git a/test/data/anki-note-builder-test-results.json b/test/data/anki-note-builder-test-results.json index 06abe67ea9..b06a67e5d0 100644 --- a/test/data/anki-note-builder-test-results.json +++ b/test/data/anki-note-builder-test-results.json @@ -26,6 +26,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "stroke-count": "Stroke count: Unknown", "tags": "", "url": "url:" @@ -59,6 +60,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix込cloze-suffix", "sentence-furigana": "cloze-prefix込cloze-suffix", + "sentence-furigana-plain": "cloze-prefix込cloze-suffix", "stroke-count": "Stroke count: Unknown", "tags": "", "url": "url:" @@ -111,6 +113,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -153,6 +156,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -200,6 +204,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打つcloze-suffix", "sentence-furigana": "cloze-prefix打つcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打つcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -242,6 +247,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打つcloze-suffix", "sentence-furigana": "cloze-prefix打つcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打つcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -284,6 +290,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打つcloze-suffix", "sentence-furigana": "cloze-prefix打つcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打つcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -326,6 +333,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打つcloze-suffix", "sentence-furigana": "cloze-prefix打つcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打つcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -368,6 +376,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -410,6 +419,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -457,6 +467,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -499,6 +510,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -541,6 +553,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -583,6 +596,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -625,6 +639,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -667,6 +682,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -709,6 +725,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -751,6 +768,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -793,6 +811,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -835,6 +854,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -882,6 +902,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix画像cloze-suffix", "sentence-furigana": "cloze-prefix画像cloze-suffix", + "sentence-furigana-plain": "cloze-prefix画像cloze-suffix", "tags": "E1, P, n", "url": "url:" } @@ -929,6 +950,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixだcloze-suffix", "sentence-furigana": "cloze-prefixだcloze-suffix", + "sentence-furigana-plain": "cloze-prefixだcloze-suffix", "tags": "E1, n", "url": "url:" } @@ -976,6 +998,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixダースcloze-suffix", "sentence-furigana": "cloze-prefixダースcloze-suffix", + "sentence-furigana-plain": "cloze-prefixダースcloze-suffix", "tags": "E1, abbr, n", "url": "url:" }, @@ -1018,6 +1041,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixダcloze-suffix", "sentence-furigana": "cloze-prefixダcloze-suffix", + "sentence-furigana-plain": "cloze-prefixダcloze-suffix", "tags": "E1, n", "url": "url:" } @@ -1065,6 +1089,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうつcloze-suffix", "sentence-furigana": "cloze-prefixうつcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうつcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -1107,6 +1132,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうつcloze-suffix", "sentence-furigana": "cloze-prefixうつcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうつcloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -1154,6 +1180,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixぶつcloze-suffix", "sentence-furigana": "cloze-prefixぶつcloze-suffix", + "sentence-furigana-plain": "cloze-prefixぶつcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -1196,6 +1223,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixぶつcloze-suffix", "sentence-furigana": "cloze-prefixぶつcloze-suffix", + "sentence-furigana-plain": "cloze-prefixぶつcloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -1243,6 +1271,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうちこむcloze-suffix", "sentence-furigana": "cloze-prefixうちこむcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうちこむcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -1285,6 +1314,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうちこむcloze-suffix", "sentence-furigana": "cloze-prefixうちこむcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうちこむcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -1327,6 +1357,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうちcloze-suffix", "sentence-furigana": "cloze-prefixうちcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -1369,6 +1400,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうちcloze-suffix", "sentence-furigana": "cloze-prefixうちcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうちcloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -1416,6 +1448,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixぶちこむcloze-suffix", "sentence-furigana": "cloze-prefixぶちこむcloze-suffix", + "sentence-furigana-plain": "cloze-prefixぶちこむcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -1458,6 +1491,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixぶちこむcloze-suffix", "sentence-furigana": "cloze-prefixぶちこむcloze-suffix", + "sentence-furigana-plain": "cloze-prefixぶちこむcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -1500,6 +1534,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixぶちcloze-suffix", "sentence-furigana": "cloze-prefixぶちcloze-suffix", + "sentence-furigana-plain": "cloze-prefixぶちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -1542,6 +1577,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixぶちcloze-suffix", "sentence-furigana": "cloze-prefixぶちcloze-suffix", + "sentence-furigana-plain": "cloze-prefixぶちcloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -1589,6 +1625,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixがぞうcloze-suffix", "sentence-furigana": "cloze-prefixがぞうcloze-suffix", + "sentence-furigana-plain": "cloze-prefixがぞうcloze-suffix", "tags": "E1, P, n", "url": "url:" } @@ -1648,6 +1685,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "E1, E2, P, vt", "url": "url:" }, @@ -1690,6 +1728,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "E1, E2, P, vt", "url": "url:" }, @@ -1732,6 +1771,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E1, E2, P, vt", "url": "url:" }, @@ -1774,6 +1814,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E1, E2, P, vt", "url": "url:" }, @@ -1816,6 +1857,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -1858,6 +1900,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -1905,6 +1948,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込むcloze-suffix", "sentence-furigana": "cloze-prefix打ち込むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込むcloze-suffix", "tags": "vt", "url": "url:" }, @@ -1947,6 +1991,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "vt", "url": "url:" }, @@ -1989,6 +2034,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "n", "url": "url:" }, @@ -2031,6 +2077,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "abbr, n", "url": "url:" } @@ -2078,6 +2125,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "sentence-furigana": "cloze-prefix打ち込んでいませんでしたcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2120,6 +2168,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "sentence-furigana": "cloze-prefix打ち込んでいませんでしたcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2162,6 +2211,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "sentence-furigana": "cloze-prefix打ち込んでいませんでしたcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2204,6 +2254,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "sentence-furigana": "cloze-prefix打ち込んでいませんでしたcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ち込んでいませんでしたcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2246,6 +2297,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2288,6 +2340,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2330,6 +2383,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2372,6 +2426,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打ちcloze-suffix", "sentence-furigana": "cloze-prefix打ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打ちcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2414,6 +2469,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -2456,6 +2512,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打cloze-suffix", "sentence-furigana": "cloze-prefix打cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -2503,6 +2560,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ち込(こ)むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2545,6 +2603,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ち込(こ)むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2587,6 +2646,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ち込(こ)むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2629,6 +2689,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ち込(こ)むcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ち込(こ)むcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2671,6 +2732,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ちcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2713,6 +2775,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ちcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ちcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2755,6 +2818,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ちcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ちcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2797,6 +2861,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)ちcloze-suffix", "sentence-furigana": "cloze-prefix打(う)ちcloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)ちcloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -2839,6 +2904,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)cloze-suffix", "sentence-furigana": "cloze-prefix打(う)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -2881,6 +2947,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix打(う)cloze-suffix", "sentence-furigana": "cloze-prefix打(う)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix打(う)cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -2928,6 +2995,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -2970,6 +3038,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -3012,6 +3081,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -3054,6 +3124,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)(込)(む)cloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -3096,6 +3167,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)cloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -3138,6 +3210,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)cloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -3180,6 +3253,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)cloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -3222,6 +3296,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)(ち)cloze-suffix", "sentence-furigana": "cloze-prefix(打)(ち)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)(ち)cloze-suffix", "tags": "E2, P, vt", "url": "url:" }, @@ -3264,6 +3339,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)cloze-suffix", "sentence-furigana": "cloze-prefix(打)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)cloze-suffix", "tags": "E1, n", "url": "url:" }, @@ -3306,6 +3382,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix(打)cloze-suffix", "sentence-furigana": "cloze-prefix(打)cloze-suffix", + "sentence-furigana-plain": "cloze-prefix(打)cloze-suffix", "tags": "E1, abbr, n", "url": "url:" } @@ -3353,6 +3430,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixtestcloze-suffix", "sentence-furigana": "cloze-prefixtestcloze-suffix", + "sentence-furigana-plain": "cloze-prefixtestcloze-suffix", "tags": "E1, P, vt", "url": "url:" } @@ -3400,6 +3478,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixつtestcloze-suffix", "sentence-furigana": "cloze-prefixつtestcloze-suffix", + "sentence-furigana-plain": "cloze-prefixつtestcloze-suffix", "tags": "E1, P, n", "url": "url:" } @@ -3447,6 +3526,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixtestましたcloze-suffix", "sentence-furigana": "cloze-prefixtestましたcloze-suffix", + "sentence-furigana-plain": "cloze-prefixtestましたcloze-suffix", "tags": "E1, P, vt", "url": "url:" } @@ -3494,6 +3574,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうちこむcloze-suffix", "sentence-furigana": "cloze-prefixうちこむcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうちこむcloze-suffix", "tags": "vt", "url": "url:" }, @@ -3536,6 +3617,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixうちcloze-suffix", "sentence-furigana": "cloze-prefixうちcloze-suffix", + "sentence-furigana-plain": "cloze-prefixうちcloze-suffix", "tags": "vt", "url": "url:" } @@ -3583,6 +3665,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixお手前cloze-suffix", "sentence-furigana": "cloze-prefixお手前cloze-suffix", + "sentence-furigana-plain": "cloze-prefixお手前cloze-suffix", "tags": "n", "url": "url:" } @@ -3630,6 +3713,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix番号cloze-suffix", "sentence-furigana": "cloze-prefix番号cloze-suffix", + "sentence-furigana-plain": "cloze-prefix番号cloze-suffix", "tags": "n", "url": "url:" } @@ -3677,6 +3761,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix中腰cloze-suffix", "sentence-furigana": "cloze-prefix中腰cloze-suffix", + "sentence-furigana-plain": "cloze-prefix中腰cloze-suffix", "tags": "n", "url": "url:" } @@ -3724,6 +3809,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix所業cloze-suffix", "sentence-furigana": "cloze-prefix所業cloze-suffix", + "sentence-furigana-plain": "cloze-prefix所業cloze-suffix", "tags": "n", "url": "url:" } @@ -3771,6 +3857,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix土木工事cloze-suffix", "sentence-furigana": "cloze-prefix土木工事cloze-suffix", + "sentence-furigana-plain": "cloze-prefix土木工事cloze-suffix", "tags": "n", "url": "url:" } @@ -3818,6 +3905,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix好きcloze-suffix", "sentence-furigana": "cloze-prefix好きcloze-suffix", + "sentence-furigana-plain": "cloze-prefix好きcloze-suffix", "tags": "adj-na, n", "url": "url:" } @@ -3865,6 +3953,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix構造cloze-suffix", "sentence-furigana": "cloze-prefix構造cloze-suffix", + "sentence-furigana-plain": "cloze-prefix構造cloze-suffix", "tags": "E1, P, n", "url": "url:" } @@ -3912,6 +4001,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixのたもうたcloze-suffix", "sentence-furigana": "cloze-prefixのたもうたcloze-suffix", + "sentence-furigana-plain": "cloze-prefixのたもうたcloze-suffix", "tags": "v5", "url": "url:" } @@ -3959,6 +4049,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix39cloze-suffix", "sentence-furigana": "cloze-prefix39cloze-suffix", + "sentence-furigana-plain": "cloze-prefix39cloze-suffix", "tags": "", "url": "url:" } @@ -4006,6 +4097,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixEnglishcloze-suffix", "sentence-furigana": "cloze-prefixEnglishcloze-suffix", + "sentence-furigana-plain": "cloze-prefixEnglishcloze-suffix", "tags": "n", "url": "url:" } @@ -4053,6 +4145,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixUSBcloze-suffix", "sentence-furigana": "cloze-prefixUSBcloze-suffix", + "sentence-furigana-plain": "cloze-prefixUSBcloze-suffix", "tags": "n", "url": "url:" } @@ -4100,6 +4193,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixutsucloze-suffix", "sentence-furigana": "cloze-prefixutsucloze-suffix", + "sentence-furigana-plain": "cloze-prefixutsucloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -4142,6 +4236,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixutsucloze-suffix", "sentence-furigana": "cloze-prefixutsucloze-suffix", + "sentence-furigana-plain": "cloze-prefixutsucloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -4189,6 +4284,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixウツcloze-suffix", "sentence-furigana": "cloze-prefixウツcloze-suffix", + "sentence-furigana-plain": "cloze-prefixウツcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -4231,6 +4327,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixウツcloze-suffix", "sentence-furigana": "cloze-prefixウツcloze-suffix", + "sentence-furigana-plain": "cloze-prefixウツcloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -4278,6 +4375,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixてきすとcloze-suffix", "sentence-furigana": "cloze-prefixてきすとcloze-suffix", + "sentence-furigana-plain": "cloze-prefixてきすとcloze-suffix", "tags": "E1, P, n", "url": "url:" } @@ -4325,6 +4423,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixウツcloze-suffix", "sentence-furigana": "cloze-prefixウツcloze-suffix", + "sentence-furigana-plain": "cloze-prefixウツcloze-suffix", "tags": "E1, P, vt", "url": "url:" }, @@ -4367,6 +4466,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixウツcloze-suffix", "sentence-furigana": "cloze-prefixウツcloze-suffix", + "sentence-furigana-plain": "cloze-prefixウツcloze-suffix", "tags": "E2, P, vt", "url": "url:" } @@ -4414,6 +4514,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixすっっごーーいcloze-suffix", "sentence-furigana": "cloze-prefixすっっごーーいcloze-suffix", + "sentence-furigana-plain": "cloze-prefixすっっごーーいcloze-suffix", "tags": "adj-i", "url": "url:" } @@ -4461,6 +4562,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixenglishcloze-suffix", "sentence-furigana": "cloze-prefixenglishcloze-suffix", + "sentence-furigana-plain": "cloze-prefixenglishcloze-suffix", "tags": "n", "url": "url:" } @@ -4508,6 +4610,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixLANGUAGEcloze-suffix", "sentence-furigana": "cloze-prefixLANGUAGEcloze-suffix", + "sentence-furigana-plain": "cloze-prefixLANGUAGEcloze-suffix", "tags": "n", "url": "url:" } @@ -4555,6 +4658,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix마시거나cloze-suffix", "sentence-furigana": "cloze-prefix마시거나cloze-suffix", + "sentence-furigana-plain": "cloze-prefix마시거나cloze-suffix", "tags": "v", "url": "url:" } @@ -4602,6 +4706,7 @@ "popup-selection-text": "", "sentence": "cloze-prefixenglishcloze-suffix", "sentence-furigana": "cloze-prefixenglishcloze-suffix", + "sentence-furigana-plain": "cloze-prefixenglishcloze-suffix", "tags": "n", "url": "url:" } @@ -4649,6 +4754,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix自重cloze-suffix", "sentence-furigana": "cloze-prefix自重cloze-suffix", + "sentence-furigana-plain": "cloze-prefix自重cloze-suffix", "tags": "n", "url": "url:" }, @@ -4691,6 +4797,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix自重cloze-suffix", "sentence-furigana": "cloze-prefix自重cloze-suffix", + "sentence-furigana-plain": "cloze-prefix自重cloze-suffix", "tags": "n", "url": "url:" } @@ -4738,6 +4845,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix自重cloze-suffix", "sentence-furigana": "cloze-prefix自重cloze-suffix", + "sentence-furigana-plain": "cloze-prefix自重cloze-suffix", "tags": "n", "url": "url:" }, @@ -4780,6 +4888,7 @@ "popup-selection-text": "", "sentence": "cloze-prefix自重cloze-suffix", "sentence-furigana": "cloze-prefix自重cloze-suffix", + "sentence-furigana-plain": "cloze-prefix自重cloze-suffix", "tags": "n", "url": "url:" } diff --git a/test/options-util.test.js b/test/options-util.test.js index bc41089571..5055f27de6 100644 --- a/test/options-util.test.js +++ b/test/options-util.test.js @@ -56,6 +56,7 @@ function createProfileOptionsTestData1() { popupScaleRelativeToVisualViewport: true, showGuide: true, compactTags: false, + averageFrequency: false, compactGlossaries: false, mainDictionary: '', popupTheme: 'default', @@ -76,7 +77,7 @@ function createProfileOptionsTestData1() { sources: ['jpod101', 'text-to-speech', 'custom', 'jpod101-alternate'], volume: 100, autoPlay: false, - playFallbackSound: true, + fallbackSoundType: 'click', customSourceUrl: 'http://localhost/audio.mp3?term={expression}&reading={reading}', textToSpeechVoice: 'example-voice', }, @@ -288,6 +289,7 @@ function createProfileOptionsUpdatedTestData1() { showGuide: true, enableContextMenuScanSelected: true, compactTags: false, + averageFrequency: false, glossaryLayoutMode: 'default', mainDictionary: '', popupTheme: 'light', @@ -337,7 +339,7 @@ function createProfileOptionsUpdatedTestData1() { ], volume: 100, autoPlay: false, - playFallbackSound: true, + fallbackSoundType: 'click', }, scanning: { selectText: true, @@ -680,7 +682,7 @@ function createOptionsUpdatedTestData1() { }, ], profileCurrent: 0, - version: 59, + version: 62, global: { database: { prefixWildcardsSupported: false, diff --git a/types/ext/anki-note-builder.d.ts b/types/ext/anki-note-builder.d.ts index e2a8d1af59..fcade7e34b 100644 --- a/types/ext/anki-note-builder.d.ts +++ b/types/ext/anki-note-builder.d.ts @@ -82,6 +82,8 @@ export type RequirementTextFurigana = { readingMode: AnkiTemplates.TextFuriganaReadingMode; }; +export type TextFuriganaFormats = 'furiganaHtml' | 'furiganaPlain'; + export type RequirementDictionaryMedia = { type: 'dictionaryMedia'; dictionary: string; diff --git a/types/ext/anki-templates.d.ts b/types/ext/anki-templates.d.ts index b9b864122b..c78edc7501 100644 --- a/types/ext/anki-templates.d.ts +++ b/types/ext/anki-templates.d.ts @@ -50,7 +50,8 @@ export type MediaSimpleType = ( export type TextFuriganaSegment = { text: string; readingMode: TextFuriganaReadingMode; - details: MediaObject; + detailsHtml: MediaObject; + detailsPlain: MediaObject; }; export type TextFuriganaReadingMode = 'hiragana' | 'katakana' | null; diff --git a/types/ext/dictionary.d.ts b/types/ext/dictionary.d.ts index 8d6a5d2a35..689a4fa787 100644 --- a/types/ext/dictionary.d.ts +++ b/types/ext/dictionary.d.ts @@ -532,3 +532,27 @@ export type TermSource = { */ isPrimary: boolean; }; + +/** + * Dictionaries containing the harmonic mean frequency of specific term-reading pairs. + */ +export type AverageFrequencyListGroup = Map; + +/** + * Contains the average frequency of a term, with all its readings. + */ +export type AverageFrequencyListTerm = Map; + +/** + * The number of dictionary frequencies used to compute the average. + */ +export type AverageFrequencyListReading = { + /** + * The current average frequency. + */ + currentAvg: number; + /** + * The number of dictionary frequencies used to compute the average. + */ + count: number; +}; diff --git a/types/ext/settings.d.ts b/types/ext/settings.d.ts index 5ca7e62c39..08a1b8739c 100644 --- a/types/ext/settings.d.ts +++ b/types/ext/settings.d.ts @@ -128,6 +128,7 @@ export type GeneralOptions = { showGuide: boolean; enableContextMenuScanSelected: boolean; compactTags: boolean; + averageFrequency: boolean; glossaryLayoutMode: GlossaryLayoutMode; mainDictionary: string; popupTheme: PopupTheme; @@ -167,10 +168,12 @@ export type AudioOptions = { enabled: boolean; volume: number; autoPlay: boolean; - playFallbackSound: boolean; + fallbackSoundType: FallbackSoundType; sources: AudioSourceOptions[]; }; +export type FallbackSoundType = 'none' | 'click' | 'bloop'; + export type AudioSourceOptions = { type: AudioSourceType; url: string;