版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1 год назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. const CSSRule_1 = __importDefault(require("./CSSRule"));
  7. const CSSStyleRule_1 = __importDefault(require("./rules/CSSStyleRule"));
  8. const CSSKeyframeRule_1 = __importDefault(require("./rules/CSSKeyframeRule"));
  9. const CSSKeyframesRule_1 = __importDefault(require("./rules/CSSKeyframesRule"));
  10. const CSSMediaRule_1 = __importDefault(require("./rules/CSSMediaRule"));
  11. const CSSContainerRule_1 = __importDefault(require("./rules/CSSContainerRule"));
  12. const CSSSupportsRule_1 = __importDefault(require("./rules/CSSSupportsRule"));
  13. const COMMENT_REGEXP = /\/\*[^*]*\*\//gm;
  14. /**
  15. * CSS parser.
  16. */
  17. class CSSParser {
  18. /**
  19. * Parses HTML and returns a root element.
  20. *
  21. * @param parentStyleSheet Parent style sheet.
  22. * @param cssText CSS code.
  23. * @returns Root element.
  24. */
  25. static parseFromString(parentStyleSheet, cssText) {
  26. const css = cssText.replace(COMMENT_REGEXP, '');
  27. const cssRules = [];
  28. const regExp = /{|}/gm;
  29. const stack = [];
  30. let parentRule = null;
  31. let lastIndex = 0;
  32. let match;
  33. while ((match = regExp.exec(css))) {
  34. if (match[0] === '{') {
  35. const selectorText = css.substring(lastIndex, match.index).trim();
  36. if (selectorText.startsWith('@keyframes')) {
  37. const newRule = new CSSKeyframesRule_1.default();
  38. newRule.name = selectorText.replace('@keyframes ', '');
  39. newRule.parentStyleSheet = parentStyleSheet;
  40. cssRules.push(newRule);
  41. parentRule = newRule;
  42. }
  43. else if (selectorText.startsWith('@media')) {
  44. const mediums = selectorText.replace('@media', '').split(',');
  45. const newRule = new CSSMediaRule_1.default();
  46. for (const medium of mediums) {
  47. newRule.media.appendMedium(medium.trim());
  48. }
  49. newRule.parentStyleSheet = parentStyleSheet;
  50. cssRules.push(newRule);
  51. parentRule = newRule;
  52. }
  53. else if (selectorText.startsWith('@container')) {
  54. const conditionText = selectorText.replace(/@container */, '');
  55. const newRule = new CSSContainerRule_1.default();
  56. newRule.conditionText = conditionText;
  57. newRule.parentStyleSheet = parentStyleSheet;
  58. cssRules.push(newRule);
  59. parentRule = newRule;
  60. }
  61. else if (selectorText.startsWith('@supports')) {
  62. const conditionText = selectorText.replace(/@supports */, '');
  63. const newRule = new CSSSupportsRule_1.default();
  64. newRule.conditionText = conditionText;
  65. newRule.parentStyleSheet = parentStyleSheet;
  66. cssRules.push(newRule);
  67. parentRule = newRule;
  68. }
  69. else if (parentRule && parentRule.type === CSSRule_1.default.KEYFRAMES_RULE) {
  70. const newRule = new CSSKeyframeRule_1.default();
  71. newRule.keyText = selectorText.trim();
  72. newRule.parentStyleSheet = parentStyleSheet;
  73. newRule.parentRule = parentRule;
  74. parentRule.cssRules.push(newRule);
  75. parentRule = newRule;
  76. }
  77. else if (parentRule &&
  78. (parentRule.type === CSSRule_1.default.MEDIA_RULE ||
  79. parentRule.type === CSSRule_1.default.CONTAINER_RULE ||
  80. parentRule.type === CSSRule_1.default.SUPPORTS_RULE)) {
  81. const newRule = new CSSStyleRule_1.default();
  82. newRule.selectorText = selectorText;
  83. newRule.parentStyleSheet = parentStyleSheet;
  84. newRule.parentRule = parentRule;
  85. parentRule.cssRules.push(newRule);
  86. parentRule = newRule;
  87. }
  88. else {
  89. const newRule = new CSSStyleRule_1.default();
  90. newRule.selectorText = selectorText;
  91. newRule.parentStyleSheet = parentStyleSheet;
  92. newRule.parentRule = parentRule;
  93. if (!parentRule) {
  94. cssRules.push(newRule);
  95. }
  96. parentRule = newRule;
  97. }
  98. stack.push(parentRule);
  99. }
  100. else {
  101. if (parentRule) {
  102. const cssText = css.substring(lastIndex, match.index).trim();
  103. switch (parentRule.type) {
  104. case CSSRule_1.default.FONT_FACE_RULE:
  105. case CSSRule_1.default.KEYFRAME_RULE:
  106. case CSSRule_1.default.STYLE_RULE:
  107. parentRule._cssText = cssText;
  108. break;
  109. }
  110. }
  111. stack.pop();
  112. parentRule = stack[stack.length - 1] || null;
  113. }
  114. lastIndex = match.index + 1;
  115. }
  116. return cssRules;
  117. }
  118. }
  119. exports.default = CSSParser;
  120. //# sourceMappingURL=CSSParser.js.map