summaryrefslogtreecommitdiff
path: root/ext/js/dom
diff options
context:
space:
mode:
authorCashew <52880648+Scrub1492@users.noreply.github.com>2023-12-19 12:45:14 +0900
committerGitHub <noreply@github.com>2023-12-19 03:45:14 +0000
commit521e87d01142063c785054741d3703de37a1636c (patch)
treedaa3897860f074fb5203255a5126dd8aa99c3b26 /ext/js/dom
parentc661eafa7d57c32e33e51dd6eb787b97832e97f0 (diff)
capture all terminators and quotes in the sentence (#360)
* capture all terminators and quotes in the sentence * fix negative position, add documents and tests * fix comments giving wrong semantics * add test case coverage * remove cursor namespace for possible performance penalties * while loop optimization
Diffstat (limited to 'ext/js/dom')
-rw-r--r--ext/js/dom/document-util.js65
1 files changed, 49 insertions, 16 deletions
diff --git a/ext/js/dom/document-util.js b/ext/js/dom/document-util.js
index fe10d670..9e4f451a 100644
--- a/ext/js/dom/document-util.js
+++ b/ext/js/dom/document-util.js
@@ -113,19 +113,30 @@ export class DocumentUtil {
const text = source.text();
const textLength = text.length;
const textEndAnchor = textLength - endLength;
- let pos1 = startLength;
- let pos2 = textEndAnchor;
+
+ /** Relative start position of the sentence (inclusive). */
+ let cursorStart = startLength;
+ /** Relative end position of the sentence (exclusive). */
+ let cursorEnd = textEndAnchor;
// Move backward
let quoteStack = [];
- for (; pos1 > 0; --pos1) {
- const c = text[pos1 - 1];
+ for (; cursorStart > 0; --cursorStart) {
+ // Check if the previous character should be included.
+ let c = text[cursorStart - 1];
if (c === '\n' && terminateAtNewlines) { break; }
if (quoteStack.length === 0) {
- const terminatorInfo = terminatorMap.get(c);
+ let terminatorInfo = terminatorMap.get(c);
if (typeof terminatorInfo !== 'undefined') {
- if (terminatorInfo[0]) { --pos1; }
+ // Include the previous character while it is a terminator character and is included at start.
+ while (terminatorInfo[0] && cursorStart > 0) {
+ --cursorStart;
+ if (cursorStart === 0) { break; }
+ c = text[cursorStart - 1];
+ terminatorInfo = terminatorMap.get(c);
+ if (typeof terminatorInfo === 'undefined') { break; }
+ }
break;
}
}
@@ -133,7 +144,14 @@ export class DocumentUtil {
let quoteInfo = forwardQuoteMap.get(c);
if (typeof quoteInfo !== 'undefined') {
if (quoteStack.length === 0) {
- if (quoteInfo[1]) { --pos1; }
+ // Include the previous character while it is a quote character and is included at start.
+ while (quoteInfo[1] && cursorStart > 0) {
+ --cursorStart;
+ if (cursorStart === 0) { break; }
+ c = text[cursorStart - 1];
+ quoteInfo = forwardQuoteMap.get(c);
+ if (typeof quoteInfo === 'undefined') { break; }
+ }
break;
} else if (quoteStack[0] === c) {
quoteStack.pop();
@@ -149,14 +167,22 @@ export class DocumentUtil {
// Move forward
quoteStack = [];
- for (; pos2 < textLength; ++pos2) {
- const c = text[pos2];
+ for (; cursorEnd < textLength; ++cursorEnd) {
+ // Check if the following character should be included.
+ let c = text[cursorEnd];
if (c === '\n' && terminateAtNewlines) { break; }
if (quoteStack.length === 0) {
- const terminatorInfo = terminatorMap.get(c);
+ let terminatorInfo = terminatorMap.get(c);
if (typeof terminatorInfo !== 'undefined') {
- if (terminatorInfo[1]) { ++pos2; }
+ // Include the following character while it is a terminator character and is included at end.
+ while (terminatorInfo[1] && cursorEnd < textLength) {
+ ++cursorEnd;
+ if (cursorEnd === textLength) { break; }
+ c = text[cursorEnd];
+ terminatorInfo = terminatorMap.get(c);
+ if (typeof terminatorInfo === 'undefined') { break; }
+ }
break;
}
}
@@ -164,7 +190,14 @@ export class DocumentUtil {
let quoteInfo = backwardQuoteMap.get(c);
if (typeof quoteInfo !== 'undefined') {
if (quoteStack.length === 0) {
- if (quoteInfo[1]) { ++pos2; }
+ // Include the following character while it is a quote character and is included at end.
+ while (quoteInfo[1] && cursorEnd < textLength) {
+ ++cursorEnd;
+ if (cursorEnd === textLength) { break; }
+ c = text[cursorEnd];
+ quoteInfo = forwardQuoteMap.get(c);
+ if (typeof quoteInfo === 'undefined') { break; }
+ }
break;
} else if (quoteStack[0] === c) {
quoteStack.pop();
@@ -179,13 +212,13 @@ export class DocumentUtil {
}
// Trim whitespace
- for (; pos1 < startLength && this._isWhitespace(text[pos1]); ++pos1) { /* NOP */ }
- for (; pos2 > textEndAnchor && this._isWhitespace(text[pos2 - 1]); --pos2) { /* NOP */ }
+ for (; cursorStart < startLength && this._isWhitespace(text[cursorStart]); ++cursorStart) { /* NOP */ }
+ for (; cursorEnd > textEndAnchor && this._isWhitespace(text[cursorEnd - 1]); --cursorEnd) { /* NOP */ }
// Result
return {
- text: text.substring(pos1, pos2),
- offset: startLength - pos1
+ text: text.substring(cursorStart, cursorEnd),
+ offset: startLength - cursorStart
};
}