diff --git a/Makefile.dryice.js b/Makefile.dryice.js index 92da75cf..a2877f0c 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -211,7 +211,7 @@ console.log('# ace modes ---------'); project.assumeAllFilesLoaded(); [ - "css", "html", "javascript", "php", "python", "lua", "xml", "ruby", "java", "c_cpp", + "css", "html", "javascript", "php", "coldfusion", "python", "lua", "xml", "ruby", "java", "c_cpp", "coffee", "perl", "csharp", "svg", "clojure", "scss", "json", "groovy", "ocaml", "scala", "textile", "scad", "markdown", "latex", "powershell", "sql" ].forEach(function(mode) { diff --git a/demo/demo.js b/demo/demo.js index 119ba03f..5686bcd4 100644 --- a/demo/demo.js +++ b/demo/demo.js @@ -57,6 +57,7 @@ var XmlMode = require("ace/mode/xml").Mode; var LuaMode = require("ace/mode/lua").Mode; var PythonMode = require("ace/mode/python").Mode; var PhpMode = require("ace/mode/php").Mode; +var ColdfusionMode = require("ace/mode/coldfusion").Mode; var JavaMode = require("ace/mode/java").Mode; var CSharpMode = require("ace/mode/csharp").Mode; var RubyMode = require("ace/mode/ruby").Mode; @@ -138,6 +139,10 @@ exports.launch = function(env) { docs.php = new EditSession(require("ace/requirejs/text!demo/docs/php.php")); docs.php.setMode(new PhpMode()); docs.php.setUndoManager(new UndoManager()); + + docs.coldfusion = new EditSession(require("ace/requirejs/text!demo/docs/coldfusion.cfm")); + docs.coldfusion.setMode(new ColdfusionMode()); + docs.coldfusion.setUndoManager(new UndoManager()); docs.java = new EditSession(require("ace/requirejs/text!demo/docs/java.java")); docs.java.setMode(new JavaMode()); @@ -239,6 +244,7 @@ exports.launch = function(env) { lua: new LuaMode(), python: new PythonMode(), php: new PhpMode(), + coldfusion: new ColdfusionMode(), java: new JavaMode(), ruby: new RubyMode(), c_cpp: new CCPPMode(), @@ -313,6 +319,9 @@ exports.launch = function(env) { else if (mode instanceof PhpMode) { modeEl.value = "php"; } + else if (mode instanceof ColdfusionMode) { + modeEl.value = "coldfusion"; + } else if (mode instanceof JavaMode) { modeEl.value = "java"; } @@ -557,6 +566,8 @@ exports.launch = function(env) { mode = "python"; } else if (/^.*\.php$/i.test(file.name)) { mode = "php"; + } else if (/^.*\.cfm$/i.test(file.name)) { + mode = "coldfusion"; } else if (/^.*\.cs$/i.test(file.name)) { mode = "csharp"; } else if (/^.*\.java$/i.test(file.name)) { @@ -721,8 +732,10 @@ exports.launch = function(env) { var themes = {}; function loadTheme(name, callback) { - if (themes[name]) + if (themes[name]) { + callback(); return; + } themes[name] = 1; var base = name.split("/").pop(); diff --git a/demo/docs/coldfusion.cfm b/demo/docs/coldfusion.cfm new file mode 100644 index 00000000..750a389f --- /dev/null +++ b/demo/docs/coldfusion.cfm @@ -0,0 +1,5 @@ + + + + +#welcome# \ No newline at end of file diff --git a/lib/ace/mode/coldfusion.js b/lib/ace/mode/coldfusion.js new file mode 100644 index 00000000..8ffa83d9 --- /dev/null +++ b/lib/ace/mode/coldfusion.js @@ -0,0 +1,78 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var TextMode = require("ace/mode/text").Mode; +var JavaScriptMode = require("ace/mode/javascript").Mode; +var CssMode = require("ace/mode/css").Mode; +var Tokenizer = require("ace/tokenizer").Tokenizer; +var ColdfusionHighlightRules = require("ace/mode/coldfusion_highlight_rules").ColdfusionHighlightRules; +var XmlBehaviour = require("ace/mode/behaviour/xml").XmlBehaviour; + +var Mode = function() { + var highlighter = new ColdfusionHighlightRules(); + this.$tokenizer = new Tokenizer(highlighter.getRules()); + this.$behaviour = new XmlBehaviour(); + + this.$embeds = highlighter.getEmbeds(); + this.createModeDelegates({ + "js-": JavaScriptMode, + "css-": CssMode + }); +}; +oop.inherits(Mode, TextMode); + +(function() { + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + return 0; + }; + + this.getNextLineIndent = function(state, line, tab) { + return this.$getIndent(line); + }; + + this.checkOutdent = function(state, line, input) { + return false; + }; + +}).call(Mode.prototype); + +exports.Mode = Mode; +}); diff --git a/lib/ace/mode/coldfusion_highlight_rules.js b/lib/ace/mode/coldfusion_highlight_rules.js new file mode 100644 index 00000000..756350a1 --- /dev/null +++ b/lib/ace/mode/coldfusion_highlight_rules.js @@ -0,0 +1,198 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +define(function(require, exports, module) { + +var oop = require("pilot/oop"); +var CssHighlightRules = require("ace/mode/css_highlight_rules").CssHighlightRules; +var JavaScriptHighlightRules = require("ace/mode/javascript_highlight_rules").JavaScriptHighlightRules; +var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules; + +var ColdfusionHighlightRules = function() { + + // regexp must not have capturing parentheses + // regexps are ordered -> the first match is used + function string(state) { + return [{ + token : "string", + regex : '".*?"' + }, { + token : "string", // multi line string start + merge : true, + regex : '["].*$', + next : state + "-qqstring" + }, { + token : "string", + regex : "'.*?'" + }, { + token : "string", // multi line string start + merge : true, + regex : "['].*$", + next : state + "-qstring" + }] + } + + function multiLineString(quote, state) { + return [{ + token : "string", + merge : true, + regex : ".*" + quote, + next : state + }, { + token : "string", + merge : true, + regex : '.+' + }] + } + + function tag(states, name, nextState) { + states[name] = [{ + token : "text", + regex : "\\s+" + }, { + token : "meta.tag", + regex : "[-_a-zA-Z0-9:]+", + next : name + "-attribute-list" + }, { + token: "empty", + regex: "", + next : name + "-attribute-list" + }]; + + states[name + "-qstring"] = multiLineString("'", name); + states[name + "-qqstring"] = multiLineString("\"", name); + + states[name + "-attribute-list"] = [{ + token : "text", + regex : ">", + next : nextState + }, { + token : "entity.other.attribute-name", + regex : "[-_a-zA-Z0-9:]+" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : "text", + regex : "\\s+" + }].concat(string(name)); + }; + + this.$rules = { + start : [ { + token : "text", + merge : true, + regex : "<\\!\\[CDATA\\[", + next : "cdata" + }, { + token : "xml_pe", + regex : "<\\?.*?\\?>" + }, { + token : "comment", + merge : true, + regex : "<\\!--", + next : "comment" + }, { + token : "text", + regex : "<(?=\s*script)", + next : "script" + }, { + token : "text", + regex : "<(?=\s*style)", + next : "css" + }, { + token : "text", // opening tag + regex : "<\\/?", + next : "tag" + }, { + token : "text", + regex : "\\s+" + }, { + token : "text", + regex : "[^<]+" + } ], + + cdata : [ { + token : "text", + regex : "\\]\\]>", + next : "start" + }, { + token : "text", + merge : true, + regex : "\\s+" + }, { + token : "text", + merge : true, + regex : ".+" + } ], + + comment : [ { + token : "comment", + regex : ".*?-->", + next : "start" + }, { + token : "comment", + merge : true, + regex : ".+" + } ] + }; + + tag(this.$rules, "tag", "start"); + tag(this.$rules, "css", "css-start"); + tag(this.$rules, "script", "js-start"); + + this.embedRules(JavaScriptHighlightRules, "js-", [{ + token: "comment", + regex: "\\/\\/.*(?=<\\/script>)", + next: "tag" + }, { + token: "text", + regex: "<\\/(?=script)", + next: "tag" + }]); + + this.embedRules(CssHighlightRules, "css-", [{ + token: "text", + regex: "<\\/(?=style)", + next: "tag" + }]); +}; + +oop.inherits(ColdfusionHighlightRules, TextHighlightRules); + +exports.ColdfusionHighlightRules = ColdfusionHighlightRules; +}); diff --git a/lib/ace/mode/coldfusion_test.js b/lib/ace/mode/coldfusion_test.js new file mode 100644 index 00000000..7166c970 --- /dev/null +++ b/lib/ace/mode/coldfusion_test.js @@ -0,0 +1,73 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Ajax.org Code Editor (ACE). + * + * The Initial Developer of the Original Code is + * Ajax.org B.V. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Fabian Jakobs + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +if (typeof process !== "undefined") { + require("../../../support/paths"); +} + +define(function(require, exports, module) { + +var EditSession = require("ace/edit_session").EditSession; +var Range = require("ace/range").Range; +var ColdfusionMode = require("ace/mode/coldfusion").Mode; +var assert = require("ace/test/assertions"); + +module.exports = { + setUp : function() { + this.mode = new ColdfusionMode(); + }, + + "test: toggle comment lines should not do anything" : function() { + var session = new EditSession([" abc", "cde", "fg"]); + + var range = new Range(0, 3, 1, 1); + var comment = this.mode.toggleCommentLines("start", session, 0, 1); + assert.equal([" abc", "cde", "fg"].join("\n"), session.toString()); + }, + + "test: next line indent should be the same as the current line indent" : function() { + assert.equal(" ", this.mode.getNextLineIndent("start", " abc")); + assert.equal("", this.mode.getNextLineIndent("start", "abc")); + assert.equal("\t", this.mode.getNextLineIndent("start", "\tabc")); + } +}; + +}); + +if (typeof module !== "undefined" && module === require.main) { + require("asyncjs").test.testcase(module.exports).exec() +}