snippets.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. define(function(require, exports, module) {
  2. "use strict";
  3. var oop = require("../lib/oop");
  4. var TextMode = require("./text").Mode;
  5. var Tokenizer = require("../tokenizer").Tokenizer;
  6. var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
  7. var SnippetHighlightRules = function() {
  8. var builtins = "SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|" +
  9. "LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME";
  10. this.$rules = {
  11. "start" : [
  12. {token:"constant.language.escape", regex: /\\[\$}`\\]/},
  13. {token:"keyword", regex: "\\$(?:TM_)?(?:" + builtins + ")\\b"},
  14. {token:"variable", regex: "\\$\\w+"},
  15. {onMatch: function(value, state, stack) {
  16. if (stack[1])
  17. stack[1]++;
  18. else
  19. stack.unshift(state, 1);
  20. return this.tokenName;
  21. }, tokenName: "markup.list", regex: "\\${", next: "varDecl"},
  22. {onMatch: function(value, state, stack) {
  23. if (!stack[1])
  24. return "text";
  25. stack[1]--;
  26. if (!stack[1])
  27. stack.splice(0,2);
  28. return this.tokenName;
  29. }, tokenName: "markup.list", regex: "}"},
  30. {token: "doc.comment", regex:/^\${2}-{5,}$/}
  31. ],
  32. "varDecl" : [
  33. {regex: /\d+\b/, token: "constant.numeric"},
  34. {token:"keyword", regex: "(?:TM_)?(?:" + builtins + ")\\b"},
  35. {token:"variable", regex: "\\w+"},
  36. {regex: /:/, token: "punctuation.operator", next: "start"},
  37. {regex: /\//, token: "string.regex", next: "regexp"},
  38. {regex: "", next: "start"}
  39. ],
  40. "regexp" : [
  41. {regex: /\\./, token: "escape"},
  42. {regex: /\[/, token: "regex.start", next: "charClass"},
  43. {regex: "/", token: "string.regex", next: "format"},
  44. //{"default": "string.regex"},
  45. {"token": "string.regex", regex:"."}
  46. ],
  47. charClass : [
  48. {regex: "\\.", token: "escape"},
  49. {regex: "\\]", token: "regex.end", next: "regexp"},
  50. {"token": "string.regex", regex:"."}
  51. ],
  52. "format" : [
  53. {regex: /\\[ulULE]/, token: "keyword"},
  54. {regex: /\$\d+/, token: "variable"},
  55. {regex: "/[gim]*:?", token: "string.regex", next: "start"},
  56. // {"default": "string"},
  57. {"token": "string", regex:"."}
  58. ]
  59. };
  60. };
  61. oop.inherits(SnippetHighlightRules, TextHighlightRules);
  62. exports.SnippetHighlightRules = SnippetHighlightRules;
  63. var SnippetGroupHighlightRules = function() {
  64. this.$rules = {
  65. "start" : [
  66. {token: "text", regex: "^\\t", next: "sn-start"},
  67. {token:"invalid", regex: /^ \s*/},
  68. {token:"comment", regex: /^#.*/},
  69. {token:"constant.language.escape", regex: "^regex ", next: "regex"},
  70. {token:"constant.language.escape", regex: "^(trigger|endTrigger|name|snippet|guard|endGuard|tabTrigger|key)\\b"}
  71. ],
  72. "regex" : [
  73. {token:"text", regex: "\\."},
  74. {token:"keyword", regex: "/"},
  75. {token:"empty", regex: "$", next: "start"}
  76. ]
  77. };
  78. this.embedRules(SnippetHighlightRules, "sn-", [
  79. {token: "text", regex: "^\\t", next: "sn-start"},
  80. {onMatch: function(value, state, stack) {
  81. stack.splice(stack.length);
  82. return this.tokenName;
  83. }, tokenName: "text", regex: "^(?!\t)", next: "start"}
  84. ])
  85. };
  86. oop.inherits(SnippetGroupHighlightRules, TextHighlightRules);
  87. exports.SnippetGroupHighlightRules = SnippetGroupHighlightRules;
  88. var FoldMode = require("./folding/coffee").FoldMode;
  89. var Mode = function() {
  90. this.HighlightRules = SnippetGroupHighlightRules;
  91. this.foldingRules = new FoldMode();
  92. };
  93. oop.inherits(Mode, TextMode);
  94. (function() {
  95. this.$indentWithTabs = true;
  96. }).call(Mode.prototype);
  97. exports.Mode = Mode;
  98. });