Pop-up dictionary browser extension for language learning. Successor to Yomichan. (PERSONAL FORK)

Fix setStartOffset stopAtWordBoundary behavior to terminate at the beginning of current div (#1782)

* Fix setStartOffset to terminate at the beginning of word, not right before it

* lint

* Fix tests

* Fix tests

authored by

James Maa and committed by
GitHub
65c7b5f6 0e63359f

+18 -20
+16 -18
ext/js/dom/dom-text-scanner.js
··· 131 131 let lastNode = /** @type {Node} */ (node); 132 132 let resetOffset = this._resetOffset; 133 133 let newlines = 0; 134 + seekLoop: 134 135 while (node !== null) { 135 136 let enterable = false; 136 137 const nodeType = node.nodeType; ··· 142 143 this._seekTextNodeBackward(/** @type {Text} */ (node), resetOffset); 143 144 144 145 if (!shouldContinueScanning) { 145 - // Length reached 146 + // Length reached or reached a word boundary 146 147 break; 147 148 } 148 149 } else if (nodeType === ELEMENT_NODE) { ··· 154 155 const initialNodeAtBeginningOfNodeGoingBackwards = node === this._initialNode && this._offset === 0 && !forward; 155 156 const initialNodeAtEndOfNodeGoingForwards = node === this._initialNode && this._offset === node.childNodes.length && forward; 156 157 this._offset = 0; 158 + const isInitialNode = node === this._initialNode; 157 159 ({enterable, newlines} = DOMTextScanner.getElementSeekInfo(/** @type {Element} */ (node))); 158 - if (newlines > this._newlines && generateLayoutContent) { 160 + if (!isInitialNode && newlines > this._newlines && generateLayoutContent) { 159 161 this._newlines = newlines; 160 162 } 161 163 if (initialNodeAtBeginningOfNodeGoingBackwards || initialNodeAtEndOfNodeGoingForwards) { ··· 172 174 ({newlines} = DOMTextScanner.getElementSeekInfo(/** @type {Element} */ (exitedNode))); 173 175 if (newlines > this._newlines && generateLayoutContent) { 174 176 this._newlines = newlines; 177 + } 178 + if (newlines > 0 && this._stopAtWordBoundary && !forward) { 179 + // Element nodes are considered word boundaries when scanning backwards 180 + break seekLoop; 175 181 } 176 182 } 177 183 ··· 285 291 case 2: 286 292 case 3: 287 293 if (this._newlines > 0) { 288 - if (this._content.length > 0) { 289 - const useNewlineCount = Math.min(this._remainder, this._newlines); 290 - this._content += '\n'.repeat(useNewlineCount); 291 - this._remainder -= useNewlineCount; 292 - this._newlines -= useNewlineCount; 293 - } else { 294 - this._newlines = 0; 295 - } 294 + const useNewlineCount = Math.min(this._remainder, this._newlines); 295 + this._content += '\n'.repeat(useNewlineCount); 296 + this._remainder -= useNewlineCount; 297 + this._newlines -= useNewlineCount; 296 298 this._lineHasContent = false; 297 299 this._lineHasWhitespace = false; 298 300 if (this._remainder <= 0) { ··· 341 343 case 2: 342 344 case 3: 343 345 if (this._newlines > 0) { 344 - if (this._content.length > 0) { 345 - const useNewlineCount = Math.min(this._remainder, this._newlines); 346 - this._content = '\n'.repeat(useNewlineCount) + this._content; 347 - this._remainder -= useNewlineCount; 348 - this._newlines -= useNewlineCount; 349 - } else { 350 - this._newlines = 0; 351 - } 346 + const useNewlineCount = Math.min(this._remainder, this._newlines); 347 + this._content = '\n'.repeat(useNewlineCount) + this._content; 348 + this._remainder -= useNewlineCount; 349 + this._newlines -= useNewlineCount; 352 350 this._lineHasContent = false; 353 351 this._lineHasWhitespace = false; 354 352 if (this._remainder <= 0) {
+2 -2
test/data/html/dom-text-scanner.html
··· 17 17 data-test-data='{ 18 18 "node": "div:nth-of-type(1)", 19 19 "offset": 0, 20 - "length": 15, 20 + "length": 16, 21 21 "expected": { 22 22 "node": "div:nth-of-type(2)>div::text", 23 23 "offset": 3, 24 - "content": "小ぢん\nまり1\n小ぢん\nまり2" 24 + "content": "\n小ぢん\nまり1\n小ぢん\nまり2" 25 25 } 26 26 }' 27 27 >