summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-11-28 14:30:50 -0500
committerGitHub <noreply@github.com>2020-11-28 14:30:50 -0500
commit008ffdb6bffc2855957be948a24c9e07730501d6 (patch)
treebe6642b030011f0007aad1025da3c5accd0d9a54 /ext
parent94d63f4f87a61f7e42ea44d8100ea11d5ccdbce0 (diff)
Frequencies marker (#1074)
* Update japanese.js tests * Simplify fallback/early exit * Add overloads to furigana and furiganaPlain handlebars helper functions * Expose unique expression/reading arrays (and subsequently counts) * Add {frequencies} marker
Diffstat (limited to 'ext')
-rw-r--r--ext/bg/data/anki-field-templates-upgrade-v6.handlebars17
-rw-r--r--ext/bg/data/default-anki-field-templates.handlebars17
-rw-r--r--ext/bg/js/anki-note-builder.js10
-rw-r--r--ext/bg/js/settings/anki-controller.js1
-rw-r--r--ext/bg/js/template-renderer.js31
-rw-r--r--ext/mixed/js/japanese.js10
6 files changed, 72 insertions, 14 deletions
diff --git a/ext/bg/data/anki-field-templates-upgrade-v6.handlebars b/ext/bg/data/anki-field-templates-upgrade-v6.handlebars
index 33a2f949..809423ce 100644
--- a/ext/bg/data/anki-field-templates-upgrade-v6.handlebars
+++ b/ext/bg/data/anki-field-templates-upgrade-v6.handlebars
@@ -6,3 +6,20 @@
{{~/each~}}
{{~/if~}}
{{/inline}}
+
+{{#*inline "frequencies"}}
+ {{~#if (op ">" definition.frequencies.length 0)~}}
+ <ul style="text-align: left;">
+ {{~#each definition.frequencies~}}
+ <li>
+ {{~#if (op "!==" ../definition.type "kanji")~}}
+ {{~#if (op "||" (op ">" ../uniqueExpressions.length 1) (op ">" ../uniqueReadings.length 1))~}}(
+ {{~#furigana expression reading~}}{{~/furigana~}}
+ ) {{/if~}}
+ {{~/if~}}
+ {{~dictionary}}: {{frequency~}}
+ </li>
+ {{~/each~}}
+ </ul>
+ {{~/if~}}
+{{/inline}}
diff --git a/ext/bg/data/default-anki-field-templates.handlebars b/ext/bg/data/default-anki-field-templates.handlebars
index 0b0e9ca6..1024e2e6 100644
--- a/ext/bg/data/default-anki-field-templates.handlebars
+++ b/ext/bg/data/default-anki-field-templates.handlebars
@@ -306,4 +306,21 @@
{{~/if~}}
{{/inline}}
+{{#*inline "frequencies"}}
+ {{~#if (op ">" definition.frequencies.length 0)~}}
+ <ul style="text-align: left;">
+ {{~#each definition.frequencies~}}
+ <li>
+ {{~#if (op "!==" ../definition.type "kanji")~}}
+ {{~#if (op "||" (op ">" ../uniqueExpressions.length 1) (op ">" ../uniqueReadings.length 1))~}}(
+ {{~#furigana expression reading~}}{{~/furigana~}}
+ ) {{/if~}}
+ {{~/if~}}
+ {{~dictionary}}: {{frequency~}}
+ </li>
+ {{~/each~}}
+ </ul>
+ {{~/if~}}
+{{/inline}}
+
{{~> (lookup . "marker") ~}}
diff --git a/ext/bg/js/anki-note-builder.js b/ext/bg/js/anki-note-builder.js
index 33cd3a0b..b6114e4b 100644
--- a/ext/bg/js/anki-note-builder.js
+++ b/ext/bg/js/anki-note-builder.js
@@ -108,9 +108,19 @@ class AnkiNoteBuilder {
_createNoteData(definition, mode, context, resultOutputMode, glossaryLayoutMode, compactTags) {
const pitches = DictionaryDataUtil.getPitchAccentInfos(definition);
const pitchCount = pitches.reduce((i, v) => i + v.pitches.length, 0);
+ const uniqueExpressions = new Set();
+ const uniqueReadings = new Set();
+ if (definition.type !== 'kanji') {
+ for (const {expression, reading} of definition.expressions) {
+ uniqueExpressions.add(expression);
+ uniqueReadings.add(reading);
+ }
+ }
return {
marker: null,
definition,
+ uniqueExpressions: [...uniqueExpressions],
+ uniqueReadings: [...uniqueReadings],
pitches,
pitchCount,
group: resultOutputMode === 'group',
diff --git a/ext/bg/js/settings/anki-controller.js b/ext/bg/js/settings/anki-controller.js
index d9b1591e..957f86d9 100644
--- a/ext/bg/js/settings/anki-controller.js
+++ b/ext/bg/js/settings/anki-controller.js
@@ -83,6 +83,7 @@ class AnkiController {
'dictionary',
'document-title',
'expression',
+ 'frequencies',
'furigana',
'furigana-plain',
'glossary',
diff --git a/ext/bg/js/template-renderer.js b/ext/bg/js/template-renderer.js
index 5dd33814..c1995acd 100644
--- a/ext/bg/js/template-renderer.js
+++ b/ext/bg/js/template-renderer.js
@@ -117,13 +117,13 @@ class TemplateRenderer {
return this._escape(dump);
}
- _furigana(context, options) {
- const definition = options.fn(context);
- const segs = jp.distributeFurigana(definition.expression, definition.reading);
+ _furigana(context, ...args) {
+ const {expression, reading} = this._getFuriganaExpressionAndReading(context, ...args);
+ const segs = jp.distributeFurigana(expression, reading);
let result = '';
for (const seg of segs) {
- if (seg.furigana) {
+ if (seg.furigana.length > 0) {
result += `<ruby>${seg.text}<rt>${seg.furigana}</rt></ruby>`;
} else {
result += seg.text;
@@ -133,20 +133,31 @@ class TemplateRenderer {
return result;
}
- _furiganaPlain(context, options) {
- const definition = options.fn(context);
- const segs = jp.distributeFurigana(definition.expression, definition.reading);
+ _furiganaPlain(context, ...args) {
+ const {expression, reading} = this._getFuriganaExpressionAndReading(context, ...args);
+ const segs = jp.distributeFurigana(expression, reading);
let result = '';
for (const seg of segs) {
- if (seg.furigana) {
- result += ` ${seg.text}[${seg.furigana}]`;
+ if (seg.furigana.length > 0) {
+ if (result.length > 0) { result += ' '; }
+ result += `${seg.text}[${seg.furigana}]`;
} else {
result += seg.text;
}
}
- return result.trimLeft();
+ return result;
+ }
+
+ _getFuriganaExpressionAndReading(context, ...args) {
+ const options = args[args.length - 1];
+ if (args.length >= 3) {
+ return {expression: args[0], reading: args[1]};
+ } else {
+ const {expression, reading} = options.fn(context);
+ return {expression, reading};
+ }
}
_kanjiLinks(context, options) {
diff --git a/ext/mixed/js/japanese.js b/ext/mixed/js/japanese.js
index ee0ac777..2177ceee 100644
--- a/ext/mixed/js/japanese.js
+++ b/ext/mixed/js/japanese.js
@@ -411,9 +411,9 @@ const jp = (() => {
// Furigana distribution
distributeFurigana(expression, reading) {
- const fallback = [{furigana: reading, text: expression}];
- if (!reading) {
- return fallback;
+ if (!reading || reading === expression) {
+ // Same
+ return [{furigana: '', text: expression}];
}
let isAmbiguous = false;
@@ -471,7 +471,9 @@ const jp = (() => {
if (segments && !isAmbiguous) {
return segments;
}
- return fallback;
+
+ // Fallback
+ return [{furigana: reading, text: expression}];
}
distributeFuriganaInflected(expression, reading, source) {