CSSStyleRule.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. //.CommonJS
  2. var CSSOM = {
  3. CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,
  4. CSSRule: require("./CSSRule").CSSRule
  5. };
  6. ///CommonJS
  7. /**
  8. * @constructor
  9. * @see http://dev.w3.org/csswg/cssom/#cssstylerule
  10. * @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleRule
  11. */
  12. CSSOM.CSSStyleRule = function CSSStyleRule() {
  13. this.selectorText = "";
  14. this.style = new CSSOM.CSSStyleDeclaration;
  15. };
  16. CSSOM.CSSStyleRule.prototype = new CSSOM.CSSRule;
  17. CSSOM.CSSStyleRule.prototype.constructor = CSSOM.CSSStyleRule;
  18. CSSOM.CSSStyleRule.prototype.type = 1;
  19. CSSOM.CSSStyleRule.prototype.__defineGetter__("cssText", function() {
  20. var text;
  21. if (this.selectorText) {
  22. text = this.selectorText + " {" + this.style.cssText + "}";
  23. } else {
  24. text = "";
  25. }
  26. return text;
  27. });
  28. CSSOM.CSSStyleRule.prototype.__defineSetter__("cssText", function(cssText) {
  29. var rule = CSSOM.CSSStyleRule.parse(cssText);
  30. this.style = rule.style;
  31. this.selectorText = rule.selectorText;
  32. });
  33. /**
  34. * NON-STANDARD
  35. * lightweight version of parse.js.
  36. * @param {string} ruleText
  37. * @return CSSStyleRule
  38. */
  39. CSSOM.CSSStyleRule.parse = function(ruleText) {
  40. var i = 0;
  41. var state = "selector";
  42. var index;
  43. var j = i;
  44. var buffer = "";
  45. var SIGNIFICANT_WHITESPACE = {
  46. "selector": true,
  47. "value": true
  48. };
  49. var styleRule = new CSSOM.CSSStyleRule;
  50. var selector, name, value, priority="";
  51. for (var character; character = ruleText.charAt(i); i++) {
  52. switch (character) {
  53. case " ":
  54. case "\t":
  55. case "\r":
  56. case "\n":
  57. case "\f":
  58. if (SIGNIFICANT_WHITESPACE[state]) {
  59. // Squash 2 or more white-spaces in the row into 1
  60. switch (ruleText.charAt(i - 1)) {
  61. case " ":
  62. case "\t":
  63. case "\r":
  64. case "\n":
  65. case "\f":
  66. break;
  67. default:
  68. buffer += " ";
  69. break;
  70. }
  71. }
  72. break;
  73. // String
  74. case '"':
  75. j = i + 1;
  76. index = ruleText.indexOf('"', j) + 1;
  77. if (!index) {
  78. throw '" is missing';
  79. }
  80. buffer += ruleText.slice(i, index);
  81. i = index - 1;
  82. break;
  83. case "'":
  84. j = i + 1;
  85. index = ruleText.indexOf("'", j) + 1;
  86. if (!index) {
  87. throw "' is missing";
  88. }
  89. buffer += ruleText.slice(i, index);
  90. i = index - 1;
  91. break;
  92. // Comment
  93. case "/":
  94. if (ruleText.charAt(i + 1) == "*") {
  95. i += 2;
  96. index = ruleText.indexOf("*/", i);
  97. if (index == -1) {
  98. throw SyntaxError("Missing */");
  99. } else {
  100. i = index + 1;
  101. }
  102. } else {
  103. buffer += character;
  104. }
  105. break;
  106. case "{":
  107. if (state == "selector") {
  108. styleRule.selectorText = buffer.trim();
  109. buffer = "";
  110. state = "name";
  111. }
  112. break;
  113. case ":":
  114. if (state == "name") {
  115. name = buffer.trim();
  116. buffer = "";
  117. state = "value";
  118. } else {
  119. buffer += character;
  120. }
  121. break;
  122. case "!":
  123. if (state == "value" && ruleText.indexOf("!important", i) === i) {
  124. priority = "important";
  125. i += "important".length;
  126. } else {
  127. buffer += character;
  128. }
  129. break;
  130. case ";":
  131. if (state == "value") {
  132. styleRule.style.setProperty(name, buffer.trim(), priority);
  133. priority = "";
  134. buffer = "";
  135. state = "name";
  136. } else {
  137. buffer += character;
  138. }
  139. break;
  140. case "}":
  141. if (state == "value") {
  142. styleRule.style.setProperty(name, buffer.trim(), priority);
  143. priority = "";
  144. buffer = "";
  145. } else if (state == "name") {
  146. break;
  147. } else {
  148. buffer += character;
  149. }
  150. state = "selector";
  151. break;
  152. default:
  153. buffer += character;
  154. break;
  155. }
  156. }
  157. return styleRule;
  158. };
  159. //.CommonJS
  160. exports.CSSStyleRule = CSSOM.CSSStyleRule;
  161. ///CommonJS