StyleSheet.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. var TYPE = require('../../tokenizer').TYPE;
  2. var CHARCODE = require('../../tokenizer').CHARCODE;
  3. var WHITESPACE = TYPE.WhiteSpace;
  4. var COMMENT = TYPE.Comment;
  5. var ATKEYWORD = TYPE.AtKeyword;
  6. var CDO = TYPE.CDO;
  7. var CDC = TYPE.CDC;
  8. var EXCLAMATIONMARK = CHARCODE.ExclamationMark;
  9. function consumeRaw(startToken) {
  10. return this.Raw(startToken, null, false);
  11. }
  12. module.exports = {
  13. name: 'StyleSheet',
  14. structure: {
  15. children: [[
  16. 'Comment',
  17. 'CDO',
  18. 'CDC',
  19. 'Atrule',
  20. 'Rule',
  21. 'Raw'
  22. ]]
  23. },
  24. parse: function() {
  25. var start = this.scanner.tokenStart;
  26. var children = this.createList();
  27. var child;
  28. scan:
  29. while (!this.scanner.eof) {
  30. switch (this.scanner.tokenType) {
  31. case WHITESPACE:
  32. this.scanner.next();
  33. continue;
  34. case COMMENT:
  35. // ignore comments except exclamation comments (i.e. /*! .. */) on top level
  36. if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK) {
  37. this.scanner.next();
  38. continue;
  39. }
  40. child = this.Comment();
  41. break;
  42. case CDO: // <!--
  43. child = this.CDO();
  44. break;
  45. case CDC: // -->
  46. child = this.CDC();
  47. break;
  48. // CSS Syntax Module Level 3
  49. // §2.2 Error handling
  50. // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.
  51. case ATKEYWORD:
  52. child = this.parseWithFallback(this.Atrule, consumeRaw);
  53. break;
  54. // Anything else starts a qualified rule ...
  55. default:
  56. child = this.parseWithFallback(this.Rule, consumeRaw);
  57. }
  58. children.push(child);
  59. }
  60. return {
  61. type: 'StyleSheet',
  62. loc: this.getLocation(start, this.scanner.tokenStart),
  63. children: children
  64. };
  65. },
  66. generate: function(node) {
  67. this.children(node);
  68. },
  69. walkContext: 'stylesheet'
  70. };