import { Delim, Ident, Dimension, Percentage, Number as NumberToken, Hash, Colon, LeftSquareBracket } from '../../tokenizer/index.js'; const NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#) const AMPERSAND = 0x0026; // U+0026 AMPERSAND (&) const ASTERISK = 0x002A; // U+002A ASTERISK (*) const PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+) const SOLIDUS = 0x002F; // U+002F SOLIDUS (/) const FULLSTOP = 0x002E; // U+002E FULL STOP (.) const GREATERTHANSIGN = 0x003E; // U+003E GREATER-THAN SIGN (>) const VERTICALLINE = 0x007C; // U+007C VERTICAL LINE (|) const TILDE = 0x007E; // U+007E TILDE (~) function onWhiteSpace(next, children) { if (children.last !== null && children.last.type !== 'Combinator' && next !== null && next.type !== 'Combinator') { children.push({ // FIXME: this.Combinator() should be used instead type: 'Combinator', loc: null, name: ' ' }); } } function getNode() { switch (this.tokenType) { case LeftSquareBracket: return this.AttributeSelector(); case Hash: return this.IdSelector(); case Colon: if (this.lookupType(1) === Colon) { return this.PseudoElementSelector(); } else { return this.PseudoClassSelector(); } case Ident: return this.TypeSelector(); case NumberToken: case Percentage: return this.Percentage(); case Dimension: // throws when .123ident if (this.charCodeAt(this.tokenStart) === FULLSTOP) { this.error('Identifier is expected', this.tokenStart + 1); } break; case Delim: { const code = this.charCodeAt(this.tokenStart); switch (code) { case PLUSSIGN: case GREATERTHANSIGN: case TILDE: case SOLIDUS: // /deep/ return this.Combinator(); case FULLSTOP: return this.ClassSelector(); case ASTERISK: case VERTICALLINE: return this.TypeSelector(); case NUMBERSIGN: return this.IdSelector(); case AMPERSAND: return this.NestingSelector(); } break; } } }; export default { onWhiteSpace, getNode };