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 @@ + + + + + + ACE Editor Modelist Demo + + + + +
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;