Rule.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. var TYPE = require('../../tokenizer').TYPE;
  2. var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket;
  3. function consumeRaw(startToken) {
  4. return this.Raw(startToken, LEFTCURLYBRACKET, 0, false, true);
  5. }
  6. function consumePrelude() {
  7. var prelude = this.SelectorList();
  8. if (prelude.type !== 'Raw' &&
  9. this.scanner.eof === false &&
  10. this.scanner.tokenType !== LEFTCURLYBRACKET) {
  11. this.scanner.error();
  12. }
  13. return prelude;
  14. }
  15. module.exports = {
  16. name: 'Rule',
  17. structure: {
  18. prelude: ['SelectorList', 'Raw'],
  19. block: ['Block']
  20. },
  21. parse: function() {
  22. var startToken = this.scanner.currentToken;
  23. var startOffset = this.scanner.tokenStart;
  24. var prelude;
  25. var block;
  26. if (this.parseRulePrelude) {
  27. prelude = this.parseWithFallback(consumePrelude, consumeRaw);
  28. } else {
  29. prelude = consumeRaw.call(this, startToken);
  30. }
  31. block = this.Block(true);
  32. return {
  33. type: 'Rule',
  34. loc: this.getLocation(startOffset, this.scanner.tokenStart),
  35. prelude: prelude,
  36. block: block
  37. };
  38. },
  39. generate: function(node) {
  40. this.node(node.prelude);
  41. this.node(node.block);
  42. },
  43. walkContext: 'rule'
  44. };