"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const CSSRule_1 = __importDefault(require("./CSSRule")); const CSSStyleRule_1 = __importDefault(require("./rules/CSSStyleRule")); const CSSKeyframeRule_1 = __importDefault(require("./rules/CSSKeyframeRule")); const CSSKeyframesRule_1 = __importDefault(require("./rules/CSSKeyframesRule")); const CSSMediaRule_1 = __importDefault(require("./rules/CSSMediaRule")); const CSSContainerRule_1 = __importDefault(require("./rules/CSSContainerRule")); const CSSSupportsRule_1 = __importDefault(require("./rules/CSSSupportsRule")); const COMMENT_REGEXP = /\/\*[^*]*\*\//gm; /** * CSS parser. */ class CSSParser { /** * Parses HTML and returns a root element. * * @param parentStyleSheet Parent style sheet. * @param cssText CSS code. * @returns Root element. */ static parseFromString(parentStyleSheet, cssText) { const css = cssText.replace(COMMENT_REGEXP, ''); const cssRules = []; const regExp = /{|}/gm; const stack = []; let parentRule = null; let lastIndex = 0; let match; while ((match = regExp.exec(css))) { if (match[0] === '{') { const selectorText = css.substring(lastIndex, match.index).trim(); if (selectorText.startsWith('@keyframes')) { const newRule = new CSSKeyframesRule_1.default(); newRule.name = selectorText.replace('@keyframes ', ''); newRule.parentStyleSheet = parentStyleSheet; cssRules.push(newRule); parentRule = newRule; } else if (selectorText.startsWith('@media')) { const mediums = selectorText.replace('@media', '').split(','); const newRule = new CSSMediaRule_1.default(); for (const medium of mediums) { newRule.media.appendMedium(medium.trim()); } newRule.parentStyleSheet = parentStyleSheet; cssRules.push(newRule); parentRule = newRule; } else if (selectorText.startsWith('@container')) { const conditionText = selectorText.replace(/@container */, ''); const newRule = new CSSContainerRule_1.default(); newRule.conditionText = conditionText; newRule.parentStyleSheet = parentStyleSheet; cssRules.push(newRule); parentRule = newRule; } else if (selectorText.startsWith('@supports')) { const conditionText = selectorText.replace(/@supports */, ''); const newRule = new CSSSupportsRule_1.default(); newRule.conditionText = conditionText; newRule.parentStyleSheet = parentStyleSheet; cssRules.push(newRule); parentRule = newRule; } else if (parentRule && parentRule.type === CSSRule_1.default.KEYFRAMES_RULE) { const newRule = new CSSKeyframeRule_1.default(); newRule.keyText = selectorText.trim(); newRule.parentStyleSheet = parentStyleSheet; newRule.parentRule = parentRule; parentRule.cssRules.push(newRule); parentRule = newRule; } else if (parentRule && (parentRule.type === CSSRule_1.default.MEDIA_RULE || parentRule.type === CSSRule_1.default.CONTAINER_RULE || parentRule.type === CSSRule_1.default.SUPPORTS_RULE)) { const newRule = new CSSStyleRule_1.default(); newRule.selectorText = selectorText; newRule.parentStyleSheet = parentStyleSheet; newRule.parentRule = parentRule; parentRule.cssRules.push(newRule); parentRule = newRule; } else { const newRule = new CSSStyleRule_1.default(); newRule.selectorText = selectorText; newRule.parentStyleSheet = parentStyleSheet; newRule.parentRule = parentRule; if (!parentRule) { cssRules.push(newRule); } parentRule = newRule; } stack.push(parentRule); } else { if (parentRule) { const cssText = css.substring(lastIndex, match.index).trim(); switch (parentRule.type) { case CSSRule_1.default.FONT_FACE_RULE: case CSSRule_1.default.KEYFRAME_RULE: case CSSRule_1.default.STYLE_RULE: parentRule._cssText = cssText; break; } } stack.pop(); parentRule = stack[stack.length - 1] || null; } lastIndex = match.index + 1; } return cssRules; } } exports.default = CSSParser; //# sourceMappingURL=CSSParser.js.map