react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / cssom / lib / parse.js
81143 views//.CommonJS1var CSSOM = {};2///CommonJS345/**6* @param {string} token7*/8CSSOM.parse = function parse(token) {910var i = 0;1112/**13"before-selector" or14"selector" or15"atRule" or16"atBlock" or17"before-name" or18"name" or19"before-value" or20"value"21*/22var state = "before-selector";2324var index;25var buffer = "";2627var SIGNIFICANT_WHITESPACE = {28"selector": true,29"value": true,30"atRule": true,31"importRule-begin": true,32"importRule": true,33"atBlock": true,34'documentRule-begin': true35};3637var styleSheet = new CSSOM.CSSStyleSheet;3839// @type CSSStyleSheet|CSSMediaRule|CSSFontFaceRule|CSSKeyframesRule|CSSDocumentRule40var currentScope = styleSheet;4142// @type CSSMediaRule|CSSKeyframesRule|CSSDocumentRule43var parentRule;4445var selector, name, value, priority="", styleRule, mediaRule, importRule, fontFaceRule, keyframesRule, keyframeRule, documentRule;4647var atKeyframesRegExp = /@(-(?:\w+-)+)?keyframes/g;4849var parseError = function(message) {50var lines = token.substring(0, i).split('\n');51var lineCount = lines.length;52var charCount = lines.pop().length + 1;53var error = new Error(message + ' (line ' + lineCount + ', char ' + charCount + ')');54error.line = lineCount;55error.char = charCount;56error.styleSheet = styleSheet;57throw error;58};5960for (var character; character = token.charAt(i); i++) {6162switch (character) {6364case " ":65case "\t":66case "\r":67case "\n":68case "\f":69if (SIGNIFICANT_WHITESPACE[state]) {70buffer += character;71}72break;7374// String75case '"':76index = i + 1;77do {78index = token.indexOf('"', index) + 1;79if (!index) {80parseError('Unmatched "');81}82} while (token[index - 2] === '\\')83buffer += token.slice(i, index);84i = index - 1;85switch (state) {86case 'before-value':87state = 'value';88break;89case 'importRule-begin':90state = 'importRule';91break;92}93break;9495case "'":96index = i + 1;97do {98index = token.indexOf("'", index) + 1;99if (!index) {100parseError("Unmatched '");101}102} while (token[index - 2] === '\\')103buffer += token.slice(i, index);104i = index - 1;105switch (state) {106case 'before-value':107state = 'value';108break;109case 'importRule-begin':110state = 'importRule';111break;112}113break;114115// Comment116case "/":117if (token.charAt(i + 1) === "*") {118i += 2;119index = token.indexOf("*/", i);120if (index === -1) {121parseError("Missing */");122} else {123i = index + 1;124}125} else {126buffer += character;127}128if (state === "importRule-begin") {129buffer += " ";130state = "importRule";131}132break;133134// At-rule135case "@":136if (token.indexOf("@-moz-document", i) === i) {137state = "documentRule-begin";138documentRule = new CSSOM.CSSDocumentRule;139documentRule.__starts = i;140i += "-moz-document".length;141buffer = "";142break;143} else if (token.indexOf("@media", i) === i) {144state = "atBlock";145mediaRule = new CSSOM.CSSMediaRule;146mediaRule.__starts = i;147i += "media".length;148buffer = "";149break;150} else if (token.indexOf("@import", i) === i) {151state = "importRule-begin";152i += "import".length;153buffer += "@import";154break;155} else if (token.indexOf("@font-face", i) === i) {156state = "fontFaceRule-begin";157i += "font-face".length;158fontFaceRule = new CSSOM.CSSFontFaceRule;159fontFaceRule.__starts = i;160buffer = "";161break;162} else {163atKeyframesRegExp.lastIndex = i;164var matchKeyframes = atKeyframesRegExp.exec(token);165if (matchKeyframes && matchKeyframes.index === i) {166state = "keyframesRule-begin";167keyframesRule = new CSSOM.CSSKeyframesRule;168keyframesRule.__starts = i;169keyframesRule._vendorPrefix = matchKeyframes[1]; // Will come out as undefined if no prefix was found170i += matchKeyframes[0].length - 1;171buffer = "";172break;173} else if (state == "selector") {174state = "atRule";175}176}177buffer += character;178break;179180case "{":181if (state === "selector" || state === "atRule") {182styleRule.selectorText = buffer.trim();183styleRule.style.__starts = i;184buffer = "";185state = "before-name";186} else if (state === "atBlock") {187mediaRule.media.mediaText = buffer.trim();188currentScope = parentRule = mediaRule;189mediaRule.parentStyleSheet = styleSheet;190buffer = "";191state = "before-selector";192} else if (state === "fontFaceRule-begin") {193if (parentRule) {194fontFaceRule.parentRule = parentRule;195}196fontFaceRule.parentStyleSheet = styleSheet;197styleRule = fontFaceRule;198buffer = "";199state = "before-name";200} else if (state === "keyframesRule-begin") {201keyframesRule.name = buffer.trim();202if (parentRule) {203keyframesRule.parentRule = parentRule;204}205keyframesRule.parentStyleSheet = styleSheet;206currentScope = parentRule = keyframesRule;207buffer = "";208state = "keyframeRule-begin";209} else if (state === "keyframeRule-begin") {210styleRule = new CSSOM.CSSKeyframeRule;211styleRule.keyText = buffer.trim();212styleRule.__starts = i;213buffer = "";214state = "before-name";215} else if (state === "documentRule-begin") {216// FIXME: what if this '{' is in the url text of the match function?217documentRule.matcher.matcherText = buffer.trim();218if (parentRule) {219documentRule.parentRule = parentRule;220}221currentScope = parentRule = documentRule;222documentRule.parentStyleSheet = styleSheet;223buffer = "";224state = "before-selector";225}226break;227228case ":":229if (state === "name") {230name = buffer.trim();231buffer = "";232state = "before-value";233} else {234buffer += character;235}236break;237238case '(':239if (state === 'value') {240// ie css expression mode241if (buffer.trim() == 'expression') {242var info = (new CSSOM.CSSValueExpression(token, i)).parse();243244if (info.error) {245parseError(info.error);246} else {247buffer += info.expression;248i = info.idx;249}250} else {251index = token.indexOf(')', i + 1);252if (index === -1) {253parseError('Unmatched "("');254}255buffer += token.slice(i, index + 1);256i = index;257}258} else {259buffer += character;260}261262break;263264case "!":265if (state === "value" && token.indexOf("!important", i) === i) {266priority = "important";267i += "important".length;268} else {269buffer += character;270}271break;272273case ";":274switch (state) {275case "value":276styleRule.style.setProperty(name, buffer.trim(), priority);277priority = "";278buffer = "";279state = "before-name";280break;281case "atRule":282buffer = "";283state = "before-selector";284break;285case "importRule":286importRule = new CSSOM.CSSImportRule;287importRule.parentStyleSheet = importRule.styleSheet.parentStyleSheet = styleSheet;288importRule.cssText = buffer + character;289styleSheet.cssRules.push(importRule);290buffer = "";291state = "before-selector";292break;293default:294buffer += character;295break;296}297break;298299case "}":300switch (state) {301case "value":302styleRule.style.setProperty(name, buffer.trim(), priority);303priority = "";304case "before-name":305case "name":306styleRule.__ends = i + 1;307if (parentRule) {308styleRule.parentRule = parentRule;309}310styleRule.parentStyleSheet = styleSheet;311currentScope.cssRules.push(styleRule);312buffer = "";313if (currentScope.constructor === CSSOM.CSSKeyframesRule) {314state = "keyframeRule-begin";315} else {316state = "before-selector";317}318break;319case "keyframeRule-begin":320case "before-selector":321case "selector":322// End of media/document rule.323if (!parentRule) {324parseError("Unexpected }");325}326currentScope.__ends = i + 1;327// Nesting rules aren't supported yet328styleSheet.cssRules.push(currentScope);329currentScope = styleSheet;330parentRule = null;331buffer = "";332state = "before-selector";333break;334}335break;336337default:338switch (state) {339case "before-selector":340state = "selector";341styleRule = new CSSOM.CSSStyleRule;342styleRule.__starts = i;343break;344case "before-name":345state = "name";346break;347case "before-value":348state = "value";349break;350case "importRule-begin":351state = "importRule";352break;353}354buffer += character;355break;356}357}358359return styleSheet;360};361362363//.CommonJS364exports.parse = CSSOM.parse;365// The following modules cannot be included sooner due to the mutual dependency with parse.js366CSSOM.CSSStyleSheet = require("./CSSStyleSheet").CSSStyleSheet;367CSSOM.CSSStyleRule = require("./CSSStyleRule").CSSStyleRule;368CSSOM.CSSImportRule = require("./CSSImportRule").CSSImportRule;369CSSOM.CSSMediaRule = require("./CSSMediaRule").CSSMediaRule;370CSSOM.CSSFontFaceRule = require("./CSSFontFaceRule").CSSFontFaceRule;371CSSOM.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;372CSSOM.CSSKeyframeRule = require('./CSSKeyframeRule').CSSKeyframeRule;373CSSOM.CSSKeyframesRule = require('./CSSKeyframesRule').CSSKeyframesRule;374CSSOM.CSSValueExpression = require('./CSSValueExpression').CSSValueExpression;375CSSOM.CSSDocumentRule = require('./CSSDocumentRule').CSSDocumentRule;376///CommonJS377378379