summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsiikamiika <siikamiika@users.noreply.github.com>2019-11-13 20:24:11 +0200
committersiikamiika <siikamiika@users.noreply.github.com>2019-11-23 17:50:46 +0200
commitcc8221c6ea686521261e2ac562d3d5a6d0b9913a (patch)
treea980f198da65ce61c2e43d3320f6623dba3885b7
parentf6253216505737d588ccff1f07cb5ce0332297a5 (diff)
add reading modes
-rw-r--r--ext/bg/js/api.js14
-rw-r--r--ext/bg/js/options.js3
-rw-r--r--ext/bg/js/settings.js2
-rw-r--r--ext/bg/settings.html9
-rw-r--r--ext/mixed/js/japanese.js37
5 files changed, 58 insertions, 7 deletions
diff --git a/ext/bg/js/api.js b/ext/bg/js/api.js
index bc9dfba1..228447c3 100644
--- a/ext/bg/js/api.js
+++ b/ext/bg/js/api.js
@@ -92,12 +92,13 @@ async function apiTextParse(text, optionsContext) {
const {expression, reading} = definitions[0];
const source = text.slice(0, sourceLength);
for (const {text, furigana} of jpDistributeFuriganaInflected(expression, reading, source)) {
- // can't use 'furigana' in templates
- term.push({text, reading: furigana});
+ const reading = jpConvertReading(text, furigana, options.parsing.readingMode);
+ term.push({text, reading});
}
text = text.slice(source.length);
} else {
- term.push({text: text[0]});
+ const reading = jpConvertReading(text[0], null, options.parsing.readingMode);
+ term.push({text: text[0], reading});
text = text.slice(1);
}
results.push(term);
@@ -122,11 +123,12 @@ async function apiTextParseMecab(text, optionsContext) {
jpKatakanaToHiragana(reading),
source
)) {
- // can't use 'furigana' in templates
- term.push({text, reading: furigana});
+ const reading = jpConvertReading(text, furigana, options.parsing.readingMode);
+ term.push({text, reading});
}
} else {
- term.push({text: source});
+ const reading = jpConvertReading(source, null, options.parsing.readingMode);
+ term.push({text: source, reading});
}
result.push(term);
}
diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js
index 053fb13d..b9bf85f3 100644
--- a/ext/bg/js/options.js
+++ b/ext/bg/js/options.js
@@ -314,7 +314,8 @@ function profileOptionsCreateDefaults() {
parsing: {
enableScanningParser: true,
enableMecabParser: false,
- selectedParser: null
+ selectedParser: null,
+ readingMode: 'hiragana'
},
anki: {
diff --git a/ext/bg/js/settings.js b/ext/bg/js/settings.js
index f4fe032a..ab267c32 100644
--- a/ext/bg/js/settings.js
+++ b/ext/bg/js/settings.js
@@ -66,6 +66,7 @@ async function formRead(options) {
options.parsing.enableScanningParser = $('#parsing-scan-enable').prop('checked');
options.parsing.enableMecabParser = $('#parsing-mecab-enable').prop('checked');
+ options.parsing.readingMode = $('#parsing-reading-mode').val();
const optionsAnkiEnableOld = options.anki.enable;
options.anki.enable = $('#anki-enable').prop('checked');
@@ -131,6 +132,7 @@ async function formWrite(options) {
$('#parsing-scan-enable').prop('checked', options.parsing.enableScanningParser);
$('#parsing-mecab-enable').prop('checked', options.parsing.enableMecabParser);
+ $('#parsing-reading-mode').val(options.parsing.readingMode);
$('#anki-enable').prop('checked', options.anki.enable);
$('#card-tags').val(options.anki.tags.join(' '));
diff --git a/ext/bg/settings.html b/ext/bg/settings.html
index 08b9b6c1..0badb817 100644
--- a/ext/bg/settings.html
+++ b/ext/bg/settings.html
@@ -437,6 +437,15 @@
<div class="checkbox">
<label><input type="checkbox" id="parsing-mecab-enable"> Enable text parsing using MeCab</label>
</div>
+
+ <div class="form-group">
+ <label for="parsing-reading-mode">Reading mode</label>
+ <select class="form-control" id="parsing-reading-mode">
+ <option value="hiragana">ひらがな</option>
+ <option value="katakana">カタカナ</option>
+ <option value="romaji">Romaji</option>
+ </select>
+ </div>
</div>
<div class="ignore-form-changes">
diff --git a/ext/mixed/js/japanese.js b/ext/mixed/js/japanese.js
index e2d7a090..a7cd0452 100644
--- a/ext/mixed/js/japanese.js
+++ b/ext/mixed/js/japanese.js
@@ -48,6 +48,43 @@ function jpKatakanaToHiragana(text) {
return result;
}
+function jpHiraganaToKatakana(text) {
+ let result = '';
+ for (const c of text) {
+ if (wanakana.isHiragana(c)) {
+ result += wanakana.toKatakana(c);
+ } else {
+ result += c;
+ }
+ }
+
+ return result;
+}
+
+function jpToRomaji(text) {
+ return wanakana.toRomaji(text);
+}
+
+function jpConvertReading(expressionFragment, readingFragment, readingMode) {
+ switch (readingMode) {
+ case 'hiragana':
+ return jpKatakanaToHiragana(readingFragment || '');
+ case 'katakana':
+ return jpHiraganaToKatakana(readingFragment || '');
+ case 'romaji':
+ if (readingFragment) {
+ return jpToRomaji(readingFragment);
+ } else {
+ if (jpIsKana(expressionFragment)) {
+ return jpToRomaji(expressionFragment);
+ }
+ }
+ return readingFragment;
+ default:
+ return readingFragment;
+ }
+}
+
function jpDistributeFurigana(expression, reading) {
const fallback = [{furigana: reading, text: expression}];
if (!reading) {