From 6580d3e287eb61f88c842f31fd06a3a4ae0e351e Mon Sep 17 00:00:00 2001 From: Jonathan Camile Date: Fri, 7 Oct 2011 11:34:37 +0200 Subject: [PATCH 1/2] Added SQL mode --- lib/ace/mode/sql.js | 68 ++++++++++++++++ lib/ace/mode/sql_highlight_rules.js | 118 ++++++++++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 lib/ace/mode/sql.js create mode 100644 lib/ace/mode/sql_highlight_rules.js diff --git a/lib/ace/mode/sql.js b/lib/ace/mode/sql.js new file mode 100644 index 00000000..777d86fd --- /dev/null +++ b/lib/ace/mode/sql.js @@ -0,0 +1,68 @@ +/* ***** BEGIN LICENSE BLOCK ***** +* The Original Code is Ajax.org Code Editor (ACE). +* +* Contributor(s): +* Jonathan Camile +* +* 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 Tokenizer = require("ace/tokenizer").Tokenizer; + var SqlHighlightRules = require("ace/mode/sql_highlight_rules").SqlHighlightRules; + var Range = require("ace/range").Range; + + var Mode = function() { + this.$tokenizer = new Tokenizer(new SqlHighlightRules().getRules()); + }; + oop.inherits(Mode, TextMode); + + (function() { + + this.toggleCommentLines = function(state, doc, startRow, endRow) { + var outdent = true; + var outentedRows = []; + var re = /^(\s*)--/; + + for (var i=startRow; i<= endRow; i++) { + if (!re.test(doc.getLine(i))) { + outdent = false; + break; + } + } + + if (outdent) { + var deleteRange = new Range(0, 0, 0, 0); + for (var i=startRow; i<= endRow; i++) + { + var line = doc.getLine(i); + var m = line.match(re); + deleteRange.start.row = i; + deleteRange.end.row = i; + deleteRange.end.column = m[0].length; + doc.replace(deleteRange, m[1]); + } + } + else { + doc.indentRows(startRow, endRow, "--"); + } + }; + + }).call(Mode.prototype); + + exports.Mode = Mode; +}); diff --git a/lib/ace/mode/sql_highlight_rules.js b/lib/ace/mode/sql_highlight_rules.js new file mode 100644 index 00000000..981ca944 --- /dev/null +++ b/lib/ace/mode/sql_highlight_rules.js @@ -0,0 +1,118 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * The Original Code is Ajax.org Code Editor (ACE). + * + * Contributor(s): + * Jonathan Camile + * + * 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 lang = require("pilot/lang"); +var TextHighlightRules = require("ace/mode/text_highlight_rules").TextHighlightRules; + +var SqlHighlightRules = function() { + + var keywords = lang.arrayToMap( + ("select|from|where|and|or|group by|order by|limit|offset|having|as|case|" + + "when|else|end|type|left|right|join|on|outer").split("|") + ); + + var builtinConstants = lang.arrayToMap( + ("true|false|null").split("|") + ); + + var builtinFunctions = lang.arrayToMap( + ("count|min|max|avg|sum|rank|now|coalesce").split("|") + ); + + this.$rules = { + "start" : [ { + token : "comment", + regex : "--.*$" + }, { + token : "string", // multi line " string start + merge : true, + regex : '".*$', + next : "qqstring" + }, { + token : "string", // " string + regex : '"(?:[^\\\\]|\\\\.)*?"' + }, { + token : "string", // multi line ' string start + merge : true, + regex : "'.*$", + next : "qstring" + }, { + token : "string", // ' string + regex : "'(?:[^\\\\]|\\\\.)*?'" + }, { + token : "constant.numeric", // float + regex : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b" + }, { + token : function(value) { + value = value.toLowerCase(); + if (keywords.hasOwnProperty(value)) + return "keyword"; + else if (builtinConstants.hasOwnProperty(value)) + return "constant.language"; + else if (builtinFunctions.hasOwnProperty(value)) + return "support.function"; + else + return "identifier"; + }, + regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" + }, { + token : "keyword.operator", + regex : "\\+|\\-|\\/|\\/\\/|%|<@>|@>|<@|&|\\^|~|<|>|<=|=>|==|!=|<>|=" + }, { + token : "lparen.paren", + regex : "[\\(]" + }, { + token : "paren.rparen", + regex : "[\\)]" + }, { + token : "text", + regex : "\\s+" + } ], + "qqstring" : [ { + token : "string", // multi line " string end + regex : '(?:[^\\\\]|\\\\.)*?"', + next : "start" + }, { + token : "string", + merge : true, + regex : '.+' + } ], + "qstring" : [ { + token : "string", // multi line ' string end + regex : "(?:[^\\\\]|\\\\.)*?'", + next : "start" + }, { + token : "string", + merge : true, + regex : '.+' + } ] + }; +}; + +oop.inherits(SqlHighlightRules, TextHighlightRules); + +exports.SqlHighlightRules = SqlHighlightRules; +}); + From f60b3558d3c76dbb6be47fe532f01b65db43c77d Mon Sep 17 00:00:00 2001 From: Jonathan Camile Date: Fri, 7 Oct 2011 11:40:09 +0200 Subject: [PATCH 2/2] Added SQL mode in Makefile --- Makefile.dryice.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.dryice.js b/Makefile.dryice.js index 1935b57e..92da75cf 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -213,7 +213,7 @@ project.assumeAllFilesLoaded(); [ "css", "html", "javascript", "php", "python", "lua", "xml", "ruby", "java", "c_cpp", "coffee", "perl", "csharp", "svg", "clojure", "scss", "json", "groovy", - "ocaml", "scala", "textile", "scad", "markdown", "latex", "powershell" + "ocaml", "scala", "textile", "scad", "markdown", "latex", "powershell", "sql" ].forEach(function(mode) { console.log("mode " + mode); copy({