diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/css/settings.css | 3 | ||||
| -rw-r--r-- | ext/data/schemas/options-schema.json | 7 | ||||
| -rw-r--r-- | ext/js/data/options-util.js | 14 | ||||
| -rw-r--r-- | ext/js/dom/document-util.js | 7 | ||||
| -rw-r--r-- | ext/js/language/text-scanner.js | 17 | ||||
| -rw-r--r-- | ext/settings.html | 32 | 
6 files changed, 59 insertions, 21 deletions
| diff --git a/ext/css/settings.css b/ext/css/settings.css index 2b0d5e8e..1bc2d1a7 100644 --- a/ext/css/settings.css +++ b/ext/css/settings.css @@ -2249,6 +2249,9 @@ input[type=number].dictionary-priority {      align-content: flex-start;      justify-content: flex-start;  } +.horizontal-flex.horizontal-flex-nowrap { +    flex-wrap: nowrap; +}  .horizontal-flex>* {      margin-left: 0.375em;  } diff --git a/ext/data/schemas/options-schema.json b/ext/data/schemas/options-schema.json index 1f27c330..3f5bd0c7 100644 --- a/ext/data/schemas/options-schema.json +++ b/ext/data/schemas/options-schema.json @@ -925,7 +925,7 @@                                  "type": "object",                                  "required": [                                      "scanExtent", -                                    "enableTerminationCharacters", +                                    "terminationCharacterMode",                                      "terminationCharacters"                                  ],                                  "properties": { @@ -934,8 +934,9 @@                                          "minimum": 0,                                          "default": 200                                      }, -                                    "enableTerminationCharacters": { -                                        "type": "boolean", +                                    "terminationCharacterMode": { +                                        "type": "string", +                                        "enum": ["custom", "custom-no-newlines", "newlines", "none"],                                          "default": true                                      },                                      "terminationCharacters": { diff --git a/ext/js/data/options-util.js b/ext/js/data/options-util.js index cb7946f7..cb58206f 100644 --- a/ext/js/data/options-util.js +++ b/ext/js/data/options-util.js @@ -460,7 +460,8 @@ class OptionsUtil {              {async: true,  update: this._updateVersion8.bind(this)},              {async: false, update: this._updateVersion9.bind(this)},              {async: true,  update: this._updateVersion10.bind(this)}, -            {async: true,  update: this._updateVersion11.bind(this)} +            {async: false, update: this._updateVersion11.bind(this)}, +            {async: false, update: this._updateVersion12.bind(this)}          ];      } @@ -811,4 +812,15 @@ class OptionsUtil {          }          return options;      } + +    _updateVersion12(options) { +        // Version 12 changes: +        //  Changed sentenceParsing.enableTerminationCharacters to sentenceParsing.terminationCharacterMode. +        for (const profile of options.profiles) { +            const {sentenceParsing} = profile.options; +            sentenceParsing.terminationCharacterMode = sentenceParsing.enableTerminationCharacters ? 'custom' : 'newlines'; +            delete sentenceParsing.enableTerminationCharacters; +        } +        return options; +    }  } diff --git a/ext/js/dom/document-util.js b/ext/js/dom/document-util.js index 8284ffa5..da4d3e61 100644 --- a/ext/js/dom/document-util.js +++ b/ext/js/dom/document-util.js @@ -69,6 +69,7 @@ class DocumentUtil {       * @param source The text source object, either `TextSourceRange` or `TextSourceElement`.       * @param layoutAwareScan Whether or not layout-aware scan mode should be used.       * @param extent The length of the sentence to extract. +     * @param terminateAtNewlines Whether or not a sentence should be terminated at newline characters.       * @param terminatorMap A mapping of characters that terminate a sentence.       *   Format:       *   ```js @@ -87,7 +88,7 @@ class DocumentUtil {       *   ```       * @returns The sentence and the offset to the original source: `{sentence: string, offset: integer}`.       */ -    extractSentence(source, layoutAwareScan, extent, terminatorMap, forwardQuoteMap, backwardQuoteMap) { +    extractSentence(source, layoutAwareScan, extent, terminateAtNewlines, terminatorMap, forwardQuoteMap, backwardQuoteMap) {          // Scan text          source = source.clone();          const startLength = source.setStartOffset(extent, layoutAwareScan); @@ -102,7 +103,7 @@ class DocumentUtil {          let quoteStack = [];          for (; pos1 > 0; --pos1) {              const c = text[pos1 - 1]; -            if (c === '\n') { break; } +            if (c === '\n' && terminateAtNewlines) { break; }              if (quoteStack.length === 0) {                  const terminatorInfo = terminatorMap.get(c); @@ -133,7 +134,7 @@ class DocumentUtil {          quoteStack = [];          for (; pos2 < textLength; ++pos2) {              const c = text[pos2]; -            if (c === '\n') { break; } +            if (c === '\n' && terminateAtNewlines) { break; }              if (quoteStack.length === 0) {                  const terminatorInfo = terminatorMap.get(c); diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index a49627f8..2ebf26e2 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -63,6 +63,7 @@ class TextScanner extends EventDispatcher {          this._layoutAwareScan = false;          this._preventMiddleMouse = false;          this._sentenceScanExtent = 0; +        this._sentenceTerminateAtNewlines = true;          this._sentenceTerminatorMap = new Map();          this._sentenceForwardQuoteMap = new Map();          this._sentenceBackwardQuoteMap = new Map(); @@ -209,19 +210,23 @@ class TextScanner extends EventDispatcher {              this._preventMiddleMouse = preventMiddleMouse;          }          if (typeof sentenceParsingOptions === 'object' && sentenceParsingOptions !== null) { -            const {scanExtent, enableTerminationCharacters, terminationCharacters} = sentenceParsingOptions; -            const hasTerminationCharacters = (typeof terminationCharacters === 'object' && Array.isArray(terminationCharacters)); +            const {scanExtent, terminationCharacterMode, terminationCharacters} = sentenceParsingOptions;              if (typeof scanExtent === 'number') {                  this._sentenceScanExtent = sentenceParsingOptions.scanExtent;              } -            if (typeof enableTerminationCharacters === 'boolean' || hasTerminationCharacters) { +            if (typeof terminationCharacterMode === 'string') { +                this._sentenceTerminateAtNewlines = (terminationCharacterMode === 'custom' || terminationCharacterMode === 'newlines');                  const sentenceTerminatorMap = this._sentenceTerminatorMap;                  const sentenceForwardQuoteMap = this._sentenceForwardQuoteMap;                  const sentenceBackwardQuoteMap = this._sentenceBackwardQuoteMap;                  sentenceTerminatorMap.clear();                  sentenceForwardQuoteMap.clear();                  sentenceBackwardQuoteMap.clear(); -                if (enableTerminationCharacters !== false && hasTerminationCharacters) { +                if ( +                    typeof terminationCharacters === 'object' && +                    Array.isArray(terminationCharacters) && +                    (terminationCharacterMode === 'custom' || terminationCharacterMode === 'custom-no-newlines') +                ) {                      for (const {enabled, character1, character2, includeCharacterAtStart, includeCharacterAtEnd} of terminationCharacters) {                          if (!enabled) { continue; }                          if (character2 === null) { @@ -841,6 +846,7 @@ class TextScanner extends EventDispatcher {      async _findTermDictionaryEntries(textSource, optionsContext) {          const scanLength = this._scanLength;          const sentenceScanExtent = this._sentenceScanExtent; +        const sentenceTerminateAtNewlines = this._sentenceTerminateAtNewlines;          const sentenceTerminatorMap = this._sentenceTerminatorMap;          const sentenceForwardQuoteMap = this._sentenceForwardQuoteMap;          const sentenceBackwardQuoteMap = this._sentenceBackwardQuoteMap; @@ -856,6 +862,7 @@ class TextScanner extends EventDispatcher {              textSource,              layoutAwareScan,              sentenceScanExtent, +            sentenceTerminateAtNewlines,              sentenceTerminatorMap,              sentenceForwardQuoteMap,              sentenceBackwardQuoteMap @@ -866,6 +873,7 @@ class TextScanner extends EventDispatcher {      async _findKanjiDictionaryEntries(textSource, optionsContext) {          const sentenceScanExtent = this._sentenceScanExtent; +        const sentenceTerminateAtNewlines = this._sentenceTerminateAtNewlines;          const sentenceTerminatorMap = this._sentenceTerminatorMap;          const sentenceForwardQuoteMap = this._sentenceForwardQuoteMap;          const sentenceBackwardQuoteMap = this._sentenceBackwardQuoteMap; @@ -881,6 +889,7 @@ class TextScanner extends EventDispatcher {              textSource,              layoutAwareScan,              sentenceScanExtent, +            sentenceTerminateAtNewlines,              sentenceTerminatorMap,              sentenceForwardQuoteMap,              sentenceBackwardQuoteMap diff --git a/ext/settings.html b/ext/settings.html index 4b1ccae7..1b167e22 100644 --- a/ext/settings.html +++ b/ext/settings.html @@ -1257,18 +1257,30 @@          </div></div>          <div class="settings-item"><div class="settings-item-inner settings-item-inner-wrappable">              <div class="settings-item-left"> -                <div class="settings-item-label">Enable sentence termination characters</div> +                <div class="settings-item-label">Sentence termination characters</div>              </div>              <div class="settings-item-right"> -                <label class="toggle"><input type="checkbox" data-setting="sentenceParsing.enableTerminationCharacters"><span class="toggle-body"><span class="toggle-track"></span><span class="toggle-knob"></span></span></label> -            </div> -        </div></div> -        <div class="settings-item settings-item-button" data-modal-action="show,sentence-termination-characters"><div class="settings-item-inner"> -            <div class="settings-item-left"> -                <div class="settings-item-label">Configure sentence termination characters…</div> -            </div> -            <div class="settings-item-right open-panel-button-container"> -                <button class="icon-button"><span class="icon-button-inner"><span class="icon" data-icon="material-right-arrow"></span></span></button> +                <div class="horizontal-flex horizontal-flex-nowrap"> +                    <button class="low-emphasis" data-modal-action="show,sentence-termination-characters" id="configure-sentence-termination-characters-button" hidden>Configure…</button> +                    <select data-setting="sentenceParsing.terminationCharacterMode" +                        data-transform='{ +                            "type": "setVisibility", +                            "selector": "#configure-sentence-termination-characters-button", +                            "condition": { +                                "op": "||", +                                "value": [ +                                    {"op": "===", "value": "custom"}, +                                    {"op": "===", "value": "custom-no-newlines"} +                                ] +                            } +                        }' +                    > +                        <option value="custom">Custom</option> +                        <option value="custom-no-newlines">Custom, no newlines</option> +                        <option value="newlines">Newlines only</option> +                        <option value="none">None</option> +                    </select> +                </div>              </div>          </div></div>      </div> |