New StringUtil (#2216)

* Create new StringUtil

* Use StringUtil in DOMTextScanner

* Fix order
This commit is contained in:
toasted-nutbread 2022-08-20 13:11:38 -04:00 committed by GitHub
parent d3807d88ec
commit 4194252fe3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 85 additions and 41 deletions

View File

@ -55,6 +55,7 @@
"js/comm/frame-ancestry-handler.js", "js/comm/frame-ancestry-handler.js",
"js/comm/frame-client.js", "js/comm/frame-client.js",
"js/comm/frame-offset-forwarder.js", "js/comm/frame-offset-forwarder.js",
"js/data/sandbox/string-util.js",
"js/dom/dom-text-scanner.js", "js/dom/dom-text-scanner.js",
"js/dom/document-util.js", "js/dom/document-util.js",
"js/dom/text-source-element.js", "js/dom/text-source-element.js",

View File

@ -0,0 +1,69 @@
/*
* Copyright (C) 2022 Yomichan Authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* Class containing generic string utility functions.
*/
class StringUtil {
/**
* Reads code points from a string in the forward direction.
* @param {string} text The text to read the code points from.
* @param {number} position The index of the first character to read.
* @param {number} count The number of code points to read.
* @returns {string} The code points from the string.
*/
static readCodePointsForward(text, position, count) {
let result = '';
for (; count > 0; --count) {
const char = text[position];
const charCode = char.charCodeAt(0);
result += char;
if (charCode >= 0xd800 && charCode < 0xdc00 && ++position < text.length) {
const char2 = text[position];
const charCode2 = char2.charCodeAt(0);
if (charCode2 >= 0xdc00 && charCode2 < 0xe000) {
result += char2;
}
}
}
return result;
}
/**
* Reads code points from a string in the backward direction.
* @param {string} text The text to read the code points from.
* @param {number} position The index of the first character to read.
* @param {number} count The number of code points to read.
* @returns {string} The code points from the string.
*/
static readCodePointsBackward(text, position, count) {
let result = '';
for (; count > 0; --count) {
const char = text[position];
const charCode = char.charCodeAt(0);
result = char + result;
if (charCode >= 0xdc00 && charCode < 0xe000 && position > 0) {
const char2 = text[position - 1];
const charCode2 = char2.charCodeAt(0);
if (charCode2 >= 0xd800 && charCode2 < 0xdc00) {
result = char2 + result;
}
}
}
return result;
}
}

View File

@ -15,6 +15,10 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
/* global
* StringUtil
*/
/** /**
* A class used to scan text in a document. * A class used to scan text in a document.
*/ */
@ -145,44 +149,6 @@ class DOMTextScanner {
// Private // Private
/**
* Reads a code point in a string in the forward direction.
* @param {string} text The text to read the code point from.
* @param {number} position The index of the first character to read.
* @returns {string} The code point from the string.
*/
_readCodePointForward(text, position) {
let char = text[position];
const charCode = char.charCodeAt(0);
if (charCode >= 0xd800 && charCode < 0xdc00 && ++position < text.length) {
const char2 = text[position];
const charCode2 = char2.charCodeAt(0);
if (charCode2 >= 0xdc00 && charCode2 < 0xe000) {
char += char2;
}
}
return char;
}
/**
* Reads a code point in a string in the backward direction.
* @param {string} text The text to read the code point from.
* @param {number} position The index of the first character to read.
* @returns {string} The code point from the string.
*/
_readCodePointBackward(text, position) {
let char = text[position];
const charCode = char.charCodeAt(0);
if (charCode >= 0xdc00 && charCode < 0xe000 && position > 0) {
const char2 = text[position - 1];
const charCode2 = char2.charCodeAt(0);
if (charCode2 >= 0xd800 && charCode2 < 0xdc00) {
char = char2 + char;
}
}
return char;
}
/** /**
* Seeks forward in a text node. * Seeks forward in a text node.
* @param {Text} textNode The text node to use. * @param {Text} textNode The text node to use.
@ -202,7 +168,7 @@ class DOMTextScanner {
let newlines = this._newlines; let newlines = this._newlines;
while (offset < nodeValueLength) { while (offset < nodeValueLength) {
const char = this._readCodePointForward(nodeValue, offset); const char = StringUtil.readCodePointsForward(nodeValue, offset, 1);
offset += char.length; offset += char.length;
const charAttributes = DOMTextScanner.getCharacterAttributes(char, preserveNewlines, preserveWhitespace); const charAttributes = DOMTextScanner.getCharacterAttributes(char, preserveNewlines, preserveWhitespace);
@ -288,7 +254,7 @@ class DOMTextScanner {
let newlines = this._newlines; let newlines = this._newlines;
while (offset > 0) { while (offset > 0) {
const char = this._readCodePointBackward(nodeValue, offset - 1); const char = StringUtil.readCodePointsBackward(nodeValue, offset - 1, 1);
offset -= char.length; offset -= char.length;
const charAttributes = DOMTextScanner.getCharacterAttributes(char, preserveNewlines, preserveWhitespace); const charAttributes = DOMTextScanner.getCharacterAttributes(char, preserveNewlines, preserveWhitespace);

View File

@ -54,6 +54,7 @@
"js/comm/frame-ancestry-handler.js", "js/comm/frame-ancestry-handler.js",
"js/comm/frame-client.js", "js/comm/frame-client.js",
"js/comm/frame-offset-forwarder.js", "js/comm/frame-offset-forwarder.js",
"js/data/sandbox/string-util.js",
"js/dom/dom-text-scanner.js", "js/dom/dom-text-scanner.js",
"js/dom/document-util.js", "js/dom/document-util.js",
"js/dom/text-source-element.js", "js/dom/text-source-element.js",

View File

@ -50,6 +50,7 @@
<script src="/js/comm/frame-ancestry-handler.js"></script> <script src="/js/comm/frame-ancestry-handler.js"></script>
<script src="/js/comm/frame-client.js"></script> <script src="/js/comm/frame-client.js"></script>
<script src="/js/comm/frame-offset-forwarder.js"></script> <script src="/js/comm/frame-offset-forwarder.js"></script>
<script src="/js/data/sandbox/string-util.js"></script>
<script src="/js/dom/document-util.js"></script> <script src="/js/dom/document-util.js"></script>
<script src="/js/dom/dom-text-scanner.js"></script> <script src="/js/dom/dom-text-scanner.js"></script>
<script src="/js/dom/text-source-element.js"></script> <script src="/js/dom/text-source-element.js"></script>

View File

@ -104,6 +104,7 @@
<script src="/js/data/anki-note-builder.js"></script> <script src="/js/data/anki-note-builder.js"></script>
<script src="/js/data/anki-util.js"></script> <script src="/js/data/anki-util.js"></script>
<script src="/js/data/sandbox/array-buffer-util.js"></script> <script src="/js/data/sandbox/array-buffer-util.js"></script>
<script src="/js/data/sandbox/string-util.js"></script>
<script src="/js/display/display.js"></script> <script src="/js/display/display.js"></script>
<script src="/js/display/display-anki.js"></script> <script src="/js/display/display-anki.js"></script>
<script src="/js/display/display-audio.js"></script> <script src="/js/display/display-audio.js"></script>

View File

@ -91,6 +91,7 @@
<script src="/js/data/anki-note-builder.js"></script> <script src="/js/data/anki-note-builder.js"></script>
<script src="/js/data/anki-util.js"></script> <script src="/js/data/anki-util.js"></script>
<script src="/js/data/sandbox/array-buffer-util.js"></script> <script src="/js/data/sandbox/array-buffer-util.js"></script>
<script src="/js/data/sandbox/string-util.js"></script>
<script src="/js/display/display.js"></script> <script src="/js/display/display.js"></script>
<script src="/js/display/display-anki.js"></script> <script src="/js/display/display-anki.js"></script>
<script src="/js/display/display-audio.js"></script> <script src="/js/display/display-audio.js"></script>

View File

@ -94,6 +94,7 @@ async function testDocument1() {
const vm = new VM({document, window, Range, Node}); const vm = new VM({document, window, Range, Node});
vm.execute([ vm.execute([
'js/data/sandbox/string-util.js',
'js/dom/dom-text-scanner.js', 'js/dom/dom-text-scanner.js',
'js/dom/text-source-range.js', 'js/dom/text-source-range.js',
'js/dom/text-source-element.js', 'js/dom/text-source-element.js',

View File

@ -166,7 +166,10 @@ async function testDocument1() {
window.getComputedStyle = createAbsoluteGetComputedStyle(window); window.getComputedStyle = createAbsoluteGetComputedStyle(window);
const vm = new VM({document, window, Range, Node}); const vm = new VM({document, window, Range, Node});
vm.execute('js/dom/dom-text-scanner.js'); vm.execute([
'js/data/sandbox/string-util.js',
'js/dom/dom-text-scanner.js'
]);
const DOMTextScanner = vm.get('DOMTextScanner'); const DOMTextScanner = vm.get('DOMTextScanner');
await testDomTextScanner(dom, {DOMTextScanner}); await testDomTextScanner(dom, {DOMTextScanner});