From aac5a0e83a64a578d001370018e8b7199dece4c7 Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Thu, 3 Nov 2011 13:05:11 +0800 Subject: [PATCH 1/8] Added mode and highlight rules for haxe, based on C# --- lib/ace/mode/haxe.js | 56 +++++++++++++++ lib/ace/mode/haxe_highlight_rules.js | 103 +++++++++++++++++++++++++++ 2 files changed, 159 insertions(+) create mode 100644 lib/ace/mode/haxe.js create mode 100644 lib/ace/mode/haxe_highlight_rules.js diff --git a/lib/ace/mode/haxe.js b/lib/ace/mode/haxe.js new file mode 100644 index 00000000..22b9e4af --- /dev/null +++ b/lib/ace/mode/haxe.js @@ -0,0 +1,56 @@ +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var TextMode = require("ace/mode/text").Mode; +var Tokenizer = require("ace/tokenizer").Tokenizer; +var HaxeHighlightRules = require("ace/mode/haxe_highlight_rules").HaxeHighlightRules; +var MatchingBraceOutdent = require("ace/mode/matching_brace_outdent").MatchingBraceOutdent; +var CstyleBehaviour = require("ace/mode/behaviour/cstyle").CstyleBehaviour; + +var Mode = function() { + this.$tokenizer = new Tokenizer(new HaxeHighlightRules().getRules()); + this.$outdent = new MatchingBraceOutdent(); + this.$behaviour = new CstyleBehaviour(); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.getNextLineIndent = function(state, line, tab) { + var indent = this.$getIndent(line); + + var tokenizedLine = this.$tokenizer.getLineTokens(line, state); + var tokens = tokenizedLine.tokens; + var endState = tokenizedLine.state; + + if (tokens.length && tokens[tokens.length-1].type == "comment") { + return indent; + } + + if (state == "start") { + var match = line.match(/^.*[\{\(\[]\s*$/); + if (match) { + indent += tab; + } + } + + return indent; + }; + + this.checkOutdent = function(state, line, input) { + return this.$outdent.checkOutdent(line, input); + }; + + this.autoOutdent = function(state, doc, row) { + this.$outdent.autoOutdent(doc, row); + }; + + + this.createWorker = function(session) { + return null; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/lib/ace/mode/haxe_highlight_rules.js b/lib/ace/mode/haxe_highlight_rules.js new file mode 100644 index 00000000..cb36c410 --- /dev/null +++ b/lib/ace/mode/haxe_highlight_rules.js @@ -0,0 +1,103 @@ +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var lang = require("pilot/lang"); +var DocCommentHighlightRules = require("ace/mode/doc_comment_highlight_rules").DocCommentHighlightRules; +var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules; + +var HaxeHighlightRules = function() { + + var keywords = lang.arrayToMap( + ("break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std").split("|") + ); + + var buildinConstants = lang.arrayToMap( + ("null|true|false").split("|") + ); + + + // regexp must not have capturing parentheses. Use (?:) instead. + // regexps are ordered -> the first match is used + + this.$rules = { + "start" : [ + { + token : "comment", + regex : "\\/\\/.*$" + }, + new DocCommentHighlightRules().getStartRule("doc-start"), + { + token : "comment", // multi line comment + regex : "\\/\\*", + merge : true, + next : "comment" + }, { + token : "string.regexp", + regex : "[/](?:(?:\\[(?:\\\\]|[^\\]])+\\])|(?:\\\\/|[^\\]/]))*[/]\\w*\\s*(?=[).,;]|$)" + }, { + token : "string", // single line + regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' + }, { + token : "string", // single line + regex : "['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']" + }, { + token : "constant.numeric", // hex + regex : "0[xX][0-9a-fA-F]+\\b" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "constant.language.boolean", + regex : "(?:true|false)\\b" + }, { + token : function(value) { + if (value == "this") + return "variable.language"; + else if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (buildinConstants.hasOwnProperty(value)) + return "constant.language"; + else + return "identifier"; + }, + // TODO: Unicode escape sequences + // TODO: Unicode identifiers + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "!|\\$|%|&|\\*|\\-\\-|\\-|\\+\\+|\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=|\\b(?:in|instanceof|new|delete|typeof|void)" + }, { + token : "punctuation.operator", + regex : "\\?|\\:|\\,|\\;|\\." + }, { + token : "paren.lparen", + regex : "[[({<]" + }, { + token : "paren.rparen", + regex : "[\\])}>]" + }, { + token : "text", + regex : "\\s+" + } + ], + "comment" : [ + { + token : "comment", // closing comment + regex : ".*?\\*\\/", + next : "start" + }, { + token : "comment", // comment spanning whole line + merge : true, + regex : ".+" + } + ] + }; + + this.embedRules(DocCommentHighlightRules, "doc-", + [ new DocCommentHighlightRules().getEndRule("start") ]); +}; + +oop.inherits(HaxeHighlightRules, TextHighlightRules); + +exports.HaxeHighlightRules = HaxeHighlightRules; +}); From c1337be88f2e610302e794f06bc20247cac0f1ca Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Thu, 3 Nov 2011 13:42:50 +0800 Subject: [PATCH 2/8] Added a sample file for haxe --- demo/kitchen-sink/docs/haxe.hx | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 demo/kitchen-sink/docs/haxe.hx diff --git a/demo/kitchen-sink/docs/haxe.hx b/demo/kitchen-sink/docs/haxe.hx new file mode 100644 index 00000000..cc5b17bc --- /dev/null +++ b/demo/kitchen-sink/docs/haxe.hx @@ -0,0 +1,8 @@ +class MyHaxeClass { + public HelloWorld:Void() + { + // Say Hello! + var greeting = "Hello"; + trace(greeting + " World"); + } +} \ No newline at end of file From dbd5d3fa01910cc393050e29424ba868a98164a0 Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Thu, 3 Nov 2011 13:43:48 +0800 Subject: [PATCH 3/8] Added haxe mode to Makefile.dryice.js --- Makefile.dryice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.dryice.js b/Makefile.dryice.js index a705fcf4..976a1658 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -212,7 +212,7 @@ console.log('# ace modes ---------'); project.assumeAllFilesLoaded(); [ "css", "html", "javascript", "php", "coldfusion", "python", "lua", "xml", "ruby", "java", "c_cpp", - "coffee", "perl", "csharp", "svg", "clojure", "scss", "json", "groovy", + "coffee", "perl", "csharp", "haxe", "svg", "clojure", "scss", "json", "groovy", "ocaml", "scala", "textile", "scad", "markdown", "latex", "powershell", "sql" ].forEach(function(mode) { console.log("mode " + mode); From 3b589d0d85325fdd79038d2cbd98f57e48a17763 Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Thu, 3 Nov 2011 13:44:21 +0800 Subject: [PATCH 4/8] Changes to Kitchen Sink demo to include haxe mode and document --- demo/kitchen-sink/demo.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 78fbd883..a5f91837 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -98,6 +98,7 @@ exports.launch = function(env) { new Mode("csharp", "C#", require("ace/mode/csharp").Mode, ["cs"]), new Mode("css", "CSS", require("ace/mode/css").Mode, ["css"]), new Mode("groovy", "Groovy", require("ace/mode/groovy").Mode, ["groovy"]), + new Mode("haxe", "haXe", require("ace/mode/haxe").Mode, ["hx"]), new Mode("html", "HTML", require("ace/mode/html").Mode, ["html", "htm"]), new Mode("java", "Java", require("ace/mode/java").Mode, ["java"]), new Mode("javascript", "JavaScript", require("ace/mode/javascript").Mode, ["js"]), @@ -114,7 +115,7 @@ exports.launch = function(env) { new Mode("scss", "SCSS", require("ace/mode/scss").Mode, ["scss"]), new Mode("ruby", "Ruby", require("ace/mode/ruby").Mode, ["rb"]), new Mode("sql", "SQL", require("ace/mode/sql").Mode, ["sql"]), - new Mode("svg", "SVG", require("ace/mode/SVG").Mode, ["svg"]), + new Mode("svg", "SVG", require("ace/mode/svg").Mode, ["svg"]), new Mode("text", "Text", require("ace/mode/text").Mode, ["txt"]), new Mode("textile", "Textile", require("ace/mode/textile").Mode, ["textile"]), new Mode("xml", "XML", require("ace/mode/xml").Mode, ["xml"]) @@ -153,9 +154,13 @@ exports.launch = function(env) { require("ace/requirejs/text!demo/kitchen-sink/docs/scss.scss") ), new Doc( - "html", "HTML", - require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") + "html", "HTML", + require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") ), + new Doc( + "haxe", "haXe", + require("ace/requirejs/text!demo/kitchen-sink/docs/haxe.hx") + ), new Doc( "xml", "XML", require("ace/requirejs/text!demo/kitchen-sink/docs/xml.xml") From 0c4c0f8529254ffaeb9601e785733ab5598f84cb Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Thu, 3 Nov 2011 13:48:16 +0800 Subject: [PATCH 5/8] Changes to Textarea also --- build_support/boot_textarea.js | 1 + 1 file changed, 1 insertion(+) diff --git a/build_support/boot_textarea.js b/build_support/boot_textarea.js index 028f34b2..96cca854 100644 --- a/build_support/boot_textarea.js +++ b/build_support/boot_textarea.js @@ -425,6 +425,7 @@ function setupSettingPanel(settingDiv, settingOpener, api, options) { clojure: "Clojure", ocaml: "OCaml", csharp: "C#", + haxe: "haXe", svg: "SVG", textile: "Textile", groovy: "Groovy", From 8f0a86639a6429304e33e0eb32b4898cca5822f0 Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Fri, 4 Nov 2011 11:02:39 +0800 Subject: [PATCH 6/8] Renamed haxe file sample and changed class so that it is a valid file that compiles. --- demo/kitchen-sink/docs/Haxe.hx | 17 +++++++++++++++++ demo/kitchen-sink/docs/haxe.hx | 8 -------- 2 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 demo/kitchen-sink/docs/Haxe.hx delete mode 100644 demo/kitchen-sink/docs/haxe.hx diff --git a/demo/kitchen-sink/docs/Haxe.hx b/demo/kitchen-sink/docs/Haxe.hx new file mode 100644 index 00000000..35bb8e67 --- /dev/null +++ b/demo/kitchen-sink/docs/Haxe.hx @@ -0,0 +1,17 @@ +class Haxe +{ + public static function main() + { + // Say Hello! + var greeting:String = "Hello World"; + trace(greeting); + + var targets:Array = ["Flash","Javascript","PHP","Neko","C++","iOS","Android","webOS"]; + trace("Haxe is a great language that can target:"); + for (target in targets) + { + trace (" - " + target); + } + trace("And many more!"); + } +} \ No newline at end of file diff --git a/demo/kitchen-sink/docs/haxe.hx b/demo/kitchen-sink/docs/haxe.hx deleted file mode 100644 index cc5b17bc..00000000 --- a/demo/kitchen-sink/docs/haxe.hx +++ /dev/null @@ -1,8 +0,0 @@ -class MyHaxeClass { - public HelloWorld:Void() - { - // Say Hello! - var greeting = "Hello"; - trace(greeting + " World"); - } -} \ No newline at end of file From 45d3c86da60d9ce088414a68e93ca3e0f1c9ccb8 Mon Sep 17 00:00:00 2001 From: Jason O'Neil Date: Thu, 10 Nov 2011 16:38:59 +0800 Subject: [PATCH 7/8] Changed to demo, because haxe.hx was renamed to Haxe.hx Haxe files must be uppercase to be compile-able. --- demo/kitchen-sink/demo.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index a5f91837..c814c7ab 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -159,7 +159,7 @@ exports.launch = function(env) { ), new Doc( "haxe", "haXe", - require("ace/requirejs/text!demo/kitchen-sink/docs/haxe.hx") + require("ace/requirejs/text!demo/kitchen-sink/docs/Haxe.hx") ), new Doc( "xml", "XML", From 6d06b3bbd07df96a36097f12e93c07f4e12d3665 Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Tue, 15 Nov 2011 11:21:57 +0100 Subject: [PATCH 8/8] cleanups to the haxe mode --- demo/kitchen-sink/demo.js | 10 +++++----- demo/kitchen-sink/docs/Haxe.hx | 28 ++++++++++++++-------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index c814c7ab..3023127c 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -154,13 +154,13 @@ exports.launch = function(env) { require("ace/requirejs/text!demo/kitchen-sink/docs/scss.scss") ), new Doc( - "html", "HTML", - require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") + "html", "HTML", + require("ace/requirejs/text!demo/kitchen-sink/docs/html.html") ), new Doc( - "haxe", "haXe", - require("ace/requirejs/text!demo/kitchen-sink/docs/Haxe.hx") - ), + "haxe", "haXe", + require("ace/requirejs/text!demo/kitchen-sink/docs/Haxe.hx") + ), new Doc( "xml", "XML", require("ace/requirejs/text!demo/kitchen-sink/docs/xml.xml") diff --git a/demo/kitchen-sink/docs/Haxe.hx b/demo/kitchen-sink/docs/Haxe.hx index 35bb8e67..ab205bba 100644 --- a/demo/kitchen-sink/docs/Haxe.hx +++ b/demo/kitchen-sink/docs/Haxe.hx @@ -1,17 +1,17 @@ class Haxe { - public static function main() - { - // Say Hello! - var greeting:String = "Hello World"; - trace(greeting); - - var targets:Array = ["Flash","Javascript","PHP","Neko","C++","iOS","Android","webOS"]; - trace("Haxe is a great language that can target:"); - for (target in targets) - { - trace (" - " + target); - } - trace("And many more!"); - } + public static function main() + { + // Say Hello! + var greeting:String = "Hello World"; + trace(greeting); + + var targets:Array = ["Flash","Javascript","PHP","Neko","C++","iOS","Android","webOS"]; + trace("Haxe is a great language that can target:"); + for (target in targets) + { + trace (" - " + target); + } + trace("And many more!"); + } } \ No newline at end of file