diff --git a/demo/kitchen-sink/doclist.js b/demo/kitchen-sink/doclist.js index f75e6e86..103763a5 100644 --- a/demo/kitchen-sink/doclist.js +++ b/demo/kitchen-sink/doclist.js @@ -119,6 +119,7 @@ var docs = { "docs/tcl.tcl": "Tcl", "docs/tex.tex": "Tex", "docs/textile.textile": {name: "Textile", wrapped: true}, + "docs/tmSnippet.tmSnippet": "tmSnippet", "docs/typescript.ts": "Typescript", "docs/vbscript.vbs": "VBScript", "docs/xml.xml": "XML", diff --git a/demo/kitchen-sink/docs/tmSnippet.tmSnippet b/demo/kitchen-sink/docs/tmSnippet.tmSnippet new file mode 100644 index 00000000..6ea4117f --- /dev/null +++ b/demo/kitchen-sink/docs/tmSnippet.tmSnippet @@ -0,0 +1,19 @@ +$$------------------------------------ +tabTrigger: t +name: Heading 3 +scope: language +content: ----------------------------- +\begin{${1:documnet}} + ${2:$TM_SELECTED_TEXT:some latex} + ${3:$TM_SELECTED_TEXT/a/b/c} + ${4:${TM_SELECTED_TEXT/(.)/\\u$1/g:7}} +\end{$1} +$0\\$$ +$$------------------------------------ +tabTrigger: ^3 +name: Heading 3 +scope: language +content: ----------------------------- + +${TM_CURRENT_LINE/./^/g} +$$------------------------------------ \ No newline at end of file diff --git a/demo/kitchen-sink/modelist.js b/demo/kitchen-sink/modelist.js index ec2ce2d6..d3a33ba8 100644 --- a/demo/kitchen-sink/modelist.js +++ b/demo/kitchen-sink/modelist.js @@ -91,6 +91,7 @@ var modesByName = { tex: ["Tex" , "tex"], text: ["Text" , "txt"], textile: ["Textile" , "textile"], + tm_snippet: ["tmSnippet" , "tmSnippet"], typescript: ["Typescript" , "typescript|ts|str"], vbscript: ["VBScript" , "vbs"], xml: ["XML" , "xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"], diff --git a/lib/ace/mode/tm_snippet.js b/lib/ace/mode/tm_snippet.js new file mode 100644 index 00000000..7b7ace08 --- /dev/null +++ b/lib/ace/mode/tm_snippet.js @@ -0,0 +1,86 @@ +define(function(require, exports, module) { +"use strict"; + +var oop = require("../lib/oop"); +var TextMode = require("./text").Mode; +var Tokenizer = require("../tokenizer").Tokenizer; +var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules; + +var SnippetHighlightRules = function() { + + var builtins = "SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|" + + "LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME"; + + this.$rules = { + "start" : [ + {token:"constant.language.escape", regex: /\\[\$}`\\]/}, + {token:"keyword", regex: "\\$(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\$\\w+"}, + {token: function(value, state, stack) { + if (stack[1]) + stack[1]++; + else + stack.unshift("start", 1); + return this.tokenName; + }, tokenName: "markup.list", regex: "\\${", next: "varDecl"}, + {token: function(value, state, stack) { + if (!stack[1]) + return "text"; + stack[1]--; + if (!stack[1]) + stack.splice(0,2); + return this.tokenName; + }, tokenName: "markup.list", regex: "}"}, + {token: "doc,comment", regex:/^\${2}-{5,}$/} + ], + "varDecl" : [ + {regex: /\d+\b/, token: "constant.numeric"}, + {token:"keyword", regex: "(?:TM_)?(?:" + builtins + ")\\b"}, + {token:"variable", regex: "\\w+"}, + {regex: /:/, token: "punctuation.operator", next: "start"}, + {regex: /\//, token: "string.regex", next: "regexp"}, + {regex: "", next: "start"} + ], + "regexp" : [ + {regex: /\\./, token: "escape"}, + {regex: /\[/, token: "regex.start", next: "charClass"}, + {regex: "/", token: "string.regex", next: "format"}, + //{"default": "string.regex"}, + {"token": "string.regex", regex:"."}, + ], + charClass : [ + {regex: "\\.", token: "escape"}, + {regex: "\\]", token: "regex.end", next: "regexp"}, + {"token": "string.regex", regex:"."}, + ], + "format" : [ + {regex: /\\[ulULE]/, token: "keyword"}, + {regex: /\$\d+/, token: "variable"}, + {regex: "/[gim]*:?", token: "string.regex", next: "start"}, + // {"default": "string"}, + {"token": "string", regex:"."}, + ] + }; +}; + +oop.inherits(SnippetHighlightRules, TextHighlightRules); + +exports.SnippetHighlightRules = SnippetHighlightRules; + + +var Mode = function() { + var highlighter = new SnippetHighlightRules(); + + this.$tokenizer = new Tokenizer(highlighter.getRules()); +}; +oop.inherits(Mode, TextMode); + +(function() { + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; +}).call(Mode.prototype); +exports.Mode = Mode; + + +});