diff options
| -rw-r--r-- | ext/bg/guide.html | 32 | ||||
| -rw-r--r-- | ext/bg/js/options.js | 5 | ||||
| -rw-r--r-- | ext/bg/js/util.js | 6 | ||||
| -rw-r--r-- | ext/bg/js/yomichan.js | 10 | ||||
| -rw-r--r-- | ext/bg/options.html | 11 | ||||
| -rw-r--r-- | ext/fg/js/driver.js | 8 | ||||
| -rw-r--r-- | ext/fg/js/util.js | 16 | ||||
| -rw-r--r-- | ext/manifest.json | 2 | ||||
| -rw-r--r-- | ext/mixed/js/display.js | 8 | ||||
| -rw-r--r-- | ext/mixed/js/util.js | 23 | 
10 files changed, 72 insertions, 49 deletions
| diff --git a/ext/bg/guide.html b/ext/bg/guide.html index 6c38e351..4b01ae7c 100644 --- a/ext/bg/guide.html +++ b/ext/bg/guide.html @@ -9,28 +9,24 @@      <body>          <div class="container">              <div class="page-header"> -                <h1>Welcome to Yomichan!</h1> +                <h1>Yomichan Usage Guide</h1>              </div> -            <p>Thank you for downloading this extension! I hope that Yomichan will help you on your language learning journey.</p> +            <p> +                Read the steps below to get up and running with Yomichan. For complete documentation, +                visit the <a href="https://foosoft.net/projects/yomichan/" target="_blank">official homepage</a>. +            </p> -            <div> -                <h2>Quick Guide</h2> +            <ol> +                <li>Click on the <img src="/mixed/img/icon16.png" alt> icon in the browser toolbar to open the Yomichan actions dialog.</li> +                <li>Click on the <em>monkey wrench</em> icon in the middle to open the options page.</li> +                <li>Import the dictionaries you wish to use for term and Kanji searches.</li> +                <li>Hold down <kbd>Shift</kbd> key or the middle mouse button as you move your mouse over text to display definitions.</li> +                <li>Click on the <img src="/mixed/img/play-audio.png" alt> icon to hear the term pronounced by a native speaker.</li> +                <li>Click on individual Kanji in the term definition results to view additional information about those characters.</li> +            </ol> -                <p> -                    Read the steps below to get up and running with Yomichan. For complete documentation, -                    visit the <a href="https://foosoft.net/projects/yomichan/" target="_blank">official homepage</a>. -                </p> - -                <ol> -                    <li>Click on the <img src="/mixed/img/icon16.png" alt> icon in the browser toolbar to open the Yomichan actions dialog.</li> -                    <li>Click on the <em>monkey wrench</em> icon in the middle to open the options page.</li> -                    <li>Import the dictionaries you wish to use for term and Kanji searches.</li> -                    <li>Hold down <kbd>Shift</kbd> key or the middle mouse button as you move your mouse over text to display definitions.</li> -                    <li>Click on the <img src="/mixed/img/play-audio.png" alt> icon to hear the term pronounced by a native speaker.</li> -                    <li>Click on individual Kanji in the term definition results to view additional information about those characters.</li> -                </ol> -            </div> +            <p>This startup notification can be turned off on the Yomichan options page.</p>          </div>      </body>  </html> diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index ad8d83d8..49544840 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -25,6 +25,7 @@ function formRead() {      return optionsLoad().then(optionsOld => {          const optionsNew = $.extend(true, {}, optionsOld); +        optionsNew.general.showGuide = $('#show-usage-guide').prop('checked');          optionsNew.general.audioSource = $('#audio-playback-source').val();          optionsNew.general.audioVolume = $('#audio-playback-volume').val();          optionsNew.general.groupResults = $('#group-terms-results').prop('checked'); @@ -111,6 +112,7 @@ $(document).ready(() => {      handlebarsRegister();      optionsLoad().then(options => { +        $('#show-usage-guide').prop('checked', options.general.showGuide);          $('#audio-playback-source').val(options.general.audioSource);          $('#audio-playback-volume').val(options.general.audioVolume);          $('#group-terms-results').prop('checked', options.general.groupResults); @@ -368,9 +370,6 @@ function ankiFieldsPopulate(element, options) {          ],          'kanji': [              'character', -            'cloze-body', -            'cloze-prefix', -            'cloze-suffix',              'dictionary',              'glossary',              'kunyomi', diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index 05c7ff27..64143ffe 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -89,7 +89,8 @@ function optionsSetDefaults(options) {              showAdvanced: false,              popupWidth: 400,              popupHeight: 250, -            popupOffset: 10 +            popupOffset: 10, +            showGuide: true          },          scanning: { @@ -144,6 +145,9 @@ function optionsVersion(options) {              } else {                  options.general.audioSource = 'disabled';              } +        }, +        () => { +            options.general.showGuide = false;          }      ]; diff --git a/ext/bg/js/yomichan.js b/ext/bg/js/yomichan.js index feb74b6e..51e05c80 100644 --- a/ext/bg/js/yomichan.js +++ b/ext/bg/js/yomichan.js @@ -28,8 +28,8 @@ window.yomichan = new class {          this.translator.prepare().then(optionsLoad).then(this.optionsSet.bind(this)).then(() => {              chrome.commands.onCommand.addListener(this.onCommand.bind(this));              chrome.runtime.onMessage.addListener(this.onMessage.bind(this)); -            if (chrome.runtime.onInstalled) { -                chrome.runtime.onInstalled.addListener(this.onInstalled.bind(this)); +            if (this.options.general.showGuide) { +                chrome.tabs.create({url: chrome.extension.getURL('/bg/guide.html')});              }          });      } @@ -157,12 +157,6 @@ window.yomichan = new class {          return Promise.resolve(handlebarsRender(template, data));      } -    onInstalled(details) { -        if (details.reason === 'install') { -            chrome.tabs.create({url: chrome.extension.getURL('/bg/guide.html')}); -        } -    } -      onCommand(command) {          const handlers = {              search: () => { diff --git a/ext/bg/options.html b/ext/bg/options.html index 939227b0..e6c5e8be 100644 --- a/ext/bg/options.html +++ b/ext/bg/options.html @@ -26,6 +26,10 @@                  <h3>General Options</h3>                  <div class="checkbox"> +                    <label><input type="checkbox" id="show-usage-guide"> Show usage guide on startup</label> +                </div> + +                <div class="checkbox">                      <label><input type="checkbox" id="group-terms-results"> Group term results</label>                  </div> @@ -193,6 +197,13 @@                          <input type="text" id="interface-server" class="form-control">                      </div> +                    <p class="help-block"> +                        Specify the information you would like included in your flashcards in the field editor below. +                        Please be aware that Anki requires the first field in the model to be unique. It is highly recommended +                        that you set it to <code>{expression}</code> for term flashcards and <code>{character}</code> for +                        Kanji flashcards. +                    </p> +                      <div id="anki-format">                          <ul class="nav nav-tabs">                              <li class="active"><a href="#terms" data-toggle="tab">Terms</a></li> diff --git a/ext/fg/js/driver.js b/ext/fg/js/driver.js index 49147c8f..e94a4ac2 100644 --- a/ext/fg/js/driver.js +++ b/ext/fg/js/driver.js @@ -172,13 +172,13 @@ window.driver = new class {              } else {                  textSource.setEndOffset(length); -                const cloze = docClozeExtract(textSource, this.options.anki.sentenceExt); +                const sentence = docSentenceExtract(textSource, this.options.anki.sentenceExt);                  const url = window.location.href;                  this.popup.showTermDefs(                      textSource.getRect(),                      definitions,                      this.options, -                    {cloze, url} +                    {sentence, url}                  );                  this.lastTextSource = textSource; @@ -198,13 +198,13 @@ window.driver = new class {              if (definitions.length === 0) {                  return false;              } else { -                const cloze = docClozeExtract(textSource, this.options.anki.sentenceExt); +                const sentence = docSentenceExtract(textSource, this.options.anki.sentenceExt);                  const url = window.location.href;                  this.popup.showKanjiDefs(                      textSource.getRect(),                      definitions,                      this.options, -                    {cloze, url} +                    {sentence, url}                  );                  this.lastTextSource = textSource; diff --git a/ext/fg/js/util.js b/ext/fg/js/util.js index a1bce660..e5705ffd 100644 --- a/ext/fg/js/util.js +++ b/ext/fg/js/util.js @@ -152,7 +152,7 @@ function docRangeFromPoint(point, imposter) {      return null;  } -function docClozeExtract(source, extent) { +function docSentenceExtract(source, extent) {      const quotesFwd = {'「': '」', '『': '』', "'": "'", '"': '"'};      const quotesBwd = {'」': '「', '』': '『', "'": "'", '"': '"'};      const terminators = '…。..??!!'; @@ -182,7 +182,7 @@ function docClozeExtract(source, extent) {      quoteStack = []; -    let endPos = content.length - 1; +    let endPos = content.length;      for (let i = position; i <= endPos; ++i) {          const c = content[i]; @@ -204,15 +204,11 @@ function docClozeExtract(source, extent) {          }      } -    const sentence = content.substring(startPos, endPos); -    const clozePrefix = sentence.substring(0, position - startPos); -    const clozeBody = source.text(); -    const clozeSuffix = sentence.substring(position - startPos + clozeBody.length); +    const text = content.substring(startPos, endPos); +    const padding = text.length - text.replace(/^\s+/, '').length;      return { -        sentence: sentence.trim(), -        prefix: clozePrefix.trim(), -        body: clozeBody.trim(), -        suffix: clozeSuffix.trim() +        text: text.trim(), +        offset: position - startPos - padding      };  } diff --git a/ext/manifest.json b/ext/manifest.json index a19a0e52..17d063c4 100644 --- a/ext/manifest.json +++ b/ext/manifest.json @@ -1,7 +1,7 @@  {      "manifest_version": 2,      "name": "Yomichan", -    "version": "1.1.11", +    "version": "1.1.12",      "description": "Japanese dictionary with Anki integration",      "icons": {"16": "mixed/img/icon16.png", "48": "mixed/img/icon48.png", "128": "mixed/img/icon128.png"}, diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index f5ad4849..64d462ae 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -74,7 +74,7 @@ class Display {          if (context) {              for (const definition of definitions) { -                definition.cloze = context.cloze; +                definition.cloze = clozeBuild(context.sentence, definition.source);                  definition.url = context.url;              }          } @@ -108,7 +108,7 @@ class Display {          if (context) {              for (const definition of definitions) { -                definition.cloze = context.cloze; +                definition.cloze = clozeBuild(context.sentence);                  definition.url = context.url;              }          } @@ -181,7 +181,7 @@ class Display {          };          if (this.context) { -            context.cloze = this.context.cloze; +            context.sentence = this.context.sentence;              context.url = this.context.url;          } @@ -308,7 +308,7 @@ class Display {          if (this.context && this.context.source) {              const context = {                  url: this.context.source.url, -                cloze: this.context.source.cloze, +                sentence: this.context.source.sentence,                  index: this.context.source.index              }; diff --git a/ext/mixed/js/util.js b/ext/mixed/js/util.js index edd49873..62838674 100644 --- a/ext/mixed/js/util.js +++ b/ext/mixed/js/util.js @@ -18,6 +18,25 @@  /* + * Cloze + */ + +function clozeBuild(sentence, source) { +    const result = { +        sentence: sentence.text.trim() +    }; + +    if (source) { +        result.prefix = sentence.text.substring(0, sentence.offset).trim(); +        result.body = source.trim(); +        result.suffix = sentence.text.substring(sentence.offset + source.length).trim(); +    } + +    return result; +} + + +/*   * Audio   */ @@ -103,6 +122,10 @@ function audioBuildFilename(definition) {  }  function audioInject(definition, fields, mode) { +    if (mode === 'disabled') { +        return Promise.resolve(true); +    } +      const filename = audioBuildFilename(definition);      if (!filename) {          return Promise.resolve(true); |