Merge branch 'master' of github.com:ajaxorg/ace into ui/optimize-experimental
This commit is contained in:
commit
575cec571e
591 changed files with 72856 additions and 313985 deletions
5
.gitmodules
vendored
5
.gitmodules
vendored
|
|
@ -1,3 +1,6 @@
|
|||
[submodule "doc/wiki"]
|
||||
path = doc/wiki
|
||||
url = git://github.com/ajaxorg/ace.wiki.git
|
||||
url = git://github.com/ajaxorg/ace.wiki.git
|
||||
[submodule "build"]
|
||||
path = build
|
||||
url = https://github.com/ajaxorg/ace-builds.git
|
||||
|
|
|
|||
5
Makefile
5
Makefile
|
|
@ -1,6 +1,6 @@
|
|||
.PHONY : doc build clean dist
|
||||
|
||||
build:
|
||||
pre_build:
|
||||
git rev-parse HEAD > .git-ref
|
||||
mkdir -p build/src
|
||||
mkdir -p build/demo/kitchen-sink
|
||||
|
|
@ -9,7 +9,8 @@ build:
|
|||
cp -r demo/kitchen-sink/styles.css build/demo/kitchen-sink/styles.css
|
||||
cp demo/kitchen-sink/logo.png build/demo/kitchen-sink/logo.png
|
||||
cp -r doc/site/images build/textarea
|
||||
|
||||
|
||||
build: pre_build
|
||||
./Makefile.dryice.js normal
|
||||
./Makefile.dryice.js demo
|
||||
./Makefile.dryice.js bm
|
||||
|
|
|
|||
|
|
@ -38,61 +38,66 @@
|
|||
* ***** END LICENSE BLOCK ***** */
|
||||
|
||||
var fs = require("fs");
|
||||
if (!fs.existsSync)
|
||||
fs.existsSync = require("path").existsSync;
|
||||
var copy = require('dryice').copy;
|
||||
|
||||
var ACE_HOME = __dirname;
|
||||
var BUILD_DIR = "build";
|
||||
|
||||
function main(args) {
|
||||
var target = "minimal";
|
||||
if (args.length == 3) {
|
||||
target = args[2];
|
||||
// Check if 'target' contains some allowed value.
|
||||
if (target != "normal" && target != "bm" && target != "demo") {
|
||||
target = null;
|
||||
}
|
||||
}
|
||||
var type = "minimal";
|
||||
args = args.map(function(x) {
|
||||
if (x[0] == "-" && x[1] != "-")
|
||||
return "-" + x;
|
||||
return x;
|
||||
});
|
||||
|
||||
if (args[2] && (args[2][0] != "-" || args[2].indexOf("h") != -1))
|
||||
type = args[2];
|
||||
|
||||
if (target == "help") {
|
||||
console.log("--- Ace Dryice Build Tool ---");
|
||||
console.log("");
|
||||
console.log("Options:");
|
||||
console.log(" minimal Runs minimal build of Ace");
|
||||
console.log(" normal Runs embedded build of Ace");
|
||||
console.log(" demo Runs demo build of Ace");
|
||||
console.log(" bm Runs bookmarklet build of Ace");
|
||||
process.exit(0);
|
||||
}
|
||||
var i = args.indexOf("--target");
|
||||
if (i != -1 && args[i+1])
|
||||
BUILD_DIR = args[i+1];
|
||||
|
||||
var aceProject = {
|
||||
roots: [
|
||||
ACE_HOME + '/lib',
|
||||
ACE_HOME + '/demo'
|
||||
],
|
||||
textPluginPattern: /^ace\/requirejs\/text!/
|
||||
};
|
||||
|
||||
if (target == "minimal") {
|
||||
buildAce(aceProject, {
|
||||
compress: false,
|
||||
noconflict: false,
|
||||
suffix: "",
|
||||
compat: true,
|
||||
name: "ace"
|
||||
if (type == "minimal") {
|
||||
buildAce({
|
||||
compress: args.indexOf("--m") != -1,
|
||||
noconflict: args.indexOf("--nc") != -1
|
||||
});
|
||||
} else if (type == "normal") {
|
||||
ace();
|
||||
} else if (type == "demo") {
|
||||
demo();
|
||||
} else if (type == "bm") {
|
||||
bookmarklet();
|
||||
} else if (type == "full") {
|
||||
ace();
|
||||
demo();
|
||||
bookmarklet();
|
||||
}
|
||||
if (target == "normal") {
|
||||
ace(aceProject);
|
||||
}
|
||||
else if (target == "demo") {
|
||||
demo(aceProject);
|
||||
}
|
||||
else if (target == "bm") {
|
||||
bookmarklet(aceProject);
|
||||
}
|
||||
|
||||
console.log("--- Ace Dryice Build Tool ---");
|
||||
console.log("");
|
||||
console.log("Options:");
|
||||
console.log(" normal Runs embedded build of Ace");
|
||||
console.log(" demo Runs demo build of Ace");
|
||||
console.log(" bm Runs bookmarklet build of Ace");
|
||||
console.log(" full all of above");
|
||||
console.log("flags:");
|
||||
console.log(" -m minify");
|
||||
console.log(" -nc namespace require");
|
||||
console.log(" --target ./path path to build folder");
|
||||
console.log("");
|
||||
if (BUILD_DIR)
|
||||
console.log(" output generated in " + type + __dirname + "/" + BUILD_DIR)
|
||||
|
||||
process.exit(0);
|
||||
|
||||
}
|
||||
|
||||
function bookmarklet(aceProject) {
|
||||
var targetDir = "build/textarea";
|
||||
function bookmarklet() {
|
||||
var targetDir = BUILD_DIR + "/textarea";
|
||||
copy({
|
||||
source: "build_support/editor_textarea.html",
|
||||
dest: targetDir + '/editor.html'
|
||||
|
|
@ -102,56 +107,40 @@ function bookmarklet(aceProject) {
|
|||
dest: targetDir + '/style.css'
|
||||
});
|
||||
|
||||
buildAce(aceProject, {
|
||||
buildAce({
|
||||
targetDir: targetDir + "/src",
|
||||
ns: "__ace_shadowed__",
|
||||
exportModule: "ace/ext/textarea",
|
||||
compress: false,
|
||||
noconflict: true,
|
||||
suffix: ".js",
|
||||
compat: false,
|
||||
suffix: "",
|
||||
name: "ace-bookmarklet",
|
||||
workers: [],
|
||||
keybindings: []
|
||||
});
|
||||
}
|
||||
|
||||
function ace(aceProject) {
|
||||
function ace() {
|
||||
console.log('# ace ---------');
|
||||
|
||||
// uncompressed
|
||||
buildAce(aceProject, {
|
||||
buildAce({
|
||||
compress: false,
|
||||
noconflict: false,
|
||||
suffix: "-uncompressed",
|
||||
compat: true,
|
||||
name: "ace"
|
||||
noconflict: false
|
||||
});
|
||||
buildAce(aceProject, {
|
||||
buildAce({
|
||||
compress: false,
|
||||
noconflict: true,
|
||||
suffix: "-uncompressed-noconflict",
|
||||
compat: true,
|
||||
name: "ace",
|
||||
workers: []
|
||||
noconflict: true
|
||||
});
|
||||
|
||||
// compressed
|
||||
buildAce(aceProject, {
|
||||
buildAce({
|
||||
compress: true,
|
||||
noconflict: false,
|
||||
suffix: "",
|
||||
compat: true,
|
||||
name: "ace",
|
||||
workers: []
|
||||
noconflict: false
|
||||
});
|
||||
buildAce(aceProject, {
|
||||
buildAce({
|
||||
compress: true,
|
||||
noconflict: true,
|
||||
suffix: "-noconflict",
|
||||
compat: true,
|
||||
name: "ace",
|
||||
workers: []
|
||||
noconflict: true
|
||||
});
|
||||
|
||||
console.log('# ace License | Readme | Changelog ---------');
|
||||
|
|
@ -174,7 +163,7 @@ function ace(aceProject) {
|
|||
});
|
||||
}
|
||||
|
||||
function demo(aceProject) {
|
||||
function demo() {
|
||||
console.log('# kitchen sink ---------');
|
||||
|
||||
var version, ref;
|
||||
|
|
@ -185,74 +174,111 @@ function demo(aceProject) {
|
|||
ref = "";
|
||||
version = "";
|
||||
}
|
||||
|
||||
copy({
|
||||
source: "kitchen-sink.html",
|
||||
dest: "build/kitchen-sink.html",
|
||||
filter: [ function(data) {
|
||||
var changeComments = function(data) {
|
||||
return (data
|
||||
.replace("DEVEL-->", "")
|
||||
.replace("<!--DEVEL", "")
|
||||
.replace("PACKAGE-->", "")
|
||||
.replace("<!--PACKAGE", "")
|
||||
.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)
|
||||
);
|
||||
}
|
||||
|
||||
copy({
|
||||
source: "kitchen-sink.html",
|
||||
dest: BUILD_DIR + "/kitchen-sink.html",
|
||||
filter: [changeComments, function(data) {
|
||||
return data.replace(/"(demo|build)\//g, "\"");
|
||||
}]
|
||||
});
|
||||
|
||||
buildAce(aceProject, {
|
||||
targetDir: "build/demo/kitchen-sink",
|
||||
ns: "ace",
|
||||
requires: "kitchen-sink/demo",
|
||||
compress: false,
|
||||
noconflict: false,
|
||||
compat: false,
|
||||
name: "kitchen-sink",
|
||||
suffix: "",
|
||||
keybindings: []
|
||||
copy({
|
||||
source: "demo/kitchen-sink/styles.css",
|
||||
dest: BUILD_DIR + "/kitchen-sink/styles.css",
|
||||
filter: [ changeComments ]
|
||||
});
|
||||
|
||||
fs.readdirSync("demo/kitchen-sink/docs/").forEach(function(x) {
|
||||
copy({
|
||||
source: "demo/kitchen-sink/docs/" + x,
|
||||
dest: BUILD_DIR + "/kitchen-sink/docs/" + x
|
||||
});
|
||||
});
|
||||
|
||||
var demo = copy.createDataObject();
|
||||
copy({
|
||||
source: "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: "lib/ace/split.js",
|
||||
dest: demo,
|
||||
filter: [changeComments, function(data) {
|
||||
return data.replace("define(", "define('ace/split',");
|
||||
}]
|
||||
});
|
||||
copy({
|
||||
source: demo,
|
||||
dest: BUILD_DIR + "/kitchen-sink/demo.js",
|
||||
});
|
||||
|
||||
copyFileSync("demo/kitchen-sink/logo.png", BUILD_DIR + "/kitchen-sink/logo.png");
|
||||
}
|
||||
|
||||
function buildAce(aceProject, options) {
|
||||
function buildAce(options) {
|
||||
var aceProject = {
|
||||
roots: [ACE_HOME + '/lib', ACE_HOME + '/demo'],
|
||||
textPluginPattern: /^ace\/requirejs\/text!/
|
||||
};
|
||||
|
||||
var defaults = {
|
||||
targetDir: __dirname + "/build/src",
|
||||
targetDir: BUILD_DIR + "/src",
|
||||
ns: "ace",
|
||||
exportModule: "ace/ace",
|
||||
requires: null,
|
||||
compress: false,
|
||||
noconflict: false,
|
||||
suffix: "",
|
||||
suffix: null,
|
||||
name: "ace",
|
||||
compat: true,
|
||||
modes: [
|
||||
"css", "html", "javascript", "php", "coldfusion", "python", "lua", "xml", "ruby", "java", "c_cpp",
|
||||
"coffee", "perl", "csharp", "haxe", "liquid", "svg", "clojure", "scss", "json", "groovy",
|
||||
"ocaml", "scala", "textile", "scad", "markdown", "latex", "powershell", "sql",
|
||||
"text", "pgsql", "sh", "xquery", "less", "golang", "c9search"
|
||||
],
|
||||
themes: [
|
||||
"chrome", "clouds", "clouds_midnight", "cobalt", "crimson_editor", "dawn",
|
||||
"dreamweaver", "eclipse",
|
||||
"idle_fingers", "kr_theme", "merbivore", "merbivore_soft",
|
||||
"mono_industrial", "monokai", "pastel_on_dark", "solarized_dark",
|
||||
"solarized_light", "textmate", "tomorrow", "tomorrow_night",
|
||||
"tomorrow_night_blue", "tomorrow_night_bright", "tomorrow_night_eighties",
|
||||
"twilight", "vibrant_ink"
|
||||
],
|
||||
workers: ["javascript", "coffee", "css", "json"],
|
||||
modes: fs.readdirSync("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("lib/ace/theme").map(function(x){
|
||||
return x.slice(-3) == ".js" && x.slice(0, -3)
|
||||
}).filter(function(x){return !!x}),
|
||||
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";
|
||||
}
|
||||
|
||||
if (!options.requires)
|
||||
options.requires = [options.exportModule];
|
||||
|
||||
var filters = [copy.filter.moduleDefines, filterTextPlugin];
|
||||
var filters = [
|
||||
copy.filter.moduleDefines,
|
||||
filterTextPlugin,
|
||||
removeUseStrict,
|
||||
removeLicenceCmments
|
||||
];
|
||||
|
||||
if (options.noconflict) {
|
||||
filters.push(namespace(options.ns));
|
||||
|
|
@ -262,20 +288,10 @@ function buildAce(aceProject, options) {
|
|||
var exportFilter = exportAce(options.ns, options.exportModule);
|
||||
}
|
||||
|
||||
// remove use strict
|
||||
filters.push(function(text) {
|
||||
return text.replace(/['"]use strict['"];/g, "");
|
||||
})
|
||||
// remove redundant comments
|
||||
filters.push(function(text) {
|
||||
return text.replace(/(;)\s*\/\*[\d\D]*?\*\//g, "$1");
|
||||
})
|
||||
|
||||
if (options.compress)
|
||||
filters.push(copy.filter.uglifyjs);
|
||||
|
||||
var suffix = options.suffix;
|
||||
var targetDir = options.targetDir;
|
||||
var targetDir = options.targetDir + options.suffix;
|
||||
var name = options.name;
|
||||
|
||||
var project = copy.createCommonJsProject(aceProject);
|
||||
|
|
@ -285,12 +301,10 @@ function buildAce(aceProject, options) {
|
|||
dest: ace
|
||||
});
|
||||
copy({
|
||||
source: [
|
||||
{
|
||||
project: project,
|
||||
require: options.requires
|
||||
}
|
||||
],
|
||||
source: [{
|
||||
project: project,
|
||||
require: options.requires
|
||||
}],
|
||||
filter: [ copy.filter.moduleDefines ],
|
||||
dest: ace
|
||||
});
|
||||
|
|
@ -298,37 +312,21 @@ function buildAce(aceProject, options) {
|
|||
copy({
|
||||
source: ace,
|
||||
filter: exportFilter ? filters.concat(exportFilter) : filters,
|
||||
dest: targetDir + suffix + '/' + name + ".js"
|
||||
dest: targetDir + '/' + name + ".js"
|
||||
});
|
||||
|
||||
if (options.compat) {
|
||||
project.assumeAllFilesLoaded();
|
||||
copy({
|
||||
source: [
|
||||
{
|
||||
project: cloneProject(project),
|
||||
require: [ "pilot/index" ]
|
||||
}
|
||||
],
|
||||
filter: filters,
|
||||
dest: targetDir + suffix + "/" + name + "-compat.js"
|
||||
});
|
||||
}
|
||||
|
||||
console.log('# ace modes ---------');
|
||||
|
||||
project.assumeAllFilesLoaded();
|
||||
options.modes.forEach(function(mode) {
|
||||
console.log("mode " + mode);
|
||||
copy({
|
||||
source: [
|
||||
{
|
||||
project: cloneProject(project),
|
||||
require: [ 'ace/mode/' + mode ]
|
||||
}
|
||||
],
|
||||
source: [{
|
||||
project: cloneProject(project),
|
||||
require: [ 'ace/mode/' + mode ]
|
||||
}],
|
||||
filter: filters,
|
||||
dest: targetDir + suffix + "/mode-" + mode + ".js"
|
||||
dest: targetDir + "/mode-" + mode + ".js"
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -337,50 +335,26 @@ function buildAce(aceProject, 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 + suffix + "/theme-" + theme + ".js"
|
||||
});
|
||||
});
|
||||
|
||||
console.log('# ace worker ---------');
|
||||
|
||||
options.workers.forEach(function(mode) {
|
||||
console.log("worker for " + mode + " mode");
|
||||
var worker = copy.createDataObject();
|
||||
var workerProject = copy.createCommonJsProject({
|
||||
roots: [
|
||||
ACE_HOME + '/lib'
|
||||
],
|
||||
textPluginPattern: /^ace\/requirejs\/text!/
|
||||
});
|
||||
copy({
|
||||
source: [
|
||||
{
|
||||
project: workerProject,
|
||||
require: [
|
||||
'ace/lib/fixoldbrowsers',
|
||||
'ace/lib/event_emitter',
|
||||
'ace/lib/oop',
|
||||
'ace/mode/' + mode + '_worker'
|
||||
]
|
||||
}
|
||||
],
|
||||
filter: [ copy.filter.moduleDefines, filterTextPlugin ],
|
||||
dest: worker
|
||||
});
|
||||
copy({
|
||||
source: [
|
||||
ACE_HOME + "/lib/ace/worker/worker.js",
|
||||
worker
|
||||
],
|
||||
filter: [ /* copy.filter.uglifyjs */],
|
||||
dest: targetDir + "/worker-" + mode + ".js"
|
||||
});
|
||||
dest: targetDir + "/theme-" + theme + ".js"
|
||||
});*/
|
||||
// use this instead, to not create separate modules for js and css
|
||||
var themePath = "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);
|
||||
});
|
||||
|
||||
console.log('# ace key bindings ---------');
|
||||
|
|
@ -389,23 +363,62 @@ function buildAce(aceProject, options) {
|
|||
project.assumeAllFilesLoaded();
|
||||
options.keybindings.forEach(function(keybinding) {
|
||||
copy({
|
||||
source: [
|
||||
{
|
||||
source: [{
|
||||
project: cloneProject(project),
|
||||
require: [ 'ace/keyboard/' + keybinding ]
|
||||
}
|
||||
],
|
||||
}],
|
||||
filter: filters,
|
||||
dest: targetDir + suffix + "/keybinding-" + keybinding + ".js"
|
||||
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");
|
||||
var worker = copy.createDataObject();
|
||||
var workerProject = copy.createCommonJsProject({
|
||||
roots: [ ACE_HOME + '/lib' ],
|
||||
textPluginPattern: /^ace\/requirejs\/text!/
|
||||
});
|
||||
copy({
|
||||
source: [{
|
||||
project: workerProject,
|
||||
require: [
|
||||
'ace/lib/fixoldbrowsers',
|
||||
'ace/lib/event_emitter',
|
||||
'ace/lib/oop',
|
||||
'ace/mode/' + mode + '_worker'
|
||||
]
|
||||
}],
|
||||
filter: filters,
|
||||
dest: worker
|
||||
});
|
||||
copy({
|
||||
source: [
|
||||
ACE_HOME + "/lib/ace/worker/worker.js",
|
||||
worker
|
||||
],
|
||||
filter: options.compress ? [copy.filter.uglifyjs] : [],
|
||||
dest: targetDir + "/worker-" + mode + ".js"
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// TODO: replace with project.clone once it is fixed in dryice
|
||||
function cloneProject(project) {
|
||||
var clone = copy.createCommonJsProject({
|
||||
roots: project.roots,
|
||||
ignores: project.ignoreRequires
|
||||
ignores: project.ignoreRequires,
|
||||
textPluginPattern: project.textPluginPattern
|
||||
});
|
||||
|
||||
Object.keys(project.currentModules).forEach(function(module) {
|
||||
|
|
@ -418,11 +431,44 @@ function cloneProject(project) {
|
|||
|
||||
return clone;
|
||||
}
|
||||
function copyFileSync(srcFile, destFile) {
|
||||
var BUF_LENGTH = 64*1024,
|
||||
buf = new Buffer(BUF_LENGTH),
|
||||
bytesRead = BUF_LENGTH,
|
||||
pos = 0,
|
||||
fdr = null,
|
||||
fdw = null;
|
||||
|
||||
|
||||
fdr = fs.openSync(srcFile, 'r');
|
||||
fdw = fs.openSync(destFile, 'w');
|
||||
|
||||
while (bytesRead === BUF_LENGTH) {
|
||||
bytesRead = fs.readSync(fdr, buf, 0, BUF_LENGTH, pos);
|
||||
fs.writeSync(fdw, buf, 0, bytesRead);
|
||||
pos += bytesRead;
|
||||
}
|
||||
|
||||
fs.closeSync(fdr);
|
||||
fs.closeSync(fdw);
|
||||
}
|
||||
|
||||
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 namespace(ns) {
|
||||
return function(text) {
|
||||
text = text
|
||||
|
|
@ -442,7 +488,7 @@ function exportAce(ns, module, requireBase) {
|
|||
var template = function() {
|
||||
(function() {
|
||||
REQUIRE_NS.require(["MODULE"], function(a) {
|
||||
a.config.init();
|
||||
a && a.config.init();
|
||||
if (!window.NS)
|
||||
window.NS = {};
|
||||
for (var key in a) if (a.hasOwnProperty(key))
|
||||
|
|
|
|||
62
Readme.md
62
Readme.md
|
|
@ -10,7 +10,7 @@ Features
|
|||
* Automatic indent and outdent
|
||||
* An optional command line
|
||||
* Handles huge documents (100,000 lines and more are no problem)
|
||||
* Fully customizable key bindings including VI and Emacs modes
|
||||
* Fully customizable key bindings including VIM and Emacs modes
|
||||
* Themes (TextMate themes can be imported)
|
||||
* Search and replace with regular expressions
|
||||
* Highlight matching parentheses
|
||||
|
|
@ -18,20 +18,16 @@ Features
|
|||
* Displays hidden characters
|
||||
* Drag and drop text using the mouse
|
||||
* Line wrapping
|
||||
* Unstructured / user code folding
|
||||
* Live syntax checker (currently JavaScript/CoffeeScript)
|
||||
* Code folding
|
||||
* Multiple selections
|
||||
* Live syntax checker (currently JavaScript/CoffeeScript/Css/XQuery)
|
||||
|
||||
Take Ace for a spin!
|
||||
--------------------
|
||||
|
||||
Check out the Ace live [demo](http://ajaxorg.github.com/ace/) or get a [Cloud9 IDE account](http://run.cloud9ide.com) to experience Ace while editing one of your own GitHub projects.
|
||||
Check out the Ace live [demo](http://ajaxorg.github.com/ace-builds/kitchen-sink.html) or get a [Cloud9 IDE account](http://c9.io) to experience Ace while editing one of your own GitHub projects.
|
||||
|
||||
If you want, you can use Ace as a textarea replacement thanks to the [Ace Bookmarklet](http://ajaxorg.github.com/ace/build/textarea/editor.html).
|
||||
|
||||
History
|
||||
-------
|
||||
|
||||
Previously known as “Bespin” and “Skywriter” it’s now known as Ace (Ajax.org Cloud9 Editor)! Bespin and Ace started as two independent projects, both aiming to build a no-compromise code editor component for the web. Bespin started as part of Mozilla Labs and was based on the canvas tag, while Ace is the Editor component of the Cloud9 IDE and is using the DOM for rendering. After the release of Ace at JSConf.eu 2010 in Berlin the Skywriter team decided to merge Ace with a simplified version of Skywriter's plugin system and some of Skywriter's extensibility points. All these changes have been merged back to Ace. Both Ajax.org and Mozilla are actively developing and maintaining Ace.
|
||||
If you want, you can use Ace as a textarea replacement thanks to the [Ace Bookmarklet](http://ajaxorg.github.com/ace-builds/textarea/editor.html).
|
||||
|
||||
Getting the code
|
||||
----------------
|
||||
|
|
@ -40,14 +36,13 @@ Ace is a community project. We actively encourage and support contributions. The
|
|||
|
||||
```bash
|
||||
git clone git://github.com/ajaxorg/ace.git
|
||||
cd ace
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
Embedding Ace
|
||||
-------------
|
||||
|
||||
Ace can be easily embedded into any existing web page. The Ace git repository ships with a pre-packaged version of Ace inside of the `build` directory. The same packaged files are also available as a separate [download](https://github.com/ajaxorg/ace/downloads). Simply copy the contents of the `src` subdirectory somewhere into your project and take a look at the included demos of how to use Ace.
|
||||
Ace can be easily embedded into any existing web page. You can either use one of pre-packaged versions of [ace](https://github.com/ajaxorg/ace-builds/) (just copy one of `src*` subdirectories somewhere into your project), or use requireJS to load contents of [lib/ace](https://github.com/ajaxorg/ace/tree/master/lib/ace) as `ace`
|
||||
|
||||
|
||||
The easiest version is simply:
|
||||
|
||||
|
|
@ -55,9 +50,7 @@ The easiest version is simply:
|
|||
<div id="editor">some text</div>
|
||||
<script src="src/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||
<script>
|
||||
window.onload = function() {
|
||||
var editor = ace.edit("editor");
|
||||
};
|
||||
</script>
|
||||
```
|
||||
|
||||
|
|
@ -96,10 +89,14 @@ Then the mode can be used like this:
|
|||
editor.getSession().setMode(new JavaScriptMode());
|
||||
```
|
||||
|
||||
and take a look at the one of [included](https://github.com/ajaxorg/ace-builds/blob/master/editor.html) [demos](https://github.com/ajaxorg/ace/blob/master/demo/kitchen-sink/demo.js) of how to use Ace.
|
||||
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
You find a lot more sample code in the [demo app](https://github.com/ajaxorg/ace/blob/master/demo/demo.js).
|
||||
You can find api documentation at [http://ajaxorg.github.com/ace/api/index.html](http://ajaxorg.github.com/ace/api/index.html).
|
||||
|
||||
And a lot more sample code in the [demo app](https://github.com/ajaxorg/ace/blob/master/demo/kitchen-sink/demo.js).
|
||||
|
||||
There is also some documentation on the [wiki page](https://github.com/ajaxorg/ace/wiki).
|
||||
|
||||
|
|
@ -126,42 +123,17 @@ The editor can then be opened at http://localhost:8888/index.html.
|
|||
Package Ace
|
||||
-----------
|
||||
|
||||
To package Ace we use the dryice build tool developed by the Mozilla Skywriter team. Before you can build you need to make sure that the submodules are up to date.
|
||||
To package Ace we use the dryice build tool developed by the Mozilla Skywriter team. Make sure you at latest version of dryice
|
||||
|
||||
```bash
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
Make sure you at least version 0.3.0 of dryice
|
||||
|
||||
```bash
|
||||
npm install dryice
|
||||
```
|
||||
|
||||
Afterwards Ace can be built by calling
|
||||
|
||||
```bash
|
||||
./Makefile.dryice.js normal
|
||||
```
|
||||
|
||||
The packaged Ace will be put in the 'build' folder.
|
||||
|
||||
To build the bookmarklet version execute
|
||||
|
||||
```bash
|
||||
./Makefile.dryice.js bm
|
||||
npm install
|
||||
node ./Makefile.dryice.js ;; -m to minify, -nc to use namespaced requre, -target ./path/to/build/dir
|
||||
```
|
||||
|
||||
Running the Unit Tests
|
||||
----------------------
|
||||
|
||||
The Ace unit tests run on node.js. Before the first run a couple of node modules have to be installed. The easiest way to do this is by using the node package manager (npm). In the Ace base directory simply call
|
||||
|
||||
```bash
|
||||
npm link .
|
||||
```
|
||||
|
||||
To run the tests call:
|
||||
The Ace unit tests can run on node.js. Assuming you have already done `npm install`, just call:
|
||||
|
||||
```bash
|
||||
node lib/ace/test/all.js
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -132,28 +132,6 @@ blockquote p{
|
|||
left: 210px;
|
||||
}
|
||||
|
||||
.masthead {
|
||||
background: #101010 url(../images/dashed_back.png) repeat 0 0;
|
||||
}
|
||||
.masthead .container {
|
||||
/*width: 680px;*/
|
||||
padding-left: 285px;
|
||||
margin: 0 auto;
|
||||
color: white;
|
||||
}
|
||||
.jumbotron {
|
||||
min-width: 1000px;
|
||||
padding-top: 40px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.jumbotron .inner {
|
||||
/* background: transparent url(../images/header-back.png) top center;*/
|
||||
padding: 45px 0;
|
||||
/* -webkit-box-shadow: inset 0 10px 30px rgba(0,0,0,.3);
|
||||
-moz-box-shadow: inset 0 10px 30px rgba(0,0,0,.3);*/
|
||||
}
|
||||
|
||||
.headerTitle {
|
||||
position: relative;
|
||||
top: 100px;
|
||||
|
|
@ -545,10 +523,6 @@ header.filler {
|
|||
margin-left: 30px;
|
||||
}
|
||||
|
||||
#mainContent .hero-unit {
|
||||
background: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
#documentation {
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
|
@ -688,6 +662,7 @@ li.signature {
|
|||
.signature-call {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.signature-call a {
|
||||
color: #8e487e;
|
||||
}
|
||||
|
|
@ -777,8 +752,6 @@ li.signature {
|
|||
.table-striped tbody tr:nth-child(even) td, .table-striped tbody tr:nth-child(even) th {
|
||||
background-color: #fbfbfb;
|
||||
}
|
||||
.table-striped tbody tr:hover td, .table-striped tbody tr:hover th {
|
||||
}
|
||||
|
||||
.argument-list {
|
||||
margin-bottom : 13px;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-18736001-1']);
|
||||
_gaq.push(['_setAccount', 'UA-31998201-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
|
|
|
|||
|
|
@ -52,7 +52,6 @@ $(function () {
|
|||
// init prettyprint
|
||||
$('pre > code').addClass('prettyprint');
|
||||
prettyPrint();
|
||||
|
||||
});
|
||||
|
||||
$(document).ready(function () {
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<!DOCTYPE html><!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
|
||||
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
|
||||
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
|
|
@ -112,7 +112,7 @@
|
|||
</li>
|
||||
<li data-dropdown="dropdown" class="dropdown"><a href="#" data-toggle="dropdown" class="dropdown-toggle"><span>Functions (45)</span><b class="caret"></b></a>
|
||||
<ul class="dropdown-menu">
|
||||
<li data-id="Selection.addRange" class="memberLink"><a href="multi_select.html#Selection.addRange" class="" title="Selection.addRange (class method)" data-id="Selection.addRange">addRange</a>
|
||||
<li data-id="Selection.addRange" class="memberLink"><a href="#Selection.addRange" class="" title="Selection.addRange (class method)" data-id="Selection.addRange">addRange</a>
|
||||
</li>
|
||||
<li data-id="Selection.clearSelection" class="memberLink"><a href="#Selection.clearSelection" class="" title="Selection.clearSelection (class method)" data-id="Selection.clearSelection">clearSelection</a>
|
||||
</li>
|
||||
|
|
@ -130,7 +130,7 @@
|
|||
</li>
|
||||
<li data-id="Selection.isMultiLine" class="memberLink"><a href="#Selection.isMultiLine" class="" title="Selection.isMultiLine (class method)" data-id="Selection.isMultiLine">isMultiLine</a>
|
||||
</li>
|
||||
<li data-id="Selection.mergeOverlappingRanges" class="memberLink"><a href="multi_select.html#Selection.mergeOverlappingRanges" class="" title="Selection.mergeOverlappingRanges (class method)" data-id="Selection.mergeOverlappingRanges">mergeOverlappingRanges</a>
|
||||
<li data-id="Selection.mergeOverlappingRanges" class="memberLink"><a href="#Selection.mergeOverlappingRanges" class="" title="Selection.mergeOverlappingRanges (class method)" data-id="Selection.mergeOverlappingRanges">mergeOverlappingRanges</a>
|
||||
</li>
|
||||
<li data-id="Selection.moveCursorBy" class="memberLink"><a href="#Selection.moveCursorBy" class="" title="Selection.moveCursorBy (class method)" data-id="Selection.moveCursorBy">moveCursorBy</a>
|
||||
</li>
|
||||
|
|
@ -160,9 +160,9 @@
|
|||
</li>
|
||||
<li data-id="Selection.moveCursorUp" class="memberLink"><a href="#Selection.moveCursorUp" class="" title="Selection.moveCursorUp (class method)" data-id="Selection.moveCursorUp">moveCursorUp</a>
|
||||
</li>
|
||||
<li data-id="Selection.rectangularRangeBlock" class="memberLink"><a href="multi_select.html#Selection.rectangularRangeBlock" class="" title="Selection.rectangularRangeBlock (class method)" data-id="Selection.rectangularRangeBlock">rectangularRangeBlock</a>
|
||||
<li data-id="Selection.rectangularRangeBlock" class="memberLink"><a href="#Selection.rectangularRangeBlock" class="" title="Selection.rectangularRangeBlock (class method)" data-id="Selection.rectangularRangeBlock">rectangularRangeBlock</a>
|
||||
</li>
|
||||
<li data-id="Selection.substractPoint" class="memberLink"><a href="multi_select.html#Selection.substractPoint" class="" title="Selection.substractPoint (class method)" data-id="Selection.substractPoint">substractPoint</a>
|
||||
<li data-id="Selection.substractPoint" class="memberLink"><a href="#Selection.substractPoint" class="" title="Selection.substractPoint (class method)" data-id="Selection.substractPoint">substractPoint</a>
|
||||
</li>
|
||||
<li data-id="Selection.selectAll" class="memberLink"><a href="#Selection.selectAll" class="" title="Selection.selectAll (class method)" data-id="Selection.selectAll">selectAll</a>
|
||||
</li>
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue