diff options
| -rw-r--r-- | ext/bg/js/api.js | 14 | ||||
| -rw-r--r-- | ext/bg/js/options.js | 3 | ||||
| -rw-r--r-- | ext/bg/js/settings.js | 2 | ||||
| -rw-r--r-- | ext/bg/settings.html | 9 | ||||
| -rw-r--r-- | ext/mixed/js/japanese.js | 37 | 
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) { |