Raw.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. var tokenizer = require('../../tokenizer');
  2. var TYPE = tokenizer.TYPE;
  3. var CHARCODE = tokenizer.CHARCODE;
  4. var EXCLAMATIONMARK = CHARCODE.ExclamationMark;
  5. var WhiteSpace = TYPE.WhiteSpace;
  6. var Semicolon = TYPE.Semicolon;
  7. var LeftCurlyBracket = TYPE.LeftCurlyBracket;
  8. var Delim = TYPE.Delim;
  9. function getOffsetExcludeWS() {
  10. if (this.scanner.tokenIndex > 0) {
  11. if (this.scanner.lookupType(-1) === WhiteSpace) {
  12. return this.scanner.tokenIndex > 1
  13. ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1)
  14. : this.scanner.firstCharOffset;
  15. }
  16. }
  17. return this.scanner.tokenStart;
  18. }
  19. // 0, 0, false
  20. function balanceEnd() {
  21. return 0;
  22. }
  23. // LEFTCURLYBRACKET, 0, false
  24. function leftCurlyBracket(tokenType) {
  25. return tokenType === LeftCurlyBracket ? 1 : 0;
  26. }
  27. // LEFTCURLYBRACKET, SEMICOLON, false
  28. function leftCurlyBracketOrSemicolon(tokenType) {
  29. return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0;
  30. }
  31. // EXCLAMATIONMARK, SEMICOLON, false
  32. function exclamationMarkOrSemicolon(tokenType, source, offset) {
  33. if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK) {
  34. return 1;
  35. }
  36. return tokenType === Semicolon ? 1 : 0;
  37. }
  38. // 0, SEMICOLON, true
  39. function semicolonIncluded(tokenType) {
  40. return tokenType === Semicolon ? 2 : 0;
  41. }
  42. module.exports = {
  43. name: 'Raw',
  44. structure: {
  45. value: String
  46. },
  47. parse: function(startToken, mode, excludeWhiteSpace) {
  48. var startOffset = this.scanner.getTokenStart(startToken);
  49. var endOffset;
  50. this.scanner.skip(
  51. this.scanner.getRawLength(startToken, mode || balanceEnd)
  52. );
  53. if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {
  54. endOffset = getOffsetExcludeWS.call(this);
  55. } else {
  56. endOffset = this.scanner.tokenStart;
  57. }
  58. return {
  59. type: 'Raw',
  60. loc: this.getLocation(startOffset, endOffset),
  61. value: this.scanner.source.substring(startOffset, endOffset)
  62. };
  63. },
  64. generate: function(node) {
  65. this.chunk(node.value);
  66. },
  67. mode: {
  68. default: balanceEnd,
  69. leftCurlyBracket: leftCurlyBracket,
  70. leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon,
  71. exclamationMarkOrSemicolon: exclamationMarkOrSemicolon,
  72. semicolonIncluded: semicolonIncluded
  73. }
  74. };