diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 56e32d53..d51134df 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -55,7 +55,7 @@ var MultiSelect = require("ace/multi_select").MultiSelect; var whitespace = require("ace/ext/whitespace"); var doclist = require("./doclist"); -var modelist = require("./modelist"); +var modelist = require("ace/ext/modelist"); var layout = require("./layout"); var TokenTooltip = require("./token_tooltip").TokenTooltip; var util = require("./util"); diff --git a/demo/kitchen-sink/doclist.js b/demo/kitchen-sink/doclist.js index 2da245ca..6e7023cf 100644 --- a/demo/kitchen-sink/doclist.js +++ b/demo/kitchen-sink/doclist.js @@ -35,7 +35,7 @@ var EditSession = require("ace/edit_session").EditSession; var UndoManager = require("ace/undomanager").UndoManager; var net = require("ace/lib/net"); -var modelist = require("./modelist"); +var modelist = require("ace/ext/modelist"); /*********** demo documents ***************************/ var fileCache = {}; diff --git a/demo/modelist.html b/demo/modelist.html new file mode 100644 index 00000000..da46acf6 --- /dev/null +++ b/demo/modelist.html @@ -0,0 +1,61 @@ + + +
+ + +var editor = ace.edit("editor");
+editor.setTheme("ace/theme/twilight");
+(function () {
+ var modelist = ace.require('ace/ext/modelist');
+ // the file path could come from an xmlhttp request, a drop event,
+ // or any other scriptable file loading process.
+ // Extensions could consume the modelist and use it to dynamically
+ // set the editor mode. Webmasters could use it in their scripts
+ // for site specific purposes as well.
+ var filePath = 'blahblah/weee/some.js';
+ var mode = modelist.getModeFromPath(filePath).mode;
+ console.log(mode);
+ editor.getSession().setMode(mode);
+}());
+
+
+
+
+
+
+
+
diff --git a/lib/ace/ext/modelist.js b/lib/ace/ext/modelist.js
new file mode 100644
index 00000000..f3bf695b
--- /dev/null
+++ b/lib/ace/ext/modelist.js
@@ -0,0 +1,140 @@
+define(function(require, exports, module) {
+"use strict";
+
+/************** modes ***********************/
+/**
+ * An array containing information about rendering modes.
+ */
+var modes = [];
+/**
+ * Suggests a mode based on the file extension present in the given path
+ * @param {string} path The path to the file
+ * @returns {object} Returns an object containing information about the
+ * suggested mode.
+ */
+function getModeFromPath(path) {
+ var mode = modesByName.text;
+ var fileName = path.split(/[\/\\]/).pop();
+ for (var i = 0; i < modes.length; i++) {
+ if (modes[i].supportsFile(fileName)) {
+ mode = modes[i];
+ break;
+ }
+ }
+ return mode;
+}
+
+var Mode = function(name, desc, extensions) {
+ this.name = name;
+ this.desc = desc;
+ this.mode = "ace/mode/" + name;
+ if (/\^/.test(extensions)) {
+ var re = extensions.replace(/\|(\^)?/g, function(a, b){
+ return "$|" + (b ? "^" : "^.*\\.");
+ }) + "$";
+ } else {
+ var re = "^.*\\.(" + extensions + ")$";
+ }
+
+ this.extRe = new RegExp(re, "gi");
+};
+
+Mode.prototype.supportsFile = function(filename) {
+ return filename.match(this.extRe);
+};
+
+/**
+ * An object containing properties that map to rendering modes. Each property
+ * contains an array where element 0 is the name of the mode and element 1
+ * contains information about the file extensions where this mode is
+ * applicable.
+ */
+var modesByName = {
+ abap: ["ABAP" , "abap"],
+ asciidoc: ["AsciiDoc" , "asciidoc"],
+ c9search: ["C9Search" , "c9search_results"],
+ coffee: ["CoffeeScript" , "^Cakefile|coffee|cf|cson"],
+ coldfusion: ["ColdFusion" , "cfm"],
+ csharp: ["C#" , "cs"],
+ css: ["CSS" , "css"],
+ curly: ["Curly" , "curly"],
+ dart: ["Dart" , "dart"],
+ diff: ["Diff" , "diff|patch"],
+ dot: ["Dot" , "dot"],
+ ftl: ["FreeMarker" , "ftl"],
+ glsl: ["Glsl" , "glsl|frag|vert"],
+ golang: ["Go" , "go"],
+ groovy: ["Groovy" , "groovy"],
+ haxe: ["haXe" , "hx"],
+ haml: ["HAML" , "haml"],
+ html: ["HTML" , "htm|html|xhtml"],
+ c_cpp: ["C/C++" , "c|cc|cpp|cxx|h|hh|hpp"],
+ clojure: ["Clojure" , "clj"],
+ jade: ["Jade" , "jade"],
+ java: ["Java" , "java"],
+ jsp: ["JSP" , "jsp"],
+ javascript: ["JavaScript" , "js"],
+ json: ["JSON" , "json"],
+ jsx: ["JSX" , "jsx"],
+ latex: ["LaTeX" , "latex|tex|ltx|bib"],
+ less: ["LESS" , "less"],
+ lisp: ["Lisp" , "lisp"],
+ scheme: ["Scheme" , "scm|rkt"],
+ liquid: ["Liquid" , "liquid"],
+ livescript: ["LiveScript" , "ls"],
+ logiql: ["LogiQL" , "logic|lql"],
+ lua: ["Lua" , "lua"],
+ luapage: ["LuaPage" , "lp"], // http://keplerproject.github.com/cgilua/manual.html#templates
+ lucene: ["Lucene" , "lucene"],
+ lsl: ["LSL" , "lsl"],
+ makefile: ["Makefile" , "^GNUmakefile|^makefile|^Makefile|^OCamlMakefile|make"],
+ markdown: ["Markdown" , "md|markdown"],
+ mushcode: ["TinyMUSH" , "mc|mush"],
+ objectivec: ["Objective-C" , "m"],
+ ocaml: ["OCaml" , "ml|mli"],
+ pascal: ["Pascal" , "pas|p"],
+ perl: ["Perl" , "pl|pm"],
+ pgsql: ["pgSQL" , "pgsql"],
+ php: ["PHP" , "php|phtml"],
+ powershell: ["Powershell" , "ps1"],
+ python: ["Python" , "py"],
+ r: ["R" , "r"],
+ rdoc: ["RDoc" , "Rd"],
+ rhtml: ["RHTML" , "Rhtml"],
+ ruby: ["Ruby" , "ru|gemspec|rake|rb"],
+ scad: ["OpenSCAD" , "scad"],
+ scala: ["Scala" , "scala"],
+ scss: ["SCSS" , "scss"],
+ sass: ["SASS" , "sass"],
+ sh: ["SH" , "sh|bash|bat"],
+ sql: ["SQL" , "sql"],
+ stylus: ["Stylus" , "styl|stylus"],
+ svg: ["SVG" , "svg"],
+ tcl: ["Tcl" , "tcl"],
+ tex: ["Tex" , "tex"],
+ text: ["Text" , "txt"],
+ textile: ["Textile" , "textile"],
+ tmsnippet: ["tmSnippet" , "tmSnippet"],
+ toml: ["toml" , "toml"],
+ typescript: ["Typescript" , "typescript|ts|str"],
+ vbscript: ["VBScript" , "vbs"],
+ xml: ["XML" , "xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl"],
+ xquery: ["XQuery" , "xq"],
+ yaml: ["YAML" , "yaml"]
+};
+
+for (var name in modesByName) {
+ var mode = modesByName[name];
+ mode = new Mode(name, mode[0], mode[1]);
+ modesByName[name] = mode;
+ modes.push(mode);
+}
+
+module.exports = {
+ getModeFromPath: getModeFromPath,
+ modes: modes,
+ modesByName: modesByName
+};
+
+});
+
diff --git a/tool/mode_creator.js b/tool/mode_creator.js
index cb633a8b..f3d9f1a5 100644
--- a/tool/mode_creator.js
+++ b/tool/mode_creator.js
@@ -6,7 +6,7 @@ var net = require("ace/lib/net");
var Range = require("ace/range").Range;
var util = require("demo/kitchen-sink/util");
var layout = require("demo/kitchen-sink/layout");
-var modelist = require("demo/kitchen-sink/modelist");
+var modelist = require("ace/ext/modelist");
var doclist = require("demo/kitchen-sink/doclist");
var TokenTooltip = require("demo/kitchen-sink/token_tooltip").TokenTooltip;