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)