diff options
-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 | ||||
-rw-r--r-- | test/data/html/test-document1.html | 42 | ||||
-rw-r--r-- | test/test-document-util.js | 5 | ||||
-rw-r--r-- | test/test-options-util.js | 4 |
9 files changed, 107 insertions, 24 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> diff --git a/test/data/html/test-document1.html b/test/data/html/test-document1.html index af38540f..78d862c4 100644 --- a/test/data/html/test-document1.html +++ b/test/data/html/test-document1.html @@ -159,6 +159,48 @@ <div class="test" + data-test-type="scan" + data-element-from-point-selector="span:nth-of-type(3)" + data-caret-range-from-point-selector="span:nth-of-type(3)" + data-start-node-selector="span:nth-of-type(3)" + data-start-offset="0" + data-end-node-selector="span:nth-of-type(3)" + data-end-offset="0" + data-result-type="TextSourceRange" + data-sentence-scan-extent="22" + data-sentence="ありがとございます3" + data-terminate-at-newlines="true" + > +<span>ありがとございます1</span> +<span>ありがとございます2</span> +<span>ありがとございます3</span> +<span>ありがとございます4</span> +<span>ありがとございます5</span> + </div> + + <div + class="test" + data-test-type="scan" + data-element-from-point-selector="span:nth-of-type(3)" + data-caret-range-from-point-selector="span:nth-of-type(3)" + data-start-node-selector="span:nth-of-type(3)" + data-start-offset="0" + data-end-node-selector="span:nth-of-type(3)" + data-end-offset="0" + data-result-type="TextSourceRange" + data-sentence-scan-extent="22" + data-sentence="ありがとございます1 ありがとございます2 ありがとございます3 ありがとございます4" + data-terminate-at-newlines="false" + > +<span>ありがとございます1</span> +<span>ありがとございます2</span> +<span>ありがとございます3</span> +<span>ありがとございます4</span> +<span>ありがとございます5</span> + </div> + + <div + class="test" data-test-type="text-source-range-seek" data-seek-node-selector="span:nth-of-type(1)" data-seek-node-is-text="true" diff --git a/test/test-document-util.js b/test/test-document-util.js index 52fabf97..e5966034 100644 --- a/test/test-document-util.js +++ b/test/test-document-util.js @@ -129,7 +129,8 @@ async function testDocumentTextScanningFunctions(dom, {DocumentUtil, TextSourceR resultType, sentenceScanExtent, sentence, - hasImposter + hasImposter, + terminateAtNewlines } = testElement.dataset; const elementFromPointValue = querySelectorChildOrSelf(testElement, elementFromPointSelector); @@ -140,6 +141,7 @@ async function testDocumentTextScanningFunctions(dom, {DocumentUtil, TextSourceR startOffset = parseInt(startOffset, 10); endOffset = parseInt(endOffset, 10); sentenceScanExtent = parseInt(sentenceScanExtent, 10); + terminateAtNewlines = (terminateAtNewlines !== 'false'); assert.notStrictEqual(elementFromPointValue, null); assert.notStrictEqual(caretRangeFromPointValue, null); @@ -200,6 +202,7 @@ async function testDocumentTextScanningFunctions(dom, {DocumentUtil, TextSourceR source, false, sentenceScanExtent, + terminateAtNewlines, terminatorMap, forwardQuoteMap, backwardQuoteMap diff --git a/test/test-options-util.js b/test/test-options-util.js index 07b41635..8b65f134 100644 --- a/test/test-options-util.js +++ b/test/test-options-util.js @@ -438,7 +438,7 @@ function createProfileOptionsUpdatedTestData1() { }, sentenceParsing: { scanExtent: 200, - enableTerminationCharacters: true, + terminationCharacterMode: 'custom', terminationCharacters: [ {enabled: true, character1: '「', character2: '」', includeCharacterAtStart: false, includeCharacterAtEnd: false}, {enabled: true, character1: '『', character2: '』', includeCharacterAtStart: false, includeCharacterAtEnd: false}, @@ -576,7 +576,7 @@ function createOptionsUpdatedTestData1() { } ], profileCurrent: 0, - version: 11, + version: 12, global: { database: { prefixWildcardsSupported: false |