aboutsummaryrefslogtreecommitdiffstats
path: root/vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-13 21:34:48 -0800
commit76cb9c2a39d477a64824a985ade40507e3bbade1 (patch)
tree41e997aa9c6f538d3a136af61dae9424db2005a9 /vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js
parent819a39a21ac992b1393244a4c283bbb125208c69 (diff)
downloadneko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.gz
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.tar.bz2
neko-76cb9c2a39d477a64824a985ade40507e3bbade1.zip
feat(vanilla): add testing infrastructure and tests (NK-wjnczv)
Diffstat (limited to 'vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js')
-rw-r--r--vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js109
1 files changed, 109 insertions, 0 deletions
diff --git a/vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js b/vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js
new file mode 100644
index 0000000..d0b1895
--- /dev/null
+++ b/vanilla/node_modules/css-tree/lib/definition-syntax/scanner.js
@@ -0,0 +1,109 @@
+import { SyntaxError } from './SyntaxError.js';
+
+const TAB = 9;
+const N = 10;
+const F = 12;
+const R = 13;
+const SPACE = 32;
+const NAME_CHAR = new Uint8Array(128).map((_, idx) =>
+ /[a-zA-Z0-9\-]/.test(String.fromCharCode(idx)) ? 1 : 0
+);
+
+export class Scanner {
+ constructor(str) {
+ this.str = str;
+ this.pos = 0;
+ }
+
+ charCodeAt(pos) {
+ return pos < this.str.length ? this.str.charCodeAt(pos) : 0;
+ }
+ charCode() {
+ return this.charCodeAt(this.pos);
+ }
+ isNameCharCode(code = this.charCode()) {
+ return code < 128 && NAME_CHAR[code] === 1;
+ }
+ nextCharCode() {
+ return this.charCodeAt(this.pos + 1);
+ }
+ nextNonWsCode(pos) {
+ return this.charCodeAt(this.findWsEnd(pos));
+ }
+ skipWs() {
+ this.pos = this.findWsEnd(this.pos);
+ }
+ findWsEnd(pos) {
+ for (; pos < this.str.length; pos++) {
+ const code = this.str.charCodeAt(pos);
+ if (code !== R && code !== N && code !== F && code !== SPACE && code !== TAB) {
+ break;
+ }
+ }
+
+ return pos;
+ }
+ substringToPos(end) {
+ return this.str.substring(this.pos, this.pos = end);
+ }
+ eat(code) {
+ if (this.charCode() !== code) {
+ this.error('Expect `' + String.fromCharCode(code) + '`');
+ }
+
+ this.pos++;
+ }
+ peek() {
+ return this.pos < this.str.length ? this.str.charAt(this.pos++) : '';
+ }
+ error(message) {
+ throw new SyntaxError(message, this.str, this.pos);
+ }
+
+ scanSpaces() {
+ return this.substringToPos(this.findWsEnd(this.pos));
+ }
+ scanWord() {
+ let end = this.pos;
+
+ for (; end < this.str.length; end++) {
+ const code = this.str.charCodeAt(end);
+ if (code >= 128 || NAME_CHAR[code] === 0) {
+ break;
+ }
+ }
+
+ if (this.pos === end) {
+ this.error('Expect a keyword');
+ }
+
+ return this.substringToPos(end);
+ }
+ scanNumber() {
+ let end = this.pos;
+
+ for (; end < this.str.length; end++) {
+ const code = this.str.charCodeAt(end);
+
+ if (code < 48 || code > 57) {
+ break;
+ }
+ }
+
+ if (this.pos === end) {
+ this.error('Expect a number');
+ }
+
+ return this.substringToPos(end);
+ }
+ scanString() {
+ const end = this.str.indexOf('\'', this.pos + 1);
+
+ if (end === -1) {
+ this.pos = this.str.length;
+ this.error('Expect an apostrophe');
+ }
+
+ return this.substringToPos(end + 1);
+ }
+};