| "use strict"; |
| Object.defineProperty(exports, "__esModule", { value: true }); |
| exports.parseFunctionArgs = exports.nonFunctionArgSeparator = exports.nonWhiteSpace = exports.isIdentWithValue = exports.isStringToken = exports.isIdentToken = exports.isNumberToken = exports.isDimensionToken = exports.Parser = void 0; |
| var tokenizer_1 = require("./tokenizer"); |
| var Parser = (function () { |
| function Parser(tokens) { |
| this._tokens = tokens; |
| } |
| Parser.create = function (value) { |
| var tokenizer = new tokenizer_1.Tokenizer(); |
| tokenizer.write(value); |
| return new Parser(tokenizer.read()); |
| }; |
| Parser.parseValue = function (value) { |
| return Parser.create(value).parseComponentValue(); |
| }; |
| Parser.parseValues = function (value) { |
| return Parser.create(value).parseComponentValues(); |
| }; |
| Parser.prototype.parseComponentValue = function () { |
| var token = this.consumeToken(); |
| while (token.type === 31 ) { |
| token = this.consumeToken(); |
| } |
| if (token.type === 32 ) { |
| throw new SyntaxError("Error parsing CSS component value, unexpected EOF"); |
| } |
| this.reconsumeToken(token); |
| var value = this.consumeComponentValue(); |
| do { |
| token = this.consumeToken(); |
| } while (token.type === 31 ); |
| if (token.type === 32 ) { |
| return value; |
| } |
| throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one"); |
| }; |
| Parser.prototype.parseComponentValues = function () { |
| var values = []; |
| while (true) { |
| var value = this.consumeComponentValue(); |
| if (value.type === 32 ) { |
| return values; |
| } |
| values.push(value); |
| values.push(); |
| } |
| }; |
| Parser.prototype.consumeComponentValue = function () { |
| var token = this.consumeToken(); |
| switch (token.type) { |
| case 11 : |
| case 28 : |
| case 2 : |
| return this.consumeSimpleBlock(token.type); |
| case 19 : |
| return this.consumeFunction(token); |
| } |
| return token; |
| }; |
| Parser.prototype.consumeSimpleBlock = function (type) { |
| var block = { type: type, values: [] }; |
| var token = this.consumeToken(); |
| while (true) { |
| if (token.type === 32 || isEndingTokenFor(token, type)) { |
| return block; |
| } |
| this.reconsumeToken(token); |
| block.values.push(this.consumeComponentValue()); |
| token = this.consumeToken(); |
| } |
| }; |
| Parser.prototype.consumeFunction = function (functionToken) { |
| var cssFunction = { |
| name: functionToken.value, |
| values: [], |
| type: 18 |
| }; |
| while (true) { |
| var token = this.consumeToken(); |
| if (token.type === 32 || token.type === 3 ) { |
| return cssFunction; |
| } |
| this.reconsumeToken(token); |
| cssFunction.values.push(this.consumeComponentValue()); |
| } |
| }; |
| Parser.prototype.consumeToken = function () { |
| var token = this._tokens.shift(); |
| return typeof token === 'undefined' ? tokenizer_1.EOF_TOKEN : token; |
| }; |
| Parser.prototype.reconsumeToken = function (token) { |
| this._tokens.unshift(token); |
| }; |
| return Parser; |
| }()); |
| exports.Parser = Parser; |
| var isDimensionToken = function (token) { return token.type === 15 ; }; |
| exports.isDimensionToken = isDimensionToken; |
| var isNumberToken = function (token) { return token.type === 17 ; }; |
| exports.isNumberToken = isNumberToken; |
| var isIdentToken = function (token) { return token.type === 20 ; }; |
| exports.isIdentToken = isIdentToken; |
| var isStringToken = function (token) { return token.type === 0 ; }; |
| exports.isStringToken = isStringToken; |
| var isIdentWithValue = function (token, value) { |
| return exports.isIdentToken(token) && token.value === value; |
| }; |
| exports.isIdentWithValue = isIdentWithValue; |
| var nonWhiteSpace = function (token) { return token.type !== 31 ; }; |
| exports.nonWhiteSpace = nonWhiteSpace; |
| var nonFunctionArgSeparator = function (token) { |
| return token.type !== 31 && token.type !== 4 ; |
| }; |
| exports.nonFunctionArgSeparator = nonFunctionArgSeparator; |
| var parseFunctionArgs = function (tokens) { |
| var args = []; |
| var arg = []; |
| tokens.forEach(function (token) { |
| if (token.type === 4 ) { |
| if (arg.length === 0) { |
| throw new Error("Error parsing function args, zero tokens for arg"); |
| } |
| args.push(arg); |
| arg = []; |
| return; |
| } |
| if (token.type !== 31 ) { |
| arg.push(token); |
| } |
| }); |
| if (arg.length) { |
| args.push(arg); |
| } |
| return args; |
| }; |
| exports.parseFunctionArgs = parseFunctionArgs; |
| var isEndingTokenFor = function (token, type) { |
| if (type === 11 && token.type === 12 ) { |
| return true; |
| } |
| if (type === 28 && token.type === 29 ) { |
| return true; |
| } |
| return type === 2 && token.type === 3 ; |
| }; |
| |