Merge git://github.com/ajaxorg/ace

This commit is contained in:
William Candillon 2012-11-01 15:45:08 +01:00
commit c9cef12b9f
87 changed files with 1295 additions and 884 deletions

View file

@ -4,7 +4,7 @@
*
* Copyright (c) 2010, Ajax.org B.V.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
@ -15,7 +15,7 @@
* * Neither the name of Ajax.org B.V. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
@ -30,8 +30,11 @@
* ***** END LICENSE BLOCK ***** */
var fs = require("fs");
var path = require("path");
if (!fs.existsSync)
fs.existsSync = require("path").existsSync;
fs.existsSync = path.existsSync;
else
path.existsSync = fs.existsSync;
var copy = require('dryice').copy;
var ACE_HOME = __dirname;
@ -44,7 +47,7 @@ function main(args) {
return "-" + x;
return x;
});
if (args[2] && (args[2][0] != "-" || args[2].indexOf("h") != -1))
type = args[2];
@ -66,8 +69,7 @@ function main(args) {
} else if (type == "bm") {
bookmarklet();
} else if (type == "full") {
ace();
demo();
demo(ace());
bookmarklet();
}
}
@ -120,7 +122,7 @@ function ace() {
console.log('# ace ---------');
// uncompressed
buildAce({
var project = buildAce({
compress: false,
noconflict: false
});
@ -153,9 +155,16 @@ function ace() {
source: ACE_HOME + "/ChangeLog.txt",
dest: BUILD_DIR + "/ChangeLog.txt"
});
return project;
}
function demo() {
function demo(project) {
project = project || buildAce({
compress: false,
noconflict: false,
coreOnly: true
});
console.log('# kitchen sink ---------');
var version, ref;
@ -166,23 +175,26 @@ function demo() {
ref = "";
version = "";
}
var changeComments = function(data) {
return (data
.replace(/<!\-\-DEVEL[\d\D]*?DEVEL\-\->/g, "")
.replace(/PACKAGE\-\->|<!\-\-PACKAGE/g, "")
.replace(/\/\*DEVEL[\d\D]*?DEVEL\*\//g, "")
.replace(/PACKAGE\*\/|\/\*PACKAGE/g, "")
.replace("%version%", version)
.replace("%commit%", ref)
);
}
function changeComments(data) {
return (data
.replace(/<!\-\-DEVEL[\d\D]*?DEVEL\-\->/g, "")
.replace(/PACKAGE\-\->|<!\-\-PACKAGE/g, "")
.replace(/\/\*DEVEL[\d\D]*?DEVEL\*\//g, "")
.replace(/PACKAGE\*\/|\/\*PACKAGE/g, "")
.replace("%version%", version)
.replace("%commit%", ref)
);
};
function fixDocPaths(data) {
return data.replace(/"(demo|build)\//g, "\"");
}
copy({
source: ACE_HOME + "/kitchen-sink.html",
dest: BUILD_DIR + "/kitchen-sink.html",
filter: [changeComments, function(data) {
return data.replace(/"(demo|build)\//g, "\"");
}]
filter: [changeComments, fixDocPaths]
});
copy({
@ -199,22 +211,17 @@ function demo() {
});
var demo = copy.createDataObject();
project.assumeAllFilesLoaded();
copy({
source: ACE_HOME + "/demo/kitchen-sink/demo.js",
dest: demo,
filter: [changeComments, function(data) {
return data.replace(/"(demo|build)\//g, "\"");
}, function(data) {
return data.replace("define(", "define('kitchen-sink/demo',");
}]
});
copy({
source: ACE_HOME + "/lib/ace/split.js",
dest: demo,
filter: [changeComments, function(data) {
return data.replace("define(", "define('ace/split',");
}]
source: [{
project: cloneProject(project),
require: [ "kitchen-sink/demo" ]
}],
filter: getWriteFilters({filters:[fixDocPaths]}, "demo"),
dest: demo
});
copy({
source: demo,
dest: BUILD_DIR + "/kitchen-sink/demo.js",
@ -223,7 +230,57 @@ function demo() {
copyFileSync(ACE_HOME + "/demo/kitchen-sink/logo.png", BUILD_DIR + "/kitchen-sink/logo.png");
}
function buildAce(options) {
function jsFileList(path, filter) {
path = ACE_HOME + "/" + path;
if (!filter)
filter = /_test/;
return fs.readdirSync(path).map(function(x) {
if (x.slice(-3) == ".js" && !filter.test(x))
return x.slice(0, -3);
}).filter(function(x){ return !!x });
}
function addSuffix(options) {
if (options.suffix == null) {
options.suffix = "";
if (options.compress)
options.suffix += "-min";
if (options.noconflict)
options.suffix += "-noconflict";
}
}
function getWriteFilters(options, projectType) {
var filters = [
copy.filter.moduleDefines,
removeUseStrict,
removeLicenceComments,
inlineTextModules
];
if (options.filters)
filters = filters.concat(options.filters);
if (projectType == "worker")
return filters;
if (options.noconflict)
filters.push(namespace(options.ns));
if (options.compress)
filters.push(copy.filter.uglifyjs);
if (options.exportModule && projectType == "main") {
if (options.noconflict)
filters.push(exportAce(options.ns, options.exportModule, options.ns));
else
filters.push(exportAce(options.ns, options.exportModule));
}
return filters;
}
var buildAce = function(options) {
var aceProject = {
roots: [ACE_HOME + '/lib', ACE_HOME + '/demo'],
textPluginPattern: /^ace\/requirejs\/text!/
@ -238,51 +295,22 @@ function buildAce(options) {
noconflict: false,
suffix: null,
name: "ace",
modes: fs.readdirSync(ACE_HOME + "/lib/ace/mode").map(function(x) {
if (x.slice(-3) == ".js" && !/_highlight_rules|_test|_worker|xml_util|_outdent|behaviour/.test(x))
return x.slice(0, -3);
}).filter(function(x) { return !!x; }),
themes: fs.readdirSync(ACE_HOME + "/lib/ace/theme").map(function(x){
return x.slice(-3) == ".js" && x.slice(0, -3);
}).filter(function(x){ return !!x; }),
modes: jsFileList("lib/ace/mode", /_highlight_rules|_test|_worker|xml_util|_outdent|behaviour/),
themes: jsFileList("lib/ace/theme"),
extensions: jsFileList("lib/ace/ext"),
workers: ["javascript", "coffee", "css", "json", "xquery"],
keybindings: ["vim", "emacs"]
};
for(var key in defaults)
if (!options.hasOwnProperty(key))
options[key] = defaults[key];
if (options.suffix == null) {
options.suffix = "";
if (options.compress)
options.suffix += "-min";
if (options.noconflict)
options.suffix += "-noconflict";
}
addSuffix(options);
if (!options.requires)
options.requires = [options.exportModule];
var filters = [
copy.filter.moduleDefines,
filterTextPlugin,
removeUseStrict,
removeLicenceCmments
];
if (options.noconflict) {
filters.push(namespace(options.ns));
if (options.exportModule)
var exportFilter = exportAce(options.ns, options.exportModule, options.ns);
} else if (options.exportModule) {
var exportFilter = exportAce(options.ns, options.exportModule);
}
if (options.compress)
filters.push(copy.filter.uglifyjs);
var targetDir = options.targetDir + options.suffix;
var name = options.name;
@ -300,10 +328,13 @@ function buildAce(options) {
filter: [ copy.filter.moduleDefines ],
dest: ace
});
if (options.coreOnly)
return project;
copy({
source: ace,
filter: exportFilter ? filters.concat(exportFilter) : filters,
filter: getWriteFilters(options, "main"),
dest: targetDir + '/' + name + ".js"
});
@ -317,7 +348,7 @@ function buildAce(options) {
project: cloneProject(project),
require: [ 'ace/mode/' + mode ]
}],
filter: filters,
filter: getWriteFilters(options, "mode"),
dest: targetDir + "/mode-" + mode + ".js"
});
});
@ -327,26 +358,29 @@ function buildAce(options) {
project.assumeAllFilesLoaded();
options.themes.forEach(function(theme) {
console.log("theme " + theme);
/*copy({
copy({
source: [{
project: cloneProject(project),
require: ["ace/theme/" + theme]
}],
filter: filters,
dest: targetDir + "/theme-" + theme + ".js"
});*/
// use this instead, to not create separate modules for js and css
var themePath = ACE_HOME + "/lib/ace/theme/" + theme
var js = fs.readFileSync(themePath + ".js", "utf8");
js = js.replace("define(", "define('ace/theme/" + theme + "', ['require', 'exports', 'module', 'ace/lib/dom'], ");
if (fs.existsSync(themePath + ".css", "utf8")) {
var css = fs.readFileSync(themePath + ".css", "utf8")
js = js.replace(/require\(.ace\/requirejs\/text!.*?\)/, quoteString(css))
}
filters.forEach(function(f) {js = f(js); });
fs.writeFileSync(targetDir + "/theme-" + theme + ".js", js);
filter: getWriteFilters(options, "theme"),
dest: targetDir + "/theme-" + theme.replace("_theme", "") + ".js"
});
});
console.log('# ace extensions ---------');
project.assumeAllFilesLoaded();
options.extensions.forEach(function(ext) {
console.log("extensions " + ext);
copy({
source: [{
project: cloneProject(project),
require: [ 'ace/ext/' + ext ]
}],
filter: getWriteFilters(options, "ext"),
dest: targetDir + "/ext-" + ext + ".js"
});
});
console.log('# ace key bindings ---------');
@ -359,19 +393,12 @@ function buildAce(options) {
project: cloneProject(project),
require: [ 'ace/keyboard/' + keybinding ]
}],
filter: filters,
filter: getWriteFilters(options, "keybinding"),
dest: targetDir + "/keybinding-" + keybinding + ".js"
});
});
console.log('# ace worker ---------');
filters = [
copy.filter.moduleDefines,
filterTextPlugin,
removeUseStrict,
removeLicenceCmments
];
options.workers.forEach(function(mode) {
console.log("worker for " + mode + " mode");
@ -390,7 +417,7 @@ function buildAce(options) {
'ace/mode/' + mode + '_worker'
]
}],
filter: filters,
filter: getWriteFilters(options, "worker"),
dest: worker
});
copy({
@ -404,14 +431,70 @@ function buildAce(options) {
});
console.log('# combining files into one ---------');
if (options.shrinkwrap) {
console.log('# combining files into one ---------');
copy({
source: { root:targetDir, exclude:/^worker\-/ },
dest: BUILD_DIR + '/ace-min.js'
});
}
return project;
};
// silence annoying messages from dryice
var buildAce = function(fn) {
return function() {
var log = console.log
console.log = function() {
if (typeof arguments[0] == "string" && /Ignoring requirement/.test(arguments[0]))
return;
log.apply(console, arguments);
}
var ret = fn.apply(null, arguments);
console.log = log;
return ret;
}
}(buildAce);
var textModules = {}
var detectTextModules = function(input, source) {
if (!source)
throw new Error('Missing filename for text module');
if (typeof input !== 'string')
input = input.toString();
var module = source.isLocation ? source.path : source;
input = input.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
input = input.replace(/\n\s+/g, "\n");
input = '"' + input.replace(/\n/g, '\\\n') + '"';
textModules[module] = input;
return "";
};
detectTextModules.onRead = true;
copy.filter.addDefines = detectTextModules;
function inlineTextModules(text) {
var lastDep = "";
return text.replace(/, *['"]ace\/requirejs\/text!(.*?)['"]|= *require\(['"](?:ace|[.\/]+)\/requirejs\/text!(.*?)['"]\)/g, function(_, dep, call) {
if (dep) {
if (!lastDep) {
lastDep = dep;
return "";
}
} else if (call) {
call = textModules[lastDep];
delete textModules[lastDep];
lastDep = "";
if (call)
return "= " + call;
}
console.log(dep, lastDep, call);
throw "inlining of multiple text modules is not supported";
});
}
// TODO: replace with project.clone once it is fixed in dryice
@ -432,6 +515,7 @@ function cloneProject(project) {
return clone;
}
function copyFileSync(srcFile, destFile) {
var BUF_LENGTH = 64*1024,
buf = new Buffer(BUF_LENGTH),
@ -458,16 +542,12 @@ function quoteString(str) {
return '"' + str.replace(/\\/, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\\n") + '"';
}
function filterTextPlugin(text) {
return text.replace(/(['"])ace\/requirejs\/text\!/g, "$1text!");
}
function removeUseStrict(text) {
return text.replace(/['"]use strict['"];/g, "");
}
function removeLicenceCmments(text) {
return text.replace(/(;)\s*\/\*[\d\D]*?\*\//g, "$1");
function removeLicenceComments(text) {
return text.replace(/(?:(;)|\n)\s*\/\*[\d\D]*?\*\/|\n\s*\/\/.*/g, "$1");
}
function namespace(ns) {

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View file

@ -2,6 +2,7 @@ var editor;
var embedded_editor;
$(function() {
hljs.initHighlighting();
ace.config.set("workerPath", "build/src-min");
editor = ace.edit("ace_editor_demo");
embedded_editor = ace.edit("embedded_ace_code");
editor.getSession().setMode("ace/mode/javascript");

View file

@ -250,6 +250,14 @@ ul.menu-list li {
hsl(0,0%,90%) 47%,
hsl(0,0%,78%) 53%,
hsl(0,0%,70%)100%);
background-image: -moz-repeating-linear-gradient(left, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,0) 6%, hsla(0,0%,100%, .1) 7.5%),
-moz-repeating-linear-gradient(left, hsla(0,0%, 0%,0) 0%, hsla(0,0%, 0%,0) 4%, hsla(0,0%, 0%,.03) 4.5%),
-moz-repeating-linear-gradient(left, hsla(0,0%,100%,0) 0%, hsla(0,0%,100%,0) 1.2%, hsla(0,0%,100%,.15) 2.2%),
-moz-linear-gradient(-90deg, hsl(0,0%,78%) 0%,
hsl(0,0%,90%) 47%,
hsl(0,0%,78%) 53%,
hsl(0,0%,70%)100%);
}
ul.menu-list li:hover {

View file

@ -514,6 +514,11 @@ tests for the highlighting.</p>
style="position: relative; left: 10px;top: -5px;width: 80px;" />
<a href="http://SpanDeX.io/">SpanDeX.io</a>
</li>
<li>
<img src="doc/site/images/ideone-logo.png"
style="position: relative; left: -5px; top: 20px;">
<a href="http://ideone.com">Ideone.com</a>
</li>
<li>
<a href="https://github.com/Gozala/sky-edit">Sky Edit</a>
</li>

View file

@ -33,27 +33,41 @@
* ***** END LICENSE BLOCK ***** */
var buildAce = require("./Makefile.dryice").buildAce;
var fs = require("fs");
var ACE_HOME = __dirname;
try {
var aceProject = {
roots: [
ACE_HOME + '/lib',
ACE_HOME + '/demo'
],
textPluginPattern: /^ace\/requirejs\/text!/
};
buildAce(aceProject, {
compress: false,
noconflict: false,
suffix: "",
compat: true,
name: "ace"
});
} catch (e) {
console.log("--- Ace Build error ---");
console.log(e);
process.exit(0);
function getVersion(path) {
if (fs.existsSync(path + "/.git-ref"))
return fs.readFileSync(path + "/.git-ref", "utf8");
if (fs.existsSync(path + "/.git/ORIG_HEAD"))
return fs.readFileSync(path + "/.git/ORIG_HEAD", "utf8");
if (fs.existsSync(path + "/.sourcemint/source.json")) {
var json = fs.readFileSync(path + "/.sourcemint/source.json", "utf8");
return JSON.parse(json).url.split("/").pop();
}
}
if (process.argv.indexOf("-c") > 0) try {
var version = getVersion(ACE_HOME);
var oldVersion = getVersion(ACE_HOME + "/build");
if (version && oldVersion == version) {
console.log("ace build is up to date");
process.exit(0);
}
fs.writeFileSync(ACE_HOME + "/build/.git-ref", version, "utf8");
} catch (e) {}
try {
buildAce({
compress: false,
noconflict: false,
suffix: "",
name: "ace"
});
} catch (err) {
console.error("--- Ace Build error ---");
console.error(err.stack);
process.exit(1);
}

View file

@ -53,8 +53,8 @@ var MultiSelect = require("./multi_select").MultiSelect;
// The following require()s are for inclusion in the built ace file
require("./worker/worker_client");
require("./keyboard/hash_handler");
require("./keyboard/state_handler");
require("./placeholder");
require("./mode/folding/fold_mode");
exports.config = require("./config");
/**
* Ace.edit(el) -> Editor
@ -66,9 +66,8 @@ exports.config = require("./config");
exports.edit = function(el) {
if (typeof(el) == "string") {
var _id = el;
if (!(el = document.getElementById(el))) {
console.log("can't match div #" + _id);
}
if (!(el = document.getElementById(el)))
throw "ace.edit can't find div #" + _id;
}
if (el.env && el.env.editor instanceof Editor)

View file

@ -321,11 +321,26 @@ exports.commands = [{
bindKey: bindKey("Ctrl-Shift-D", "Command-Shift-D"),
exec: function(editor) { editor.duplicateSelection(); },
multiSelectAction: "forEach"
}, {
name: "sortlines",
bindKey: bindKey("Ctrl-Alt-S", "Command-Alt-S"),
exec: function(editor) { editor.sortLines(); },
multiSelectAction: "forEach"
}, {
name: "togglecomment",
bindKey: bindKey("Ctrl-/", "Command-/"),
exec: function(editor) { editor.toggleCommentLines(); },
multiSelectAction: "forEach"
}, {
name: "modifyNumberUp",
bindKey: bindKey("Ctrl-Shift-Up", "Alt-Shift-Up"),
exec: function(editor) { editor.modifyNumber(1); },
multiSelectAction: "forEach"
}, {
name: "modifyNumberDown",
bindKey: bindKey("Ctrl-Shift-Down", "Alt-Shift-Down"),
exec: function(editor) { editor.modifyNumber(-1); },
multiSelectAction: "forEach"
}, {
name: "replace",
bindKey: bindKey("Ctrl-R", "Command-Option-F"),

View file

@ -39,9 +39,10 @@ var global = (function() {
var options = {
packaged: false,
workerPath: "",
modePath: "",
themePath: "",
workerPath: null,
modePath: null,
themePath: null,
basePath: "",
suffix: ".js",
$moduleUrls: {}
};
@ -74,7 +75,12 @@ exports.moduleUrl = function(name, component) {
if (!base && parts.length > 1)
base = parts[parts.length - 2];
return this.get(component + "Path") + "/" + component + "-" + base + this.get("suffix");
var path = options[component + "Path"];
if (path == null)
path = options.basePath;
if (path && path.slice(-1) != "/")
path += "/";
return path + component + "-" + base + this.get("suffix");
};
exports.setModuleUrl = function(name, subst) {
@ -95,9 +101,8 @@ exports.init = function() {
var script = scripts[i];
var src = script.src || script.getAttribute("src");
if (!src) {
if (!src)
continue;
}
var attributes = script.attributes;
for (var j=0, l=attributes.length; j < l; j++) {

71
lib/ace/config_test.js Normal file
View file

@ -0,0 +1,71 @@
/* ***** BEGIN LICENSE BLOCK *****
* Distributed under the BSD license:
*
* Copyright (c) 2010, Ajax.org B.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Ajax.org B.V. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK ***** */
if (typeof process !== "undefined") {
require("amd-loader");
}
define(function(require, exports, module) {
"use strict";
var config = require("./config");
var assert = require("./test/assertions");
module.exports = {
"test path resolution" : function() {
config.set("packaged", "true");
var url = config.moduleUrl("kr_theme", "theme");
assert.equal(url, "theme-kr.js");
config.set("basePath", "a/b");
url = config.moduleUrl("m/theme", "theme");
assert.equal(url, "a/b/theme-m.js");
url = config.moduleUrl("m/theme", "ext");
assert.equal(url, "a/b/ext-theme.js");
config.set("workerPath", "c/");
url = config.moduleUrl("foo/1", "worker");
assert.equal(url, "c/worker-1.js");
config.setModuleUrl("foo/1", "a/b1.js");
url = config.moduleUrl("foo/1", "theme");
assert.equal(url, "a/b1.js");
assert.equal();
}
};
});
if (typeof module !== "undefined" && module === require.main) {
require("asyncjs").test.testcase(module.exports).exec()
}

View file

@ -1,7 +1,7 @@
.ace_editor {
position: absolute;
overflow: hidden;
font-family: 'Menlo', 'Monaco', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;
font-size: 12px;
}
@ -148,10 +148,22 @@
box-sizing: border-box;
}
.ace_cursor.ace_hidden {
.ace_hidden-cursors .ace_cursor {
opacity: 0.2;
}
.ace_smooth-blinking .ace_cursor {
-moz-transition: opacity 0.18s;
-webkit-transition: opacity 0.18s;
-o-transition: opacity 0.18s;
-ms-transition: opacity 0.18s;
transition: opacity 0.18s;
}
.ace_cursor[style*="opacity: 0"]{
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";
}
.ace_editor.ace_multiselect .ace_cursor {
border-left-width: 1px;
}

View file

@ -375,14 +375,7 @@ var EditSession = function(text, mode) {
token.start = c - token.value.length;
return token;
};
this.highlight = function(re) {
if (!this.$searchHighlight) {
var highlight = new SearchHighlight(null, "ace_selected-word", "text");
this.$searchHighlight = this.addDynamicMarker(highlight);
}
this.$searchHighlight.setRegexp(re);
}
/**
* EditSession.setUndoManager(undoManager)
* - undoManager (UndoManager): The new undo manager
@ -736,6 +729,30 @@ var EditSession = function(text, mode) {
return inFront ? this.$frontMarkers : this.$backMarkers;
};
this.highlight = function(re) {
if (!this.$searchHighlight) {
var highlight = new SearchHighlight(null, "ace_selected-word", "text");
this.$searchHighlight = this.addDynamicMarker(highlight);
}
this.$searchHighlight.setRegexp(re);
}
// experimental
this.highlightLines = function(startRow, endRow, clazz, inFront) {
if (typeof endRow != "number") {
clazz = endRow;
endRow = startRow;
}
if (!clazz)
clazz = "ace_step";
var range = new Range(startRow, 0, endRow, Infinity);
var id = this.addMarker(range, clazz, "fullLine", inFront);
range.id = id;
return range;
},
/*
* Error:
* {

View file

@ -481,28 +481,24 @@ var Editor = function(renderer, session) {
this.$updateHighlightActiveLine = function() {
var session = this.getSession();
if (session.$highlightLineMarker)
session.removeMarker(session.$highlightLineMarker);
session.$highlightLineMarker = null;
var highlight;
if (this.$highlightActiveLine) {
var cursor = this.getCursorPosition();
var foldLine = this.session.getFoldLine(cursor.row);
if ((this.$selectionStyle != "line" || !this.selection.isMultiLine()))
highlight = this.getCursorPosition();
}
if ((this.getSelectionStyle() != "line" || !this.selection.isMultiLine())) {
var range;
if (foldLine) {
range = new Range(foldLine.start.row, 0, foldLine.end.row + 1, 0);
} else {
range = new Range(cursor.row, 0, cursor.row+1, 0);
}
session.$highlightLineMarker = session.addMarker(range, "ace_active-line", "background");
}
if (session.$highlightLineMarker && !highlight) {
session.removeMarker(session.$highlightLineMarker.id);
session.$highlightLineMarker = null;
} else if (!session.$highlightLineMarker && highlight) {
session.$highlightLineMarker = session.highlightLines(highlight.row, highlight.row, "ace_active-line");
} else if (highlight) {
session.$highlightLineMarker.start.row = highlight.row;
session.$highlightLineMarker.end.row = highlight.row;
session._emit("changeBackMarker");
}
};
this.onSelectionChange = function(e) {
var session = this.session;
@ -656,6 +652,11 @@ var Editor = function(renderer, session) {
this.insert(text);
};
this.execCommand = function(command, args) {
this.commands.exec(command, this, args);
};
/**
* Editor.insert(text)
* - text (String): The new text to add
@ -1276,10 +1277,35 @@ var Editor = function(renderer, session) {
this.session.outdentRows(selection.getRange());
};
// TODO: move out of core when we have good mechanism for managing extensions
this.sortLines = function() {
var rows = this.$getSelectedRows();
var session = this.session;
var lines = [];
for (i = rows.first; i <= rows.last; i++)
lines.push(session.getLine(i));
lines.sort(function(a, b) {
if (a.toLowerCase() < b.toLowerCase()) return -1;
if (a.toLowerCase() > b.toLowerCase()) return 1;
return 0;
});
var deleteRange = new Range(0, 0, 0, 0);
for (var i = rows.first; i <= rows.last; i++) {
var line = session.getLine(i);
deleteRange.start.row = i;
deleteRange.end.row = i;
deleteRange.end.column = line.length;
session.replace(deleteRange, lines[i-rows.first]);
}
};
/**
* Editor.toggleCommentLines()
*
* Given the currently selected range, this function either comments all lines or uncomments all lines (depending on whether it's commented or not).
* Given the currently selected range, this function either comments all the lines, or uncomments all of them.
**/
this.toggleCommentLines = function() {
var state = this.session.getState(this.getCursorPosition().row);
@ -1287,6 +1313,78 @@ var Editor = function(renderer, session) {
this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);
};
/**
* Editor.getNumberAt() -> Number
*
* Works like [[Editor.getTokenAt]], except it returns a number.
**/
this.getNumberAt = function( row, column ) {
var _numberRx = /[\-]?[0-9]+(?:\.[0-9]+)?/g
_numberRx.lastIndex = 0
var s = this.session.getLine(row)
while(_numberRx.lastIndex < column - 1 ){
var m = _numberRx.exec(s)
if(m.index <= column && m.index+m[0].length >= column){
var number = {
value: m[0],
start: m.index,
end: m.index+m[0].length
}
return number
}
}
return null;
};
/**
* Editor.modifyNumber(amount)
* - amount (Number): The value to change the numeral by (can be negative to decrease value)
*
* If the character before the cursor is a number, this functions changes its value by `amount`.
**/
this.modifyNumber = function(amount) {
var row = this.selection.getCursor().row;
var column = this.selection.getCursor().column;
// get the char before the cursor
var charRange = new Range(row, column-1, row, column);
var c = this.session.getTextRange(charRange);
// if the char is a digit
if (!isNaN(parseFloat(c)) && isFinite(c)) {
// get the whole number the digit is part of
var nr = this.getNumberAt(row, column);
// if number found
if (nr) {
var fp = nr.value.indexOf(".") >= 0 ? nr.start + nr.value.indexOf(".") + 1 : nr.end;
var decimals = nr.start + nr.value.length - fp;
var t = parseFloat(nr.value);
t *= Math.pow(10, decimals);
if(fp !== nr.end && column < fp){
amount *= Math.pow(10, nr.end - column - 1);
} else {
amount *= Math.pow(10, nr.end - column);
}
t += amount;
t /= Math.pow(10, decimals);
var nnr = t.toFixed(decimals);
//update number
var replaceRange = new Range(row, nr.start, row, nr.end);
this.session.replace(replaceRange, nnr);
//reposition the cursor
this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));
}
}
};
/** related to: EditSession.remove
* Editor.removeLines()
*
@ -1308,20 +1406,20 @@ var Editor = function(renderer, session) {
this.duplicateSelection = function() {
var sel = this.selection;
var doc = this.session;
var range = sel.getRange();
if (range.isEmpty()) {
var row = range.start.row;
doc.duplicateLines(row, row);
} else {
var reverse = sel.isBackwards()
var point = sel.isBackwards() ? range.start : range.end;
var endPoint = doc.insert(point, doc.getTextRange(range), false);
range.start = point;
range.end = endPoint;
sel.setSelectionRange(range, reverse)
}
var doc = this.session;
var range = sel.getRange();
if (range.isEmpty()) {
var row = range.start.row;
doc.duplicateLines(row, row);
} else {
var reverse = sel.isBackwards()
var point = sel.isBackwards() ? range.start : range.end;
var endPoint = doc.insert(point, doc.getTextRange(range), false);
range.start = point;
range.end = endPoint;
sel.setSelectionRange(range, reverse)
}
};
/** related to: EditSession.moveLinesDown

View file

@ -36,7 +36,7 @@ var UA = require("../lib/useragent");
var net = require("../lib/net");
var ace = require("../ace");
require("ace/theme/textmate");
require("../theme/textmate");
module.exports = exports = ace;

View file

@ -66,7 +66,7 @@ exports.handler.attach = function(editor) {
opacity: 1;\
background-color: transparent;\
}\
.emacs-mode .ace_cursor.ace_overwrite {\
.emacs-mode .ace_overwrite-cursors .ace_cursor {\
opacity: 1;\
background-color: transparent;\
border-width: 0 0 2px 2px !important;\

View file

@ -298,7 +298,7 @@ var TextInput = function(parentNode, host) {
host.renderer.$keepTextAreaAtCursor = null;
// on windows context menu is opened after mouseup
if (useragent.isWin && (useragent.isGecko || useragent.isIE))
if (useragent.isWin)
event.capture(host.container, function(e) {
text.style.left = e.clientX - 2 + "px";
text.style.top = e.clientY - 2 + "px";

View file

@ -127,7 +127,7 @@ var StringStream = function(editor, cursor) {
};
};
var Search = require("ace/search").Search;
var Search = require("../../../search").Search;
var search = new Search();
function find(editor, needle, dir) {
@ -136,7 +136,7 @@ function find(editor, needle, dir) {
return search.find(editor.session);
}
var Range = require("ace/range").Range;
var Range = require("../../../range").Range;
module.exports = {
"w": new Motion(function(editor) {

View file

@ -40,9 +40,12 @@ var Cursor = function(parentEl) {
this.isVisible = false;
this.isBlinking = true;
this.blinkInterval = 1000;
this.smoothBlinking = false;
this.cursors = [];
this.cursor = this.addCursor();
dom.addCssClass(this.element, "ace_hidden-cursors");
};
(function() {
@ -57,20 +60,33 @@ var Cursor = function(parentEl) {
};
this.setBlinking = function(blinking) {
this.isBlinking = blinking;
if (blinking)
if (blinking != this.isBlinking){
this.isBlinking = blinking;
this.restartTimer();
}
};
this.setBlinkInterval = function(blinkInterval) {
if (blinkInterval != this.blinkInterval){
this.blinkInterval = blinkInterval;
this.restartTimer();
}
};
this.setSmoothBlinking = function(smoothBlinking) {
if (smoothBlinking != this.smoothBlinking) {
this.smoothBlinking = smoothBlinking;
if (smoothBlinking)
dom.addCssClass(this.element, "ace_smooth-blinking");
else
dom.removeCssClass(this.element, "ace_smooth-blinking");
this.restartTimer();
}
};
this.addCursor = function() {
var el = dom.createElement("div");
var className = "ace_cursor";
if (!this.isVisible)
className += " ace_hidden";
if (this.overwrite)
className += " ace_overwrite";
el.className = className;
el.className = "ace_cursor";
this.element.appendChild(el);
this.cursors.push(el);
return el;
@ -86,118 +102,113 @@ var Cursor = function(parentEl) {
this.hideCursor = function() {
this.isVisible = false;
for (var i = this.cursors.length; i--; )
dom.addCssClass(this.cursors[i], "ace_hidden");
clearInterval(this.blinkId);
dom.addCssClass(this.element, "ace_hidden-cursors");
this.restartTimer();
};
this.showCursor = function() {
this.isVisible = true;
for (var i = this.cursors.length; i--; )
dom.removeCssClass(this.cursors[i], "ace_hidden");
this.element.style.visibility = "";
dom.removeCssClass(this.element, "ace_hidden-cursors");
this.restartTimer();
};
this.restartTimer = function() {
clearInterval(this.blinkId);
if (!this.isBlinking)
return;
if (!this.isVisible)
clearInterval(this.intervalId);
clearTimeout(this.timeoutId);
if (this.smoothBlinking)
dom.removeCssClass(this.element, "ace_smooth-blinking");
for (var i = this.cursors.length; i--; )
this.cursors[i].style.opacity = "";
if (!this.isBlinking || !this.blinkInterval || !this.isVisible)
return;
var element = this.cursors.length == 1 ? this.cursor : this.element;
this.blinkId = setInterval(function() {
element.style.visibility = "hidden";
setTimeout(function() {
element.style.visibility = "";
}, 400);
}, 1000);
if (this.smoothBlinking)
setTimeout(function(){
dom.addCssClass(this.element, "ace_smooth-blinking");
}.bind(this));
var blink = function(){
this.timeoutId = setTimeout(function() {
for (var i = this.cursors.length; i--; ) {
this.cursors[i].style.opacity = 0;
}
}.bind(this), 0.6 * this.blinkInterval);
}.bind(this);
this.intervalId = setInterval(function() {
for (var i = this.cursors.length; i--; ) {
this.cursors[i].style.opacity = "";
}
blink();
}.bind(this), this.blinkInterval);
blink();
};
this.getPixelPosition = function(position, onScreen) {
if (!this.config || !this.session) {
return {
left : 0,
top : 0
};
}
if (!this.config || !this.session)
return {left : 0, top : 0};
if (!position)
position = this.session.selection.getCursor();
var pos = this.session.documentToScreenPosition(position);
var cursorLeft = Math.round(this.$padding +
pos.column * this.config.characterWidth);
var cursorLeft = this.$padding + pos.column * this.config.characterWidth;
var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *
this.config.lineHeight;
return {
left : cursorLeft,
top : cursorTop
};
return {left : cursorLeft, top : cursorTop};
};
this.update = function(config) {
this.config = config;
if (this.session.selectionMarkerCount > 0) {
var selections = this.session.$selectionMarkers;
var i = 0, sel, cursorIndex = 0;
var selections = this.session.$selectionMarkers;
var i = 0, cursorIndex = 0;
for (var i = selections.length; i--; ) {
sel = selections[i];
var pixelPos = this.getPixelPosition(sel.cursor, true);
if ((pixelPos.top > config.height + config.offset ||
pixelPos.top < -config.offset) && i > 1) {
continue;
}
if (selections === undefined || selections.length === 0){
selections = [{cursor: null}];
}
var style = (this.cursors[cursorIndex++] || this.addCursor()).style;
style.left = pixelPos.left + "px";
style.top = pixelPos.top + "px";
style.width = config.characterWidth + "px";
style.height = config.lineHeight + "px";
for (var i = selections.length; i--; ) {
var pixelPos = this.getPixelPosition(selections[i].cursor, true);
if ((pixelPos.top > config.height + config.offset ||
pixelPos.top < -config.offset) && i > 1) {
continue;
}
if (cursorIndex > 1)
while (this.cursors.length > cursorIndex)
this.removeCursor();
} else {
var pixelPos = this.getPixelPosition(null, true);
var style = this.cursor.style;
var style = (this.cursors[cursorIndex++] || this.addCursor()).style;
style.left = pixelPos.left + "px";
style.top = pixelPos.top + "px";
style.width = config.characterWidth + "px";
style.height = config.lineHeight + "px";
while (this.cursors.length > 1)
this.removeCursor();
}
while (this.cursors.length > cursorIndex)
this.removeCursor();
var overwrite = this.session.getOverwrite();
if (overwrite != this.overwrite)
this.$setOverwrite(overwrite);
this.$setOverwrite(overwrite);
// cache for textarea and gutter highlight
this.$pixelPos = pixelPos;
this.restartTimer();
};
this.$setOverwrite = function(overwrite) {
this.overwrite = overwrite;
for (var i = this.cursors.length; i--; ) {
if (overwrite != this.overwrite) {
this.overwrite = overwrite;
if (overwrite)
dom.addCssClass(this.cursors[i], "ace_overwrite");
dom.addCssClass(this.element, "ace_overwrite-cursors");
else
dom.removeCssClass(this.cursors[i], "ace_overwrite");
dom.removeCssClass(this.element, "ace_overwrite-cursors");
}
};
this.destroy = function() {
clearInterval(this.blinkId);
}
clearInterval(this.intervalId);
clearTimeout(this.timeoutId);
};
}).call(Cursor.prototype);

View file

@ -78,26 +78,20 @@ var Marker = function(parentEl) {
range = range.toScreenRange(this.session);
if (marker.renderer) {
var top = this.$getTop(range.start.row, config);
var left = Math.round(
this.$padding + range.start.column * config.characterWidth
);
var left = this.$padding + range.start.column * config.characterWidth;
marker.renderer(html, range, left, top, config);
}
if (marker.type == "fullLine") {
this.drawFullLineMarker(html, range, marker.clazz, config);
}
else if (range.isMultiLine()) {
if (marker.type == "text") {
if (marker.type == "text")
this.drawTextMarker(html, range, marker.clazz, config);
} else {
this.drawMultiLineMarker(
html, range, marker.clazz, config,
marker.type
);
}
else
this.drawMultiLineMarker(html, range, marker.clazz, config);
}
else {
this.drawSingleLineMarker(
html, range, marker.clazz + " ace_start", config,
null, marker.type
);
this.drawSingleLineMarker(html, range, marker.clazz + " ace_start", config);
}
}
this.element = dom.setInnerHtml(this.element, html.join(""));
@ -133,11 +127,11 @@ var Marker = function(parentEl) {
// Draws a multi line marker, where lines span the full width
this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, type) {
var padding = type === "background" ? 0 : this.$padding;
// from selection start to the end of the line
var padding = this.$padding;
var height = config.lineHeight;
var top = this.$getTop(range.start.row, config);
var left = Math.round(padding + range.start.column * config.characterWidth);
var left = padding + range.start.column * config.characterWidth;
stringBuilder.push(
"<div class='", clazz, " ace_start' style='",
@ -149,7 +143,7 @@ var Marker = function(parentEl) {
// from start of the last line to the selection end
top = this.$getTop(range.end.row, config);
var width = Math.round(range.end.column * config.characterWidth);
var width = range.end.column * config.characterWidth;
stringBuilder.push(
"<div class='", clazz, "' style='",
@ -175,19 +169,12 @@ var Marker = function(parentEl) {
};
// Draws a marker which covers part or whole width of a single screen line
this.drawSingleLineMarker = function(stringBuilder, range, clazz, layerConfig, extraLength, type) {
var padding = type === "background" ? 0 : this.$padding;
var height = layerConfig.lineHeight;
this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength) {
var height = config.lineHeight;
var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;
if (type === "background")
var width = layerConfig.width;
else
width = Math.round((range.end.column + (extraLength || 0) - range.start.column) * layerConfig.characterWidth);
var top = this.$getTop(range.start.row, layerConfig);
var left = Math.round(
padding + range.start.column * layerConfig.characterWidth
);
var top = this.$getTop(range.start.row, config);
var left = this.$padding + range.start.column * config.characterWidth;
stringBuilder.push(
"<div class='", clazz, "' style='",
@ -198,6 +185,20 @@ var Marker = function(parentEl) {
);
};
this.drawFullLineMarker = function(stringBuilder, range, clazz, config) {
var top = this.$getTop(range.start.row, config);
var height = config.lineHeight;
if (range.start.row != range.end.row)
height += this.$getTop(range.end.row, config) - top;
stringBuilder.push(
"<div class='", clazz, "' style='",
"height:", height, "px;",
"top:", top, "px;",
"left:0;right:0;'></div>"
);
}
}).call(Marker.prototype);
exports.Marker = Marker;

View file

@ -543,10 +543,33 @@ if (!Object.getOwnPropertyNames) {
// ES5 15.2.3.5
// http://es5.github.com/#x15.2.3.5
if (!Object.create) {
var createEmpty;
if (Object.prototype.__proto__ === null) {
createEmpty = function () {
return { "__proto__": null };
};
} else {
// In old IE __proto__ can't be used to manually set `null`
createEmpty = function () {
var empty = {};
for (var i in empty)
empty[i] = null;
empty.constructor =
empty.hasOwnProperty =
empty.propertyIsEnumerable =
empty.isPrototypeOf =
empty.toLocaleString =
empty.toString =
empty.valueOf =
empty.__proto__ = null;
return empty;
}
}
Object.create = function create(prototype, properties) {
var object;
if (prototype === null) {
object = { "__proto__": null };
object = createEmpty();
} else {
if (typeof prototype != "object")
throw new TypeError("typeof prototype["+(typeof prototype)+"] != 'object'");

View file

@ -33,19 +33,70 @@ define(function(require, exports, module) {
var oop = require("../../lib/oop");
var Behaviour = require("../behaviour").Behaviour;
var TokenIterator = require("../../token_iterator").TokenIterator;
var autoInsertedBrackets = 0;
var autoInsertedRow = -1;
var autoInsertedLineEnd = "";
var CstyleBehaviour = function () {
CstyleBehaviour.isSaneInsertion = function(editor, session) {
var cursor = editor.getCursorPosition();
var iterator = new TokenIterator(session, cursor.row, cursor.column);
// Don't insert in the middle of a keyword/identifier/lexical
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", ["text", "paren.rparen"])) {
// Look ahead in case we're at the end of a token
iterator = new TokenIterator(session, cursor.row, cursor.column + 1);
if (!this.$matchTokenType(iterator.getCurrentToken() || "text", ["text", "paren.rparen"]))
return false;
}
// Only insert in front of whitespace/comments
iterator.stepForward();
return iterator.getCurrentTokenRow() !== cursor.row ||
this.$matchTokenType(iterator.getCurrentToken() || "text", ["text", "comment", "paren.rparen"]);
};
CstyleBehaviour.$matchTokenType = function(token, types) {
return types.indexOf(token.type || token) > -1;
};
CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {
var cursor = editor.getCursorPosition();
var line = session.doc.getLine(cursor.row);
// Reset previous state if text or context changed too much
if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))
autoInsertedBrackets = 0;
autoInsertedRow = cursor.row;
autoInsertedLineEnd = bracket + line.substr(cursor.column);
autoInsertedBrackets++;
};
CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {
return autoInsertedBrackets > 0 &&
cursor.row === autoInsertedRow &&
bracket === autoInsertedLineEnd[0] &&
line.substr(cursor.column) === autoInsertedLineEnd;
};
CstyleBehaviour.popAutoInsertedClosing = function() {
autoInsertedLineEnd = autoInsertedLineEnd.substr(1);
autoInsertedBrackets--;
};
this.add("braces", "insertion", function (state, action, editor, session, text) {
if (text == '{') {
var selection = editor.getSelectionRange();
var selected = session.doc.getTextRange(selection);
if (selected !== "") {
if (selected !== "" && selected !== "{") {
return {
text: '{' + selected + '}',
selection: false
};
} else {
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
CstyleBehaviour.recordAutoInsert(editor, session, "}");
return {
text: '{}',
selection: [1, 1]
@ -57,7 +108,8 @@ var CstyleBehaviour = function () {
var rightChar = line.substring(cursor.column, cursor.column + 1);
if (rightChar == '}') {
var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});
if (matching !== null) {
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
CstyleBehaviour.popAutoInsertedClosing();
return {
text: '',
selection: [1, 1]
@ -105,7 +157,8 @@ var CstyleBehaviour = function () {
text: '(' + selected + ')',
selection: false
};
} else {
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
CstyleBehaviour.recordAutoInsert(editor, session, ")");
return {
text: '()',
selection: [1, 1]
@ -117,7 +170,8 @@ var CstyleBehaviour = function () {
var rightChar = line.substring(cursor.column, cursor.column + 1);
if (rightChar == ')') {
var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});
if (matching !== null) {
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
CstyleBehaviour.popAutoInsertedClosing();
return {
text: '',
selection: [1, 1]
@ -148,7 +202,8 @@ var CstyleBehaviour = function () {
text: '[' + selected + ']',
selection: false
};
} else {
} else if (CstyleBehaviour.isSaneInsertion(editor, session)) {
CstyleBehaviour.recordAutoInsert(editor, session, "]");
return {
text: '[]',
selection: [1, 1]
@ -160,7 +215,8 @@ var CstyleBehaviour = function () {
var rightChar = line.substring(cursor.column, cursor.column + 1);
if (rightChar == ']') {
var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});
if (matching !== null) {
if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {
CstyleBehaviour.popAutoInsertedClosing();
return {
text: '',
selection: [1, 1]

View file

@ -40,8 +40,8 @@ var oop = require("../lib/oop");
var TextMode = require("./text").Mode;
var Tokenizer = require("../tokenizer").Tokenizer;
var JadeHighlightRules = require("./jade_highlight_rules").JadeHighlightRules;
// var JavascriptMode = require("ace/mode/javascript").Mode;
// var CssMode = require("ace/mode/css").Mode;
// var JavascriptMode = require("../mode/javascript").Mode;
// var CssMode = require("../mode/css").Mode;
var Mode = function() {
var highlighter = new JadeHighlightRules();

View file

@ -37,7 +37,7 @@ var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
var SqlHighlightRules = function() {
var keywords = (
"select|from|where|and|or|group|by|order|limit|offset|having|as|case|" +
"select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|" +
"when|else|end|type|left|right|join|on|outer|desc|asc"
);

View file

@ -30,7 +30,7 @@
define(function(require, exports, module) {
"use strict";
var Range = require('./range').Range;
var Range = require("./range").Range;
var EventEmitter = require("./lib/event_emitter").EventEmitter;
var oop = require("./lib/oop");

View file

@ -41,8 +41,8 @@ var Editor = require("./editor").Editor;
var MockRenderer = require("./test/mockrenderer").MockRenderer;
var assert = require("./test/assertions");
var JavaScriptMode = require("./mode/javascript").Mode;
var PlaceHolder = require('./placeholder').PlaceHolder;
var UndoManager = require('./undomanager').UndoManager;
var PlaceHolder = require("./placeholder").PlaceHolder;
var UndoManager = require("./undomanager").UndoManager;
module.exports = {

View file

@ -44,7 +44,7 @@ define(function (require, exports, module) {
if (globalRequire && globalRequire.nodeRequire)
onLoad(globalRequire.nodeRequire('fs').readFileSync(req.toUrl(name), 'utf8'));
else
require("ace/lib/net").get(req.toUrl(name), onLoad);
require("../lib/net").get(req.toUrl(name), onLoad);
};
});

View file

@ -66,7 +66,7 @@
border-left: 1px solid #7991E8;
}
.ace-ambiance .ace_cursor.ace_overwrite {
.ace-ambiance .ace_overwrite-cursors .ace_cursor {
border: 1px solid #FFE300;
background: #766B13;
}

View file

@ -25,7 +25,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-ambiance";
exports.cssText = require("ace/requirejs/text!./ambiance.css");
exports.cssText = require("../requirejs/text!./ambiance.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -17,7 +17,7 @@
border-left: 2px solid black;
}
.ace-chrome .ace_cursor.ace_overwrite {
.ace-chrome .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid black;
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-chrome";
exports.cssText = require('ace/requirejs/text!./chrome.css');
exports.cssText = require("../requirejs/text!./chrome.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #000000
}
.ace-clouds .ace_cursor.ace_overwrite {
.ace-clouds .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #000000
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-clouds";
exports.cssText = require('ace/requirejs/text!./clouds.css');
exports.cssText = require("../requirejs/text!./clouds.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #7DA5DC
}
.ace-clouds-midnight .ace_cursor.ace_overwrite {
.ace-clouds-midnight .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #7DA5DC
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-clouds-midnight";
exports.cssText = require('ace/requirejs/text!./clouds_midnight.css');
exports.cssText = require("../requirejs/text!./clouds_midnight.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #FFFFFF
}
.ace-cobalt .ace_cursor.ace_overwrite {
.ace-cobalt .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FFFFFF
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-cobalt";
exports.cssText = require('ace/requirejs/text!./cobalt.css');
exports.cssText = require("../requirejs/text!./cobalt.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -26,7 +26,7 @@
border-left: 2px solid black;
}
.ace-crimson-editor .ace_cursor.ace_overwrite {
.ace-crimson-editor .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid black;
}

View file

@ -30,7 +30,7 @@
define(function(require, exports, module) {
exports.isDark = false;
exports.cssText = require('ace/requirejs/text!./crimson_editor.css');
exports.cssText = require("../requirejs/text!./crimson_editor.css");
exports.cssClass = "ace-crimson-editor";

View file

@ -20,7 +20,7 @@
border-left: 2px solid #000000
}
.ace-dawn .ace_cursor.ace_overwrite {
.ace-dawn .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #000000
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-dawn";
exports.cssText = require('ace/requirejs/text!./dawn.css');
exports.cssText = require("../requirejs/text!./dawn.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -23,7 +23,7 @@
border-left: 2px solid black;
}
.ace-dreamweaver .ace_cursor.ace_overwrite {
.ace-dreamweaver .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid black;
}

View file

@ -31,7 +31,7 @@
define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-dreamweaver";
exports.cssText = require('ace/requirejs/text!./dreamweaver.css');
exports.cssText = require("../requirejs/text!./dreamweaver.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
"use strict";
exports.isDark = false;
exports.cssText = require('ace/requirejs/text!./eclipse.css');
exports.cssText = require("../requirejs/text!./eclipse.css");
exports.cssClass = "ace-eclipse";

View file

@ -70,7 +70,7 @@
border-left: 2px solid black;
}
.ace-github .ace_cursor.ace_overwrite {
.ace-github .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid black;
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-github";
exports.cssText = require('ace/requirejs/text!./github.css');
exports.cssText = require("../requirejs/text!./github.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #91FF00
}
.ace-idle-fingers .ace_cursor.ace_overwrite {
.ace-idle-fingers .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #91FF00
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-idle-fingers";
exports.cssText = require('ace/requirejs/text!./idle_fingers.css');
exports.cssText = require("../requirejs/text!./idle_fingers.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #FF9900
}
.ace-kr-theme .ace_cursor.ace_overwrite {
.ace-kr-theme .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FF9900
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-kr-theme";
exports.cssText = require('ace/requirejs/text!./kr_theme.css');
exports.cssText = require("../requirejs/text!./kr_theme.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #FFFFFF
}
.ace-merbivore .ace_cursor.ace_overwrite {
.ace-merbivore .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FFFFFF
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-merbivore";
exports.cssText = require('ace/requirejs/text!./merbivore.css');
exports.cssText = require("../requirejs/text!./merbivore.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #FFFFFF
}
.ace-merbivore-soft .ace_cursor.ace_overwrite {
.ace-merbivore-soft .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FFFFFF
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-merbivore-soft";
exports.cssText = require('ace/requirejs/text!./merbivore_soft.css');
exports.cssText = require("../requirejs/text!./merbivore_soft.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #FFFFFF
}
.ace-mono-industrial .ace_cursor.ace_overwrite {
.ace-mono-industrial .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FFFFFF
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-mono-industrial";
exports.cssText = require('ace/requirejs/text!./mono_industrial.css');
exports.cssText = require("../requirejs/text!./mono_industrial.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #F8F8F0
}
.ace-monokai .ace_cursor.ace_overwrite {
.ace-monokai .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #F8F8F0
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-monokai";
exports.cssText = require('ace/requirejs/text!./monokai.css');
exports.cssText = require("../requirejs/text!./monokai.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #A7A7A7
}
.ace-pastel-on-dark .ace_cursor.ace_overwrite {
.ace-pastel-on-dark .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #A7A7A7
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-pastel-on-dark";
exports.cssText = require('ace/requirejs/text!./pastel_on_dark.css');
exports.cssText = require("../requirejs/text!./pastel_on_dark.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -22,7 +22,7 @@
border-left: 2px solid #D30102
}
.ace-solarized-dark .ace_cursor.ace_overwrite {
.ace-solarized-dark .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #D30102
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-solarized-dark";
exports.cssText = require('ace/requirejs/text!./solarized_dark.css');
exports.cssText = require("../requirejs/text!./solarized_dark.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #000000
}
.ace-solarized-light .ace_cursor.ace_overwrite {
.ace-solarized-light .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #000000
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-solarized-light";
exports.cssText = require('ace/requirejs/text!./solarized_light.css');
exports.cssText = require("../requirejs/text!./solarized_light.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid black;
}
.ace-tm .ace_cursor.ace_overwrite {
.ace-tm .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid black;
}

View file

@ -33,7 +33,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-tm";
exports.cssText = require('ace/requirejs/text!./textmate.css');
exports.cssText = require("../requirejs/text!./textmate.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #AEAFAD
}
.ace-tomorrow .ace_cursor.ace_overwrite {
.ace-tomorrow .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #AEAFAD
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-tomorrow";
exports.cssText = require('ace/requirejs/text!./tomorrow.css');
exports.cssText = require("../requirejs/text!./tomorrow.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #AEAFAD
}
.ace-tomorrow-night .ace_cursor.ace_overwrite {
.ace-tomorrow-night .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #AEAFAD
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-tomorrow-night";
exports.cssText = require('ace/requirejs/text!./tomorrow_night.css');
exports.cssText = require("../requirejs/text!./tomorrow_night.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -21,7 +21,7 @@
border-left: 2px solid #FFFFFF
}
.ace-tomorrow-night-blue .ace_cursor.ace_overwrite {
.ace-tomorrow-night-blue .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FFFFFF
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-tomorrow-night-blue";
exports.cssText = require('ace/requirejs/text!./tomorrow_night_blue.css');
exports.cssText = require("../requirejs/text!./tomorrow_night_blue.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #9F9F9F
}
.ace-tomorrow-night-bright .ace_cursor.ace_overwrite {
.ace-tomorrow-night-bright .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #9F9F9F
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-tomorrow-night-bright";
exports.cssText = require('ace/requirejs/text!./tomorrow_night_bright.css');
exports.cssText = require("../requirejs/text!./tomorrow_night_bright.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -21,7 +21,7 @@
border-left: 2px solid #CCCCCC
}
.ace-tomorrow-night-eighties .ace_cursor.ace_overwrite {
.ace-tomorrow-night-eighties .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #CCCCCC
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-tomorrow-night-eighties";
exports.cssText = require('ace/requirejs/text!./tomorrow_night_eighties.css');
exports.cssText = require("../requirejs/text!./tomorrow_night_eighties.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #A7A7A7
}
.ace-twilight .ace_cursor.ace_overwrite {
.ace-twilight .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #A7A7A7
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-twilight";
exports.cssText = require('ace/requirejs/text!./twilight.css');
exports.cssText = require("../requirejs/text!./twilight.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -20,7 +20,7 @@
border-left: 2px solid #FFFFFF
}
.ace-vibrant-ink .ace_cursor.ace_overwrite {
.ace-vibrant-ink .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #FFFFFF
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = true;
exports.cssClass = "ace-vibrant-ink";
exports.cssText = require('ace/requirejs/text!./vibrant_ink.css');
exports.cssText = require("../requirejs/text!./vibrant_ink.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -22,7 +22,7 @@
border-left: 2px solid #000000
}
.ace-xcode .ace_cursor.ace_overwrite {
.ace-xcode .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid #000000
}

View file

@ -32,7 +32,7 @@ define(function(require, exports, module) {
exports.isDark = false;
exports.cssClass = "ace-xcode";
exports.cssText = require('ace/requirejs/text!./xcode.css');
exports.cssText = require("../requirejs/text!./xcode.css");
var dom = require("../lib/dom");
dom.importCssString(exports.cssText, exports.cssClass);

View file

@ -44,7 +44,7 @@ var CursorLayer = require("./layer/cursor").Cursor;
var ScrollBar = require("./scrollbar").ScrollBar;
var RenderLoop = require("./renderloop").RenderLoop;
var EventEmitter = require("./lib/event_emitter").EventEmitter;
var editorCss = require("ace/requirejs/text!./css/editor.css");
var editorCss = require("./requirejs/text!./css/editor.css");
dom.importCssString(editorCss, "ace_editor");
@ -164,8 +164,8 @@ var VirtualRenderer = function(container, theme) {
);
this.$loop.schedule(this.CHANGE_FULL);
this.setPadding(4);
this.updateCharacterSize();
this.setPadding(4);
};
(function() {
@ -509,13 +509,11 @@ var VirtualRenderer = function(container, theme) {
};
this.$updatePrintMargin = function() {
var containerEl;
if (!this.$showPrintMargin && !this.$printMarginEl)
return;
if (!this.$printMarginEl) {
containerEl = dom.createElement("div");
var containerEl = dom.createElement("div");
containerEl.className = "ace_layer ace_print-margin-layer";
this.$printMarginEl = dom.createElement("div");
this.$printMarginEl.className = "ace_print-margin";

View file

@ -15,7 +15,7 @@
"asyncjs": "0.0.x",
"jsdom": "0.2.x",
"amd-loader": "~0.0.4",
"dryice": ""
"dryice": "0.4.7"
},
"mappings": {
"ace": "."
@ -29,7 +29,7 @@
},
"scripts": {
"test": "node lib/ace/test/all.js",
"postinstall": "node ./install.js"
"postinstall": "node ./install.js -c"
},
"config": {
"github.com/sourcemint/bundler-js/0/-meta/config/0": {

View file

@ -22,7 +22,7 @@
border-left: 2px solid %cursor%;
}
.%cssClass% .ace_cursor.ace_overwrite {
.%cssClass% .ace_overwrite-cursors .ace_cursor {
border-left: 0px;
border-bottom: 1px solid %overwrite%;
}

View file

@ -278,7 +278,7 @@ function convertTheme(name) {
var js = fillTemplate(jsTemplate, {
name: name,
css: "require('ace/requirejs/text!./" + name + ".css')", // quoteString(css), //
css: 'require("../requirejs/text!./' + name + '.css")', // quoteString(css), //
cssClass: "ace-" + hyphenate(name),
isDark: styles.isDark
});

View file

@ -19,6 +19,10 @@ var deps = [{
path: "mode/css/csslint.js",
url: "https://raw.github.com/stubbornella/csslint/master/release/csslint-node.js",
needsFixup: true
}, {
path: "../../demo/kitchen-sink/require.js",
url: "https://raw.github.com/jrburke/requirejs/master/require.js",
needsFixup: false
}]
var download = function(href, callback) {