diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2023-12-28 22:04:47 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-29 03:04:47 +0000 | 
| commit | 476d7548022ab25cc499f9b3bb712c81a6d3240c (patch) | |
| tree | 99401f85513f5c09c2581813673cf95e1b7b4433 /ext/js | |
| parent | 580983b9b8a17965db1466aa08cad3c96b06022e (diff) | |
Simplify dom text scanner (#453)
* Remove "enum" from name, update comment
* Simplify
Diffstat (limited to 'ext/js')
| -rw-r--r-- | ext/js/dom/dom-text-scanner.js | 199 | 
1 files changed, 75 insertions, 124 deletions
| diff --git a/ext/js/dom/dom-text-scanner.js b/ext/js/dom/dom-text-scanner.js index 6d979515..21770a70 100644 --- a/ext/js/dom/dom-text-scanner.js +++ b/ext/js/dom/dom-text-scanner.js @@ -169,34 +169,16 @@ export class DOMTextScanner {          const nodeValue = /** @type {string} */ (textNode.nodeValue);          const nodeValueLength = nodeValue.length;          const {preserveNewlines, preserveWhitespace} = this._getWhitespaceSettings(textNode); +        if (resetOffset) { this._offset = 0; } -        let done = false; -        let lineHasWhitespace = this._lineHasWhitespace; -        let lineHasContent = this._lineHasContent; -        let content = this._content; -        let offset = resetOffset ? 0 : this._offset; -        let remainder = this._remainder; -        let newlines = this._newlines; - -        while (offset < nodeValueLength) { -            const char = StringUtil.readCodePointsForward(nodeValue, offset, 1); -            offset += char.length; +        while (this._offset < nodeValueLength) { +            const char = StringUtil.readCodePointsForward(nodeValue, this._offset, 1); +            this._offset += char.length;              const charAttributes = DOMTextScanner.getCharacterAttributes(char, preserveNewlines, preserveWhitespace); -            /** @type {import('dom-text-scanner').SeekTextNoteDetails} */ -            const seekTextNoteDetails = {done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines}; - -            ({done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines} = this._checkCharacterForward(char, charAttributes, seekTextNoteDetails)); -            if (done) { break; } +            if (this._checkCharacterForward(char, charAttributes)) { break; }          } -        this._lineHasWhitespace = lineHasWhitespace; -        this._lineHasContent = lineHasContent; -        this._content = content; -        this._offset = offset; -        this._remainder = remainder; -        this._newlines = newlines; - -        return (remainder > 0); +        return this._remainder > 0;      }      /** @@ -216,35 +198,16 @@ export class DOMTextScanner {          const nodeValue = /** @type {string} */ (textNode.nodeValue);          const nodeValueLength = nodeValue.length;          const {preserveNewlines, preserveWhitespace} = this._getWhitespaceSettings(textNode); +        if (resetOffset) { this._offset = nodeValueLength; } -        let done = false; -        let lineHasWhitespace = this._lineHasWhitespace; -        let lineHasContent = this._lineHasContent; -        let content = this._content; -        let offset = resetOffset ? nodeValueLength : this._offset; -        let remainder = this._remainder; -        let newlines = this._newlines; - -        while (offset > 0) { -            const char = StringUtil.readCodePointsBackward(nodeValue, offset - 1, 1); -            offset -= char.length; +        while (this._offset > 0) { +            const char = StringUtil.readCodePointsBackward(nodeValue, this._offset - 1, 1); +            this._offset -= char.length;              const charAttributes = DOMTextScanner.getCharacterAttributes(char, preserveNewlines, preserveWhitespace); - -            /** @type {import('dom-text-scanner').SeekTextNoteDetails} */ -            const seekTextNoteDetails = {done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines}; - -            ({done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines} = this._checkCharacterBackward(char, charAttributes, seekTextNoteDetails)); -            if (done) { break; } +            if (this._checkCharacterBackward(char, charAttributes)) { break; }          } -        this._lineHasWhitespace = lineHasWhitespace; -        this._lineHasContent = lineHasContent; -        this._content = content; -        this._offset = offset; -        this._remainder = remainder; -        this._newlines = newlines; - -        return (remainder > 0); +        return this._remainder > 0;      }      /** @@ -275,126 +238,114 @@ export class DOMTextScanner {      /**       * @param {string} char -     * @param {import('dom-text-scanner').CharacterAttributesEnum} charAttributes -     * @param {import('dom-text-scanner').SeekTextNoteDetails} seekTextNoteDetails -     * @returns {import('dom-text-scanner').SeekTextNoteDetails} +     * @param {import('dom-text-scanner').CharacterAttributes} charAttributes +     * @returns {boolean}       */ -    _checkCharacterForward(char, charAttributes, seekTextNoteDetails) { -        let {done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines} = seekTextNoteDetails; - +    _checkCharacterForward(char, charAttributes) {          switch (charAttributes) { -            case 0: -                break; +            // case 0: break; // NOP              case 1: -                lineHasWhitespace = true; +                this._lineHasWhitespace = true;                  break;              case 2:              case 3: -                if (newlines > 0) { -                    if (content.length > 0) { -                        const useNewlineCount = Math.min(remainder, newlines); -                        content += '\n'.repeat(useNewlineCount); -                        remainder -= useNewlineCount; -                        newlines -= useNewlineCount; +                if (this._newlines > 0) { +                    if (this._content.length > 0) { +                        const useNewlineCount = Math.min(this._remainder, this._newlines); +                        this._content += '\n'.repeat(useNewlineCount); +                        this._remainder -= useNewlineCount; +                        this._newlines -= useNewlineCount;                      } else { -                        newlines = 0; +                        this._newlines = 0;                      } -                    lineHasContent = false; -                    lineHasWhitespace = false; -                    if (remainder <= 0) { -                        offset -= char.length; // Revert character offset -                        done = true; -                        break; +                    this._lineHasContent = false; +                    this._lineHasWhitespace = false; +                    if (this._remainder <= 0) { +                        this._offset -= char.length; // Revert character offset +                        return true;                      }                  } -                lineHasContent = (charAttributes === 2); // 3 = character is a newline +                this._lineHasContent = (charAttributes === 2); // 3 = character is a newline -                if (lineHasWhitespace) { -                    if (lineHasContent) { -                        content += ' '; -                        lineHasWhitespace = false; -                        if (--remainder <= 0) { -                            offset -= char.length; // Revert character offset -                            done = true; -                            break; +                if (this._lineHasWhitespace) { +                    if (this._lineHasContent) { +                        this._content += ' '; +                        this._lineHasWhitespace = false; +                        if (--this._remainder <= 0) { +                            this._offset -= char.length; // Revert character offset +                            return true;                          }                      } else { -                        lineHasWhitespace = false; +                        this._lineHasWhitespace = false;                      }                  } -                content += char; +                this._content += char; -                if (--remainder <= 0) { -                    done = true; -                    break; +                if (--this._remainder <= 0) { +                    return true;                  } +                break;          } -        return {done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines}; +        return false;      }      /**       * @param {string} char -     * @param {import('dom-text-scanner').CharacterAttributesEnum} charAttributes -     * @param {import('dom-text-scanner').SeekTextNoteDetails} seekTextNoteDetails -     * @returns {import('dom-text-scanner').SeekTextNoteDetails} +     * @param {import('dom-text-scanner').CharacterAttributes} charAttributes +     * @returns {boolean}       */ -    _checkCharacterBackward(char, charAttributes, seekTextNoteDetails) { -        let {done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines} = seekTextNoteDetails; - +    _checkCharacterBackward(char, charAttributes) {          switch (charAttributes) { -            case 0: -                break; +            // case 0: break; // NOP              case 1: -                lineHasWhitespace = true; +                this._lineHasWhitespace = true;                  break;              case 2:              case 3: -                if (newlines > 0) { -                    if (content.length > 0) { -                        const useNewlineCount = Math.min(remainder, newlines); -                        content = '\n'.repeat(useNewlineCount) + content; -                        remainder -= useNewlineCount; -                        newlines -= useNewlineCount; +                if (this._newlines > 0) { +                    if (this._content.length > 0) { +                        const useNewlineCount = Math.min(this._remainder, this._newlines); +                        this._content = '\n'.repeat(useNewlineCount) + this._content; +                        this._remainder -= useNewlineCount; +                        this._newlines -= useNewlineCount;                      } else { -                        newlines = 0; +                        this._newlines = 0;                      } -                    lineHasContent = false; -                    lineHasWhitespace = false; -                    if (remainder <= 0) { -                        offset += char.length; // Revert character offset -                        done = true; -                        break; +                    this._lineHasContent = false; +                    this._lineHasWhitespace = false; +                    if (this._remainder <= 0) { +                        this._offset += char.length; // Revert character offset +                        return true;                      }                  } -                lineHasContent = (charAttributes === 2); // 3 = character is a newline +                this._lineHasContent = (charAttributes === 2); // 3 = character is a newline -                if (lineHasWhitespace) { -                    if (lineHasContent) { -                        content = ' ' + content; -                        lineHasWhitespace = false; -                        if (--remainder <= 0) { -                            offset += char.length; // Revert character offset -                            done = true; -                            break; +                if (this._lineHasWhitespace) { +                    if (this._lineHasContent) { +                        this._content = ' ' + this._content; +                        this._lineHasWhitespace = false; +                        if (--this._remainder <= 0) { +                            this._offset += char.length; // Revert character offset +                            return true;                          }                      } else { -                        lineHasWhitespace = false; +                        this._lineHasWhitespace = false;                      }                  } -                content = char + content; +                this._content = char + this._content; -                if (--remainder <= 0) { -                    done = true; -                    break; +                if (--this._remainder <= 0) { +                    return true;                  } +                break;          } -        return {done, lineHasWhitespace, lineHasContent, content, offset, remainder, newlines}; +        return false;      }      // Static helpers @@ -515,7 +466,7 @@ export class DOMTextScanner {       * @param {string} character A string containing a single character.       * @param {boolean} preserveNewlines Whether or not newlines should be preserved.       * @param {boolean} preserveWhitespace Whether or not whitespace should be preserved. -     * @returns {import('dom-text-scanner').CharacterAttributesEnum} An enum representing the attributes of the character. +     * @returns {import('dom-text-scanner').CharacterAttributes} An enum representing the attributes of the character.       */      static getCharacterAttributes(character, preserveNewlines, preserveWhitespace) {          switch (character.charCodeAt(0)) { |