summaryrefslogtreecommitdiffstats
path: root/src/js/text-utils.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 05:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 05:47:55 +0000
commit31d6ff6f931696850c348007241195ab3b2eddc7 (patch)
tree615cb1c57ce9f6611bad93326b9105098f379609 /src/js/text-utils.js
parentInitial commit. (diff)
downloadublock-origin-31d6ff6f931696850c348007241195ab3b2eddc7.tar.xz
ublock-origin-31d6ff6f931696850c348007241195ab3b2eddc7.zip
Adding upstream version 1.55.0+dfsg.upstream/1.55.0+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/js/text-utils.js')
-rw-r--r--src/js/text-utils.js107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/js/text-utils.js b/src/js/text-utils.js
new file mode 100644
index 0000000..198a433
--- /dev/null
+++ b/src/js/text-utils.js
@@ -0,0 +1,107 @@
+/*******************************************************************************
+
+ uBlock Origin - a comprehensive, efficient content blocker
+ Copyright (C) 2014-present Raymond Hill
+
+ 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 {http://www.gnu.org/licenses/}.
+
+ Home: https://github.com/gorhill/uBlock
+*/
+
+'use strict';
+
+/******************************************************************************/
+
+// https://bugs.chromium.org/p/v8/issues/detail?id=2869
+// orphanizeString is to work around String.slice() potentially causing
+// the whole raw filter list to be held in memory just because we cut out
+// the title as a substring.
+
+function orphanizeString(s) {
+ return JSON.parse(JSON.stringify(s));
+}
+
+/******************************************************************************/
+
+class LineIterator {
+ constructor(text, offset) {
+ this.text = text;
+ this.textLen = this.text.length;
+ this.offset = offset || 0;
+ }
+ next(offset) {
+ if ( offset !== undefined ) {
+ this.offset += offset;
+ }
+ let lineEnd = this.text.indexOf('\n', this.offset);
+ if ( lineEnd === -1 ) {
+ lineEnd = this.text.indexOf('\r', this.offset);
+ if ( lineEnd === -1 ) {
+ lineEnd = this.textLen;
+ }
+ }
+ const line = this.text.slice(this.offset, lineEnd);
+ this.offset = lineEnd + 1;
+ return line;
+ }
+ peek(n) {
+ const offset = this.offset;
+ return this.text.slice(offset, offset + n);
+ }
+ charCodeAt(offset) {
+ return this.text.charCodeAt(this.offset + offset);
+ }
+ eot() {
+ return this.offset >= this.textLen;
+ }
+}
+
+/******************************************************************************/
+
+// The field iterator is less CPU-intensive than when using native
+// String.split().
+
+class FieldIterator {
+ constructor(sep) {
+ this.text = '';
+ this.sep = sep;
+ this.sepLen = sep.length;
+ this.offset = 0;
+ }
+ first(text) {
+ this.text = text;
+ this.offset = 0;
+ return this.next();
+ }
+ next() {
+ let end = this.text.indexOf(this.sep, this.offset);
+ if ( end === -1 ) {
+ end = this.text.length;
+ }
+ const field = this.text.slice(this.offset, end);
+ this.offset = end + this.sepLen;
+ return field;
+ }
+ remainder() {
+ return this.text.slice(this.offset);
+ }
+}
+
+/******************************************************************************/
+
+export {
+ FieldIterator,
+ LineIterator,
+ orphanizeString,
+};