diff --git a/demo/kitchen-sink/doclist.js b/demo/kitchen-sink/doclist.js
index b0198238..567c62cd 100644
--- a/demo/kitchen-sink/doclist.js
+++ b/demo/kitchen-sink/doclist.js
@@ -169,13 +169,30 @@ function loadDoc(name, callback) {
});
}
+// callback is called with the error message from PUT (if any)
+function saveDoc(name, callback) {
+ var doc = fileCache[name];
+ if (!doc || !doc.session)
+ return callback("Unknown document: " + name);
+
+ var path = doc.path;
+ var parts = path.split("/");
+ if (parts[0] == "docs")
+ path = "demo/kitchen-sink/" + path;
+ else if (parts[0] == "ace")
+ path = "lib/" + path;
+
+ net.put(path, doc.session.getValue(), callback);
+}
+
module.exports = {
fileCache: fileCache,
docs: sort(prepareDocList(docs)),
ownSource: prepareDocList(ownSource),
hugeDocs: prepareDocList(hugeDocs),
initDoc: initDoc,
- loadDoc: loadDoc
+ loadDoc: loadDoc,
+ saveDoc: saveDoc,
};
module.exports.all = {
"Mode Examples": module.exports.docs,
diff --git a/lib/ace/lib/net.js b/lib/ace/lib/net.js
index bba76df8..4c07ec2b 100644
--- a/lib/ace/lib/net.js
+++ b/lib/ace/lib/net.js
@@ -22,6 +22,19 @@ exports.get = function (url, callback) {
xhr.send(null);
};
+exports.put = function (url, data, callback) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('PUT', url, true);
+ xhr.onreadystatechange = function () {
+ //Do not explicitly handle errors, those should be
+ //visible via console output in the browser.
+ if (xhr.readyState === 4) {
+ callback(xhr.responseText);
+ }
+ };
+ xhr.send(data);
+};
+
exports.loadScript = function(path, callback) {
var head = dom.getDocumentHead();
var s = document.createElement('script');
diff --git a/tool/mode_creator.html b/tool/mode_creator.html
index e2db56af..cd6b2461 100644
--- a/tool/mode_creator.html
+++ b/tool/mode_creator.html
@@ -19,7 +19,7 @@
border-bottom: solid 1px;
}
.separator-h {
- padding: 0 20px;
+ padding: 0 10px;
}
#closeBtn {
background: rgba(245, 146, 146, 0.5);
@@ -59,6 +59,7 @@
+
@@ -70,6 +71,7 @@
+
diff --git a/tool/mode_creator.js b/tool/mode_creator.js
index 6b1122cd..ee235eca 100644
--- a/tool/mode_creator.js
+++ b/tool/mode_creator.js
@@ -53,6 +53,7 @@ util.bindDropdown("doc", function(value) {
doclist.loadDoc(value, function(session) {
if (session) {
editor2.setSession(session);
+ uploadEl2.disabled = session.getUndoManager().isClean();
}
});
});
@@ -60,6 +61,7 @@ util.bindDropdown("doc", function(value) {
var modeEl = document.getElementById("modeEl");
util.fillDropdown(modeEl, modelist.modes);
var modeSessions = {};
+var savedLeadingComments = "";
util.bindDropdown(modeEl, function(value) {
if (modeSessions[value]) {
editor1.setSession(modeSessions[value]);
@@ -68,7 +70,10 @@ util.bindDropdown(modeEl, function(value) {
}
var hp = "./lib/ace/mode/" + value + "_highlight_rules.js";
net.get(hp, function(text) {
+ uploadEl1.disabled = true;
+ savedLeadingComments = text;
text = util.stripLeadingComments(text);
+ savedLeadingComments = savedLeadingComments.substr(0, savedLeadingComments.length - text.length);
var session = new EditSession(text);
session.setUndoManager(new UndoManager());
@@ -85,6 +90,40 @@ document.getElementById("syncToMode").onclick = function() {
docEl.onchange();
run();
};
+
+var uploadEl1 = document.getElementById("uploadToServer1");
+var uploadEl2 = document.getElementById("uploadToServer2");
+uploadEl1.onclick = function() {
+ var text = savedLeadingComments + editor1.getValue();
+ var url = "./lib/ace/mode/" + modeEl.value + "_highlight_rules.js";
+ net.put(url, text, function(text) {
+ if (text.trim().length > 0)
+ log(text);
+ else {
+ uploadEl1.disabled = true;
+ editor1.getSession().getUndoManager().markClean();
+ }
+ });
+};
+editor1.commands.bindKey("Ctrl-S", uploadEl1.onclick);
+uploadEl2.onclick = function() {
+ doclist.saveDoc(docEl.value, function(text) {
+ if (text.trim().length > 0)
+ log(text);
+ else {
+ uploadEl2.disabled = true;
+ editor2.getSession().getUndoManager().markClean();
+ }
+ });
+};
+editor2.commands.bindKey("Ctrl-S", uploadEl2.onclick);
+editor1.on('change', function() {
+ uploadEl1.disabled = false;
+});
+editor2.on('change', function() {
+ uploadEl2.disabled = false;
+});
+
document.getElementById("perfTest").onclick = function() {
var lines = editor2.session.doc.getAllLines();
if (!lines.length)