From 619fd9bd93f9c4736702d59c123df4282b332576 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Mon, 4 Jun 2012 09:49:24 +0200 Subject: [PATCH 01/32] Update textmate theme for meta tag. --- lib/ace/theme/textmate.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/theme/textmate.css b/lib/ace/theme/textmate.css index dafb9fa1..70793692 100644 --- a/lib/ace/theme/textmate.css +++ b/lib/ace/theme/textmate.css @@ -157,9 +157,9 @@ } .ace-tm .ace_meta.ace_tag { - color:rgb(0, 50, 198); + color:rgb(0, 22, 42); } .ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0) -} \ No newline at end of file +} From 6c7465892b9912ae47ec4445df70b00550bf2450 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Mon, 4 Jun 2012 09:53:35 +0200 Subject: [PATCH 02/32] Update textmate theme. --- lib/ace/theme/textmate.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/theme/textmate.css b/lib/ace/theme/textmate.css index 70793692..87f66f1c 100644 --- a/lib/ace/theme/textmate.css +++ b/lib/ace/theme/textmate.css @@ -157,7 +157,7 @@ } .ace-tm .ace_meta.ace_tag { - color:rgb(0, 22, 42); + color:rgb(0, 22, 142); } .ace-tm .ace_string.ace_regex { From 447ba1418ce7d7d00d3a8e8f4ed84b94539ae224 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Fri, 13 Jul 2012 20:31:59 +0200 Subject: [PATCH 03/32] Disable buggy XQuery behavior. --- lib/ace/mode/behaviour/xquery.js | 62 ++++++++++++++++---------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/lib/ace/mode/behaviour/xquery.js b/lib/ace/mode/behaviour/xquery.js index e5fb7b6b..dfe17de7 100644 --- a/lib/ace/mode/behaviour/xquery.js +++ b/lib/ace/mode/behaviour/xquery.js @@ -28,39 +28,39 @@ define(function(require, exports, module) { this.inherit(CstyleBehaviour, ["braces", "parens", "string_dquotes"]); // Get string behaviour this.parent = parent; - this.add("brackets", "insertion", function (state, action, editor, session, text) { - if (text == "\n") { - var cursor = editor.getCursorPosition(); - var line = session.doc.getLine(cursor.row); - var rightChars = line.substring(cursor.column, cursor.column + 2); - if (rightChars == ' 0 && line.charAt(cursor.column - 1) == "<") { - line = line.substring(0, cursor.column) + "/" + line.substring(cursor.column); - var lines = session.doc.getAllLines(); - lines[cursor.row] = line; - // call mode helper to close the tag if possible - parent.exec("closeTag", lines.join(session.doc.getNewLineCharacter()), cursor.row); - } - } - return false; - }); +// this.add("slash", "insertion", function (state, action, editor, session, text) { +// if (text == "/") { +// var cursor = editor.getCursorPosition(); +// var line = session.doc.getLine(cursor.row); +// if (cursor.column > 0 && line.charAt(cursor.column - 1) == "<") { +// line = line.substring(0, cursor.column) + "/" + line.substring(cursor.column); +// var lines = session.doc.getAllLines(); +// lines[cursor.row] = line; +// // call mode helper to close the tag if possible +// parent.exec("closeTag", lines.join(session.doc.getNewLineCharacter()), cursor.row); +// } +// } +// return false; +// }); } oop.inherits(XQueryBehaviour, Behaviour); From f1e4cbb1a8b99b0f98c1d1ee2dc937691f59782f Mon Sep 17 00:00:00 2001 From: Patrik Henningsson Date: Tue, 24 Jul 2012 10:34:51 +0200 Subject: [PATCH 04/32] Fixed error "Duplicate data property in object literal not allowed in strict mode" found when linting the code. --- lib/ace/ext/textarea.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/ace/ext/textarea.js b/lib/ace/ext/textarea.js index c46579d8..918e8ebd 100644 --- a/lib/ace/ext/textarea.js +++ b/lib/ace/ext/textarea.js @@ -193,7 +193,6 @@ exports.transformTextarea = function(element, loader) { var settingOpener = document.createElement("div"); applyStyles(settingOpener, { position: "absolute", - width: "15px", right: "0px", bottom: "0px", background: "red", From e387c70f819c78dd706a5a817003bacc7e92ca1f Mon Sep 17 00:00:00 2001 From: corinnekrych Date: Tue, 24 Jul 2012 18:38:21 +0300 Subject: [PATCH 05/32] fix issues in IE8 with onPropertyChange. IE8 was looping. --- lib/ace/keyboard/textinput.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index e4ba3e1c..56c9966b 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -118,7 +118,9 @@ var TextInput = function(parentNode, host) { var onPropertyChange = function(e) { setTimeout(function() { if (!inCompostion) - sendText(); + if(text.value != "") { + sendText(); + } }, 0); }; From 3d9d17e914323a08975258626328c5c84168be97 Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 26 Jul 2012 20:42:42 +0400 Subject: [PATCH 06/32] update readme --- .gitmodules | 2 +- Readme.md | 6 +++--- index.html | 2 +- package.json | 5 +---- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.gitmodules b/.gitmodules index 5c78725c..4678c516 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = git://github.com/ajaxorg/ace.wiki.git [submodule "build"] path = build - url = https://github.com/ajaxorg/ace-builds.git + url = git://github.com/ajaxorg/ace-builds.git diff --git a/Readme.md b/Readme.md index b8024df7..e55ef505 100644 --- a/Readme.md +++ b/Readme.md @@ -25,9 +25,9 @@ Features Take Ace for a spin! -------------------- -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. +Check out the Ace live [demo](http://ajaxorg.github.com/ace/build/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-builds/textarea/editor.html). +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). Getting the code ---------------- @@ -123,7 +123,7 @@ The editor can then be opened at http://localhost:8888/kitchen-sink.html. Package Ace ----------- -To package Ace we use the dryice build tool developed by the Mozilla Skywriter team. (see the [wiki](https://github.com/ajaxorg/ace/wiki/Building-ace) more for details) +To package Ace we use the dryice build tool developed by the Mozilla Skywriter team. (see the [wiki](https://github.com/ajaxorg/ace/wiki/Building-ace) for more details) ```bash npm install diff --git a/index.html b/index.html index 911f5c97..a463d535 100644 --- a/index.html +++ b/index.html @@ -116,7 +116,7 @@

Take Ace for a spin!

-

Check out the Ace live demo or get a Cloud9 IDE account to experience Ace while editing one of your own GitHub projects.

+

Check out the Ace live demo or get a Cloud9 IDE account to experience Ace while editing one of your own GitHub projects.

History

diff --git a/package.json b/package.json index bfe31c80..b7a4b097 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "Ajax.org Code Editor is a full featured source code highlighting editor that powers the Cloud9 IDE", "version": "0.2.0", "homepage" : "http://github.com/ajaxorg/ace", - "engines": {"node": ">= 0.4.0"}, + "engines": {"node": ">= 0.6.0"}, "author": "Fabian Jakobs ", "main": "lib/ace", "repository" : { @@ -19,9 +19,6 @@ "dryice": "", "panino" : "~1.0.15" }, - "engines": { - "node": "~0.6.0" - }, "mappings": { "ace": "." }, From 354e8b3eff82b446f712a4dac11f0b47eb7cd164 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 13 Jul 2012 20:27:59 +0400 Subject: [PATCH 07/32] do not overwrite type of event this is needed for safari 6 --- lib/ace/lib/event_emitter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/ace/lib/event_emitter.js b/lib/ace/lib/event_emitter.js index ef1e25a0..5818864d 100644 --- a/lib/ace/lib/event_emitter.js +++ b/lib/ace/lib/event_emitter.js @@ -54,7 +54,8 @@ EventEmitter._dispatchEvent = function(eventName, e) { return; e = e || {}; - e.type = eventName; + if (!e.type) + e.type = eventName; if (!e.stopPropagation) { e.stopPropagation = function() { From 538f54f47c7a703d24eefb6ef0d58b5c089498a2 Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Jul 2012 23:16:29 +0400 Subject: [PATCH 08/32] new opera supports KeyboardEvents --- lib/ace/keyboard/textinput.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index e4ba3e1c..49c93116 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -206,7 +206,7 @@ var TextInput = function(parentNode, host) { }); event.addListener(text, "cut", onCut); // for ie9 context menu } - else if (useragent.isOpera) { + else if (useragent.isOpera && !("KeyboardEvent" in window)) { event.addListener(parentNode, "keydown", function(e) { if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) return; From f35418ab7d4c1f2d7b3e9f76ef5d1d5db86bc03e Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 17:18:18 +0400 Subject: [PATCH 09/32] fix ie9 contextmenu --- lib/ace/keyboard/textinput.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index e4ba3e1c..3f0cb9dc 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -268,11 +268,14 @@ var TextInput = function(parentNode, host) { tempStyle = text.style.cssText; text.style.cssText = - "position:fixed; z-index:100000;" + //"background:rgba(250, 0, 0, 0.3); opacity:1;" + + "position:fixed; z-index:100000;" + + (useragent.isIE ? "background:rgba(0, 0, 0, 0.03); opacity:0.1;" : "") + //"background:rgba(250, 0, 0, 0.3); opacity:1;" + "left:" + (e.clientX - 2) + "px; top:" + (e.clientY - 2) + "px;"; if (host.selection.isEmpty()) text.value = ""; + else + reset(true); if (e.type != "mousedown") return; @@ -281,7 +284,7 @@ var TextInput = function(parentNode, host) { host.renderer.$keepTextAreaAtCursor = null; // on windows context menu is opened after mouseup - if (useragent.isGecko && useragent.isWin) + if (useragent.isWin && (useragent.isGecko || useragent.isIE)) event.capture(host.container, function(e) { text.style.left = e.clientX - 2 + "px"; text.style.top = e.clientY - 2 + "px"; From 81b6e5916a6fc8b4e7b6314170e1e4f5f57ae8c5 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 17:57:35 +0400 Subject: [PATCH 10/32] fix text input for old ie --- lib/ace/keyboard/textinput.js | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/ace/keyboard/textinput.js b/lib/ace/keyboard/textinput.js index 3f0cb9dc..af6fe1b7 100644 --- a/lib/ace/keyboard/textinput.js +++ b/lib/ace/keyboard/textinput.js @@ -166,7 +166,24 @@ var TextInput = function(parentNode, host) { }; event.addCommandKeyListener(text, host.onCommandKey.bind(host)); - event.addListener(text, "input", useragent.isIE ? onPropertyChange : onTextInput); + event.addListener(text, "input", onTextInput); + + if (useragent.isOldIE) { + var keytable = { 13:1, 27:1 }; + event.addListener(text, "keyup", function (e) { + if (inCompostion && (!text.value || keytable[e.keyCode])) + setTimeout(onCompositionEnd, 0); + if ((text.value.charCodeAt(0)|0) < 129) { + return; + } + inCompostion ? onCompositionUpdate() : onCompositionStart(); + }); + + event.addListener(text, "propertychange", function() { + if (text.value != PLACEHOLDER) + setTimeout(sendText, 0); + }); + } event.addListener(text, "paste", function(e) { // Mark that the next input text comes from past. From 61ae3503248bd86656008e3aa78c9539bcb6f5dd Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 17:59:02 +0400 Subject: [PATCH 11/32] do not use postmessage on oldIE since addListener is very slow there --- lib/ace/lib/event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 1afca2a2..0948f158 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -292,7 +292,7 @@ exports.addCommandKeyListener = function(el, callback) { } }; -if (window.postMessage) { +if (window.postMessage && !useragent.isOldIE) { var postMessageId = 1; exports.nextTick = function(callback, win) { win = win || window; From e7b952a55e61c4b97142a9a745c189e5cf91f5a8 Mon Sep 17 00:00:00 2001 From: nightwing Date: Wed, 4 Jul 2012 19:26:07 +0400 Subject: [PATCH 12/32] fix mouse handling for ie8 --- lib/ace/lib/event.js | 16 ++++++++++++---- lib/ace/mouse/mouse_handler.js | 9 +++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 0948f158..87da2cb2 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -193,7 +193,7 @@ exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbac 4: "quadclick" }; - var listener = function(e) { + exports.addListener(el, "mousedown", function(e) { if (exports.getButton(e) != 0) { clicks = 0; } else { @@ -219,10 +219,18 @@ exports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbac clicks = 0; else if (clicks > 1) return eventHandler[callbackName](eventNames[clicks], e); - }; + }); - exports.addListener(el, "mousedown", listener); - useragent.isOldIE && exports.addListener(el, "dblclick", listener); + if (useragent.isOldIE) { + exports.addListener(el, "dblclick", function(e) { + clicks = 2; + if (timer) + clearTimeout(timer); + timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600); + eventHandler[callbackName]("mousedown", e); + eventHandler[callbackName](eventNames[clicks], e); + }); + } }; function normalizeCommandKeys(callback, e, keyCode) { diff --git a/lib/ace/mouse/mouse_handler.js b/lib/ace/mouse/mouse_handler.js index f108a7dc..b8e992a3 100644 --- a/lib/ace/mouse/mouse_handler.js +++ b/lib/ace/mouse/mouse_handler.js @@ -41,6 +41,7 @@ define(function(require, exports, module) { "use strict"; var event = require("../lib/event"); +var useragent = require("../lib/useragent"); var DefaultHandlers = require("./default_handlers").DefaultHandlers; var DefaultGutterHandler = require("./default_gutter_handler").GutterHandler; var MouseEvent = require("./mouse_event").MouseEvent; @@ -148,6 +149,14 @@ var MouseHandler = function(editor) { var onCaptureInterval = function() { self[self.state] && self[self.state](); } + + if (useragent.isOldIE && ev.domEvent.type == "dblclick") { + setTimeout(function() { + onCaptureInterval(); + onCaptureEnd(ev.domEvent); + }); + return; + } event.capture(this.editor.container, onMouseMove, onCaptureEnd); var timerId = setInterval(onCaptureInterval, 20); From 4319abf2567f4f280441179adddb9d5896d161b9 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 6 Jul 2012 12:06:42 +0400 Subject: [PATCH 13/32] fix scriptloading on old ie --- lib/ace/lib/net.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/ace/lib/net.js b/lib/ace/lib/net.js index bf4eefe0..438a26a2 100644 --- a/lib/ace/lib/net.js +++ b/lib/ace/lib/net.js @@ -1,6 +1,6 @@ /* * based on code from: - * + * * @license RequireJS text 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved. * Available via the MIT or new BSD license. * see: http://github.com/jrburke/requirejs for details @@ -8,6 +8,8 @@ define(function(require, exports, module) { "use strict"; +var useragent = require("ace/lib/useragent"); + exports.get = function (url, callback) { var xhr = exports.createXhr(); xhr.open('GET', url, true); @@ -55,8 +57,13 @@ exports.loadScript = function(path, callback) { s.src = path; head.appendChild(s); - - s.onload = callback; + + if (useragent.isOldIE) + s.onreadystatechange = function () { + this.readyState == 'loaded' && callback(); + }; + else + s.onload = callback; }; }); From 7b365db83f1054b8f2f2a19c300ee76b6468fc94 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 6 Jul 2012 12:24:04 +0400 Subject: [PATCH 14/32] event target for ie8 --- lib/ace/edit_session/folding.js | 2 +- lib/ace/mouse/default_gutter_handler.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/ace/edit_session/folding.js b/lib/ace/edit_session/folding.js index c6292a3f..310a9856 100644 --- a/lib/ace/edit_session/folding.js +++ b/lib/ace/edit_session/folding.js @@ -729,7 +729,7 @@ function Folding() { } else { if (addSubfolds) this.foldAll(row + 1, this.getLength()); - e.target.className += " invalid" + (e.target || e.srcElement).className += " invalid" } }; diff --git a/lib/ace/mouse/default_gutter_handler.js b/lib/ace/mouse/default_gutter_handler.js index 21c792a1..e7e005bd 100644 --- a/lib/ace/mouse/default_gutter_handler.js +++ b/lib/ace/mouse/default_gutter_handler.js @@ -44,7 +44,7 @@ function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { - var target = e.domEvent.target; + var target = e.domEvent.target || e.domEvent.srcElement; if (target.className.indexOf("ace_gutter-cell") == -1) return; From 78471317f6fb0e1c7f9268c47d365d5732a0f630 Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 6 Jul 2012 13:15:09 +0400 Subject: [PATCH 15/32] do not use event.target for determining clicked gutter region breakpoints/numbers/foldwidgets --- lib/ace/ext/textarea.js | 1 - lib/ace/layer/gutter.js | 20 ++++++++++++++++++++ lib/ace/mouse/default_gutter_handler.js | 8 ++------ lib/ace/mouse/fold_handler.js | 7 +++++-- 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/lib/ace/ext/textarea.js b/lib/ace/ext/textarea.js index c46579d8..918e8ebd 100644 --- a/lib/ace/ext/textarea.js +++ b/lib/ace/ext/textarea.js @@ -193,7 +193,6 @@ exports.transformTextarea = function(element, loader) { var settingOpener = document.createElement("div"); applyStyles(settingOpener, { position: "absolute", - width: "15px", right: "0px", bottom: "0px", background: "red", diff --git a/lib/ace/layer/gutter.js b/lib/ace/layer/gutter.js index be72a172..d30c4ba3 100644 --- a/lib/ace/layer/gutter.js +++ b/lib/ace/layer/gutter.js @@ -174,12 +174,32 @@ var Gutter = function(parentEl) { dom.removeCssClass(this.element, "ace_folding-enabled"); this.$showFoldWidgets = show; + this.$padding = null; }; this.getShowFoldWidgets = function() { return this.$showFoldWidgets; }; + this.$computePadding = function() { + if (!this.element.firstChild) + return {left: 0, right: 0}; + var style = dom.computedStyle(this.element.firstChild); + this.$padding = {} + this.$padding.left = parseInt(style.paddingLeft) + 1; + this.$padding.right = parseInt(style.paddingRight); + return this.$padding; + }; + + this.getRegion = function(point) { + var padding = this.$padding || this.$computePadding(); + var rect = this.element.getBoundingClientRect(); + if (point.x < padding.left + rect.left) + return "markers"; + if (this.$showFoldWidgets && point.x > rect.right - padding.right) + return "foldWidgets"; + }; + }).call(Gutter.prototype); exports.Gutter = Gutter; diff --git a/lib/ace/mouse/default_gutter_handler.js b/lib/ace/mouse/default_gutter_handler.js index e7e005bd..0fbadfb7 100644 --- a/lib/ace/mouse/default_gutter_handler.js +++ b/lib/ace/mouse/default_gutter_handler.js @@ -44,15 +44,11 @@ function GutterHandler(mouseHandler) { var editor = mouseHandler.editor; mouseHandler.editor.setDefaultHandler("guttermousedown", function(e) { - var target = e.domEvent.target || e.domEvent.srcElement; - if (target.className.indexOf("ace_gutter-cell") == -1) - return; - if (!editor.isFocused()) return; + var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); - var padding = parseInt(dom.computedStyle(target).paddingLeft); - if (e.x < padding + target.getBoundingClientRect().left + 1) + if (gutterRegion) return; var row = e.getDocumentPosition().row; diff --git a/lib/ace/mouse/fold_handler.js b/lib/ace/mouse/fold_handler.js index ecde7769..2064660e 100644 --- a/lib/ace/mouse/fold_handler.js +++ b/lib/ace/mouse/fold_handler.js @@ -58,9 +58,12 @@ function FoldHandler(editor) { }); editor.on("gutterclick", function(e) { - if (e.domEvent.target.className.indexOf("ace_fold-widget") != -1) { + var gutterRegion = editor.renderer.$gutterLayer.getRegion(e); + + if (gutterRegion == "foldWidgets") { var row = e.getDocumentPosition().row; - editor.session.onFoldWidgetClick(row, e.domEvent); + if (editor.session.foldWidgets[row]) + editor.session.onFoldWidgetClick(row, e); e.stop(); } }); From 1f2d1eecd6d98526f7728e1c9a2ae5d198645f53 Mon Sep 17 00:00:00 2001 From: Garen Torikian Date: Wed, 1 Aug 2012 14:44:42 -0700 Subject: [PATCH 16/32] Alphabetize list, don't make Garen's heart hurt --- demo/kitchen-sink/demo.js | 68 +++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 52eb6d74..5a375412 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -169,47 +169,47 @@ function makeHuge(txt) { } var docs = { - "docs/c9search.c9search_results": "C9 Search Results", "docs/javascript.js": "JavaScript", - "docs/plaintext.txt": {name: "Plain Text", prepare: makeHuge, wrapped: true}, + "docs/clojure.clj": "Clojure", "docs/coffeescript.coffee": "Coffeescript", - "docs/json.json": "JSON", - "docs/diff.diff": "Diff", - "docs/css.css": "CSS", - "docs/scss.scss": "SCSS", - "docs/less.less": "LESS", - "docs/html.html": "HTML", - "docs/xml.xml": "XML", - "docs/tcl.tcl": "Tcl", - "docs/yaml.yaml": "YAML", - "docs/svg.svg": "SVG", - "docs/php.php": "PHP", "docs/coldfusion.cfm": "ColdFusion", - "docs/python.py": "Python", - "docs/ruby.rb": "Ruby", - "docs/perl.pl": "Perl", - "docs/ocaml.ml": "OCaml", - "docs/OpenSCAD.scad": "OpenSCAD", + "docs/cpp.cpp": "C/C++", + "docs/csharp.cs": "C#", + "docs/css.css": "CSS", + "docs/diff.diff": "Diff", + "docs/golang.go": "Go", + "docs/groovy.groovy": "Groovy", + "docs/Haxe.hx": "haXe", + "docs/html.html": "HTML", + "docs/java.java": "Java", + "docs/json.json": "JSON", + "docs/jsx.jsx": "JSX", + "docs/latex.tex": {name: "LaTeX", wrapped: true}, + "docs/less.less": "LESS", + "docs/liquid.liquid": "Liquid", "docs/lua.lua": "Lua", "docs/luapage.lp": "LuaPage", - "docs/liquid.liquid": "Liquid", - "docs/java.java": "Java", - "docs/clojure.clj": "Clojure", - "docs/groovy.groovy": "Groovy", - "docs/scala.scala": "Scala", - "docs/csharp.cs": "C#", - "docs/powershell.ps1": "Powershell", - "docs/cpp.cpp": "C/C++", - "docs/Haxe.hx": "haXe", - "docs/sh.sh": "SH", - "docs/xquery.xq": "XQuery", "docs/markdown.md": {name: "Markdown", wrapped: true}, - "docs/textile.textile": {name: "Textile", wrapped: true}, - "docs/latex.tex": {name: "LaTeX", wrapped: true}, - "docs/sql.sql": {name: "SQL", wrapped: true}, + "docs/ocaml.ml": "OCaml", + "docs/OpenSCAD.scad": "OpenSCAD", + "docs/perl.pl": "Perl", "docs/pgsql.pgsql": {name: "pgSQL", wrapped: true}, - "docs/golang.go": "Go", - "docs/jsx.jsx": "JSX" + "docs/php.php": "PHP", + "docs/plaintext.txt": {name: "Plain Text", prepare: makeHuge, wrapped: true}, + "docs/powershell.ps1": "Powershell", + "docs/python.py": "Python", + "docs/ruby.rb": "Ruby", + "docs/scala.scala": "Scala", + "docs/scss.scss": "SCSS", + "docs/sh.sh": "SH", + "docs/sql.sql": {name: "SQL", wrapped: true}, + "docs/svg.svg": "SVG", + "docs/tcl.tcl": "Tcl", + "docs/textile.textile": {name: "Textile", wrapped: true}, + "docs/xml.xml": "XML", + "docs/xquery.xq": "XQuery", + "docs/yaml.yaml": "YAML", + "docs/c9search.c9search_results": "C9 Search Results" } var ownSource = { From 4a8ead5c7b021d4e5d226178761b3b1ff17ad2b9 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Jul 2012 23:22:34 +0400 Subject: [PATCH 17/32] add indent guide images to themes --- kitchen-sink.html | 69 +++++++++++++---------- lib/ace/theme/chrome.css | 6 +- lib/ace/theme/clouds.css | 4 ++ lib/ace/theme/clouds_midnight.css | 4 ++ lib/ace/theme/cobalt.css | 4 ++ lib/ace/theme/crimson_editor.css | 4 ++ lib/ace/theme/dawn.css | 4 ++ lib/ace/theme/dreamweaver.css | 4 ++ lib/ace/theme/eclipse.css | 4 ++ lib/ace/theme/github.css | 4 ++ lib/ace/theme/idle_fingers.css | 6 +- lib/ace/theme/kr_theme.css | 4 ++ lib/ace/theme/merbivore.css | 4 ++ lib/ace/theme/merbivore_soft.css | 4 ++ lib/ace/theme/mono_industrial.css | 4 ++ lib/ace/theme/monokai.css | 4 ++ lib/ace/theme/pastel_on_dark.css | 4 ++ lib/ace/theme/solarized_dark.css | 4 ++ lib/ace/theme/solarized_light.css | 4 ++ lib/ace/theme/textmate.css | 4 ++ lib/ace/theme/tomorrow.css | 4 ++ lib/ace/theme/tomorrow_night.css | 4 ++ lib/ace/theme/tomorrow_night_blue.css | 4 ++ lib/ace/theme/tomorrow_night_bright.css | 4 ++ lib/ace/theme/tomorrow_night_eighties.css | 4 ++ lib/ace/theme/twilight.css | 4 ++ lib/ace/theme/vibrant_ink.css | 4 ++ 27 files changed, 146 insertions(+), 31 deletions(-) diff --git a/kitchen-sink.html b/kitchen-sink.html index 6712e59d..825a6194 100644 --- a/kitchen-sink.html +++ b/kitchen-sink.html @@ -59,32 +59,36 @@ @@ -139,8 +143,8 @@ - - +
+ + + +
@@ -162,6 +166,13 @@
+ + + +
@@ -218,7 +229,7 @@ - +
diff --git a/lib/ace/theme/chrome.css b/lib/ace/theme/chrome.css index 425071dc..26863569 100644 --- a/lib/ace/theme/chrome.css +++ b/lib/ace/theme/chrome.css @@ -156,4 +156,8 @@ color:#FD971F; .ace-chrome .ace_entity.ace_other.ace_attribute-name{ color: #994409; -} \ No newline at end of file +} + +.ace-chrome .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; +} diff --git a/lib/ace/theme/clouds.css b/lib/ace/theme/clouds.css index 1622cec2..80364f41 100644 --- a/lib/ace/theme/clouds.css +++ b/lib/ace/theme/clouds.css @@ -115,4 +115,8 @@ .ace-clouds .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-clouds .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/clouds_midnight.css b/lib/ace/theme/clouds_midnight.css index b42113d7..22b52c99 100644 --- a/lib/ace/theme/clouds_midnight.css +++ b/lib/ace/theme/clouds_midnight.css @@ -116,4 +116,8 @@ background-color:#E92E2E; .ace-clouds-midnight .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-clouds-midnight .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQlJT8z1BeXv4fAA2KA6+h9Z+2AAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/cobalt.css b/lib/ace/theme/cobalt.css index 2a4aaed0..60fda700 100644 --- a/lib/ace/theme/cobalt.css +++ b/lib/ace/theme/cobalt.css @@ -142,4 +142,8 @@ background-color:#001221; .ace-cobalt .ace_markup.ace_list { background-color:#130D26; +} + +.ace-cobalt .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgUHL4zzBz5sz/AA80BCzv+WXhAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/crimson_editor.css b/lib/ace/theme/crimson_editor.css index 1ed6783a..433ed071 100644 --- a/lib/ace/theme/crimson_editor.css +++ b/lib/ace/theme/crimson_editor.css @@ -148,4 +148,8 @@ .ace-crimson-editor .ace_string.ace_regex { color: rgb(192, 0, 192); +} + +.ace-crimson-editor .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/dawn.css b/lib/ace/theme/dawn.css index 94cbd1c3..d26edebf 100644 --- a/lib/ace/theme/dawn.css +++ b/lib/ace/theme/dawn.css @@ -146,4 +146,8 @@ color:#5A525F; .ace-dawn .ace_markup.ace_list { color:#693A17; +} + +.ace-dawn .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4+fPnf4ZVq1b9BwAkVQboFQv98gAAAABJRU5ErkJggg==) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/dreamweaver.css b/lib/ace/theme/dreamweaver.css index 46ac475c..b01025a1 100644 --- a/lib/ace/theme/dreamweaver.css +++ b/lib/ace/theme/dreamweaver.css @@ -179,4 +179,8 @@ .ace-dreamweaver .ace_string.ace_regex { color: rgb(255, 0, 0) +} + +.ace-dreamweaver .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/eclipse.css b/lib/ace/theme/eclipse.css index f02283b2..55c34f89 100644 --- a/lib/ace/theme/eclipse.css +++ b/lib/ace/theme/eclipse.css @@ -99,4 +99,8 @@ .ace-eclipse .ace_marker-layer .ace_active_line { background: rgb(232, 242, 254); +} + +.ace-eclipse .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/github.css b/lib/ace/theme/github.css index 935990fa..ac4f29ac 100644 --- a/lib/ace/theme/github.css +++ b/lib/ace/theme/github.css @@ -130,4 +130,8 @@ .ace-github .ace_print_margin { width: 1px; background: #e8e8e8; +} + +.ace-github .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/idle_fingers.css b/lib/ace/theme/idle_fingers.css index ba753f20..00e8a81e 100644 --- a/lib/ace/theme/idle_fingers.css +++ b/lib/ace/theme/idle_fingers.css @@ -133,5 +133,9 @@ color:#BC9458; .ace-idle-fingers .ace_collab.ace_user1 { color:#323232; -background-color:#FFF980; + background-color:#FFF980; +} + +.ace-idle-fingers .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjL6zzBz5sz/ABEUBGCqhK6UAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/kr_theme.css b/lib/ace/theme/kr_theme.css index 3e5f7332..ede07375 100644 --- a/lib/ace/theme/kr_theme.css +++ b/lib/ace/theme/kr_theme.css @@ -137,4 +137,8 @@ color:#706D5B; .ace-kr-theme .ace_markup.ace_list { background-color:#0F0040; +} + +.ace-kr-theme .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPg5uL8zzBz5sz/AA1WA+hUYIqjAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/merbivore.css b/lib/ace/theme/merbivore.css index 1048600a..4ee7fa73 100644 --- a/lib/ace/theme/merbivore.css +++ b/lib/ace/theme/merbivore.css @@ -137,4 +137,8 @@ color:#AD2EA4; .ace-merbivore .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-merbivore .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQExP7zzBz5sz/AA50BAyDznYhAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/merbivore_soft.css b/lib/ace/theme/merbivore_soft.css index 8e1d24a5..55e401b1 100644 --- a/lib/ace/theme/merbivore_soft.css +++ b/lib/ace/theme/merbivore_soft.css @@ -143,4 +143,8 @@ color:#AC4BB8; .ace-merbivore-soft .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-merbivore-soft .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkZH5zzBz5sz/AA8EBB6crd1rAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/mono_industrial.css b/lib/ace/theme/mono_industrial.css index a8af1bcd..8f9056bb 100644 --- a/lib/ace/theme/mono_industrial.css +++ b/lib/ace/theme/mono_industrial.css @@ -145,4 +145,8 @@ background-color:#151C19; .ace-mono-industrial .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-mono-industrial .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ0tH4zzBz5sz/ABAOBECKH+evAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/monokai.css b/lib/ace/theme/monokai.css index cae92734..7c3728ea 100644 --- a/lib/ace/theme/monokai.css +++ b/lib/ace/theme/monokai.css @@ -142,4 +142,8 @@ color:#FD971F; .ace-monokai .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-monokai .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ11D6z7Bq1ar/ABCKBG6g04U2AAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/pastel_on_dark.css b/lib/ace/theme/pastel_on_dark.css index e220569c..104d5168 100644 --- a/lib/ace/theme/pastel_on_dark.css +++ b/lib/ace/theme/pastel_on_dark.css @@ -147,4 +147,8 @@ color:#D2A8A1; .ace-pastel-on-dark .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-pastel-on-dark .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0dD4z9DR0fEfAA+vBBPqhbn1AAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/solarized_dark.css b/lib/ace/theme/solarized_dark.css index df259e8b..f55a1b1e 100644 --- a/lib/ace/theme/solarized_dark.css +++ b/lib/ace/theme/solarized_dark.css @@ -128,4 +128,8 @@ color:#657B83; .ace-solarized-dark .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-solarized-dark .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db7zzBz5sz/AA82BCv7wOIDAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/solarized_light.css b/lib/ace/theme/solarized_light.css index 1bd26c83..d269ecc8 100644 --- a/lib/ace/theme/solarized_light.css +++ b/lib/ace/theme/solarized_light.css @@ -127,4 +127,8 @@ .ace-solarized-light .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-solarized-light .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4++3xf4ZVq1b9BwAjxwbT1g3hiwAAAABJRU5ErkJggg==) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/textmate.css b/lib/ace/theme/textmate.css index c23c30f1..a31f7831 100644 --- a/lib/ace/theme/textmate.css +++ b/lib/ace/theme/textmate.css @@ -162,4 +162,8 @@ .ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0) +} + +.ace-tm .ace_indent-guide { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/tomorrow.css b/lib/ace/theme/tomorrow.css index e65d3a5a..a9c04182 100644 --- a/lib/ace/theme/tomorrow.css +++ b/lib/ace/theme/tomorrow.css @@ -161,4 +161,8 @@ background-color:#8959A8; .ace-tomorrow .ace_markup.ace_heading { color:#718C00; +} + +.ace-tomorrow .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night.css b/lib/ace/theme/tomorrow_night.css index 3ac694f5..137e35d8 100644 --- a/lib/ace/theme/tomorrow_night.css +++ b/lib/ace/theme/tomorrow_night.css @@ -161,4 +161,8 @@ background-color:#B798BF; .ace-tomorrow-night .ace_markup.ace_heading { color:#B5BD68; +} + +.ace-tomorrow-night .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQlVf8z7Bq1ar/AA/hBFp7egmpAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night_blue.css b/lib/ace/theme/tomorrow_night_blue.css index 1bcc86c3..7a8354bb 100644 --- a/lib/ace/theme/tomorrow_night_blue.css +++ b/lib/ace/theme/tomorrow_night_blue.css @@ -161,4 +161,8 @@ background-color:#EBBBFF; .ace-tomorrow-night-blue .ace_markup.ace_heading { color:#D1F1A9; +} + +.ace-tomorrow-night-blue .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgUAn8z7Bq1ar/ABBUBHJ4/r3JAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night_bright.css b/lib/ace/theme/tomorrow_night_bright.css index 7cee6607..44d944a5 100644 --- a/lib/ace/theme/tomorrow_night_bright.css +++ b/lib/ace/theme/tomorrow_night_bright.css @@ -161,4 +161,8 @@ background-color:#B798BF; .ace-tomorrow-night-bright .ace_markup.ace_heading { color:#B9CA4A; +} + +.ace-tomorrow-night-bright .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGD4z7Bq1ar/AAz9A/2naJQKAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/tomorrow_night_eighties.css b/lib/ace/theme/tomorrow_night_eighties.css index ce5ef317..1dfd9ead 100644 --- a/lib/ace/theme/tomorrow_night_eighties.css +++ b/lib/ace/theme/tomorrow_night_eighties.css @@ -157,4 +157,8 @@ background-color:#CC99CC; .ace-tomorrow-night-eighties .ace_markup.ace_heading { color:#99CC99; +} + +.ace-tomorrow-night-eighties .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ1dX9z7Bq1ar/ABE1BITwhhuFAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/twilight.css b/lib/ace/theme/twilight.css index 28d1ffa6..6b7df599 100644 --- a/lib/ace/theme/twilight.css +++ b/lib/ace/theme/twilight.css @@ -159,4 +159,8 @@ color:#5F5A60; .ace-twilight .ace_markup.ace_list { color:#F9EE98; +} + +.ace-twilight .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERH5zzBz5sz/AA5EBAYqeZXWAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file diff --git a/lib/ace/theme/vibrant_ink.css b/lib/ace/theme/vibrant_ink.css index 3677a28e..7aebc35c 100644 --- a/lib/ace/theme/vibrant_ink.css +++ b/lib/ace/theme/vibrant_ink.css @@ -138,4 +138,8 @@ color:#99CC99; .ace-vibrant-ink .ace_markup.ace_underline { text-decoration:underline; +} + +.ace-vibrant-ink .ace_indent-guide { + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPg5+f/z7Bq1ar/AA5lBCqoLxsgAAAAAElFTkSuQmCC) right repeat-y; } \ No newline at end of file From f73e38625b2c416ec4d36cb823869738b7d2012c Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 15 Jul 2012 23:32:20 +0400 Subject: [PATCH 18/32] indent guides --- demo/kitchen-sink/demo.js | 8 +- lib/ace/editor.js | 14 ++- lib/ace/layer/text.js | 194 +++++++++++++++++++++++------------ lib/ace/test/mockrenderer.js | 3 + lib/ace/virtual_renderer.js | 15 ++- 5 files changed, 163 insertions(+), 71 deletions(-) diff --git a/demo/kitchen-sink/demo.js b/demo/kitchen-sink/demo.js index 5a375412..7a2f2e76 100644 --- a/demo/kitchen-sink/demo.js +++ b/demo/kitchen-sink/demo.js @@ -286,7 +286,7 @@ env.editor.commands.addCommands([{ name: "gotoline", bindKey: {win: "Ctrl-L", mac: "Command-L"}, exec: function(editor, line) { - if (typeof needle == "object") { + if (typeof line == "object") { var arg = this.name + " " + editor.getCursorPosition().row; editor.cmdLine.setValue(arg, 1) editor.cmdLine.focus() @@ -328,7 +328,7 @@ cmdLine.commands.bindKeys({ }, }) -cmdLine.commands.removeCommands(["find", "goToLine", "findAll", "replace", "replaceAll"]) +cmdLine.commands.removeCommands(["find", "gotoline", "findall", "replace", "replaceall"]) /** * This demonstrates how you can define commands and bind shortcuts to them. @@ -557,6 +557,10 @@ bindCheckbox("show_hidden", function(checked) { env.editor.setShowInvisibles(checked); }); +bindCheckbox("display_indent_guides", function(checked) { + env.editor.setDisplayIndentGuides(checked); +}); + bindCheckbox("show_gutter", function(checked) { env.editor.renderer.setShowGutter(checked); }); diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 5b387f98..476a08c6 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -165,7 +165,7 @@ var Editor = function(renderer, session) { this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this); session.addEventListener("tokenizerUpdate", this.$onTokenizerUpdate); - this.$onChangeTabSize = this.renderer.updateText.bind(this.renderer); + this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer); session.addEventListener("changeTabSize", this.$onChangeTabSize); this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this); @@ -218,6 +218,7 @@ var Editor = function(renderer, session) { this.onChangeBreakpoint(); this.onChangeAnnotation(); this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); + this.renderer.onChangeTabSize(); this.renderer.updateFull(); this._emit("changeSession", { @@ -988,9 +989,6 @@ var Editor = function(renderer, session) { * If `showInvisibiles` is set to `true`, invisible characters—like spaces or new lines—are show in the editor. **/ this.setShowInvisibles = function(showInvisibles) { - if (this.getShowInvisibles() == showInvisibles) - return; - this.renderer.setShowInvisibles(showInvisibles); }; @@ -1003,6 +1001,14 @@ var Editor = function(renderer, session) { return this.renderer.getShowInvisibles(); }; + this.setDisplayIndentGuides = function(display) { + this.renderer.setDisplayIndentGuides(display); + }; + + this.getDisplayIndentGuides = function() { + return this.renderer.getDisplayIndentGuides(); + }; + /** * Editor.setShowPrintMargin(showPrintMargin) * - showPrintMargin (Boolean): Specifies whether or not to show the print margin diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index e96dff28..6c0f736a 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -204,28 +204,52 @@ var Text = function(parentEl) { return false; this.showInvisibles = showInvisibles; + this.$computeTabString(); + return true; + }; + + this.displayIndentGuides = true; + this.setDisplayIndentGuides = function(display) { + if (this.displayIndentGuides == display) + return false; + + this.displayIndentGuides = display; + this.$computeTabString(); return true; }; this.$tabStrings = []; + this.onChangeTabSize = this.$computeTabString = function() { var tabSize = this.session.getTabSize(); + this.tabSize = tabSize; var tabStr = this.$tabStrings = [0]; for (var i = 1; i < tabSize + 1; i++) { if (this.showInvisibles) { tabStr.push("" + this.TAB_CHAR - + new Array(i).join(" ") + + Array(i).join(" ") + ""); } else { tabStr.push(new Array(i+1).join(" ")); } } + if (this.displayIndentGuides) { + this.$indentGuideRe = /\s\S| \t|\t |\s$/; + var className = "ace_indent-guide"; + var content = Array(this.tabSize + 1).join(" "); + var tabContent = content; + if (this.showInvisibles) { + className += " ace_invisible"; + tabContent = this.TAB_CHAR + content.substr(6); + } + this.$tabStrings[" "] = "" + content + ""; + this.$tabStrings["\t"] = "" + tabContent + ""; + } }; this.updateLines = function(config, firstRow, lastRow) { - this.$computeTabString(); // Due to wrap line changes there can be new lines if e.g. // the line to updated wrapped in the meantime. if (this.config.lastRow != config.lastRow || @@ -253,22 +277,32 @@ var Text = function(parentEl) { lineElementsIdx ++; } - for (var i=first; i<=last; i++) { + var row = first; + var foldLine = this.session.getNextFoldLine(row); + var foldStart = foldLine ? foldLine.start.row : Infinity; + + while (true) { + if (row > foldStart) { + row = foldLine.end.row+1; + foldLine = this.session.getNextFoldLine(row, foldLine); + foldStart = foldLine ? foldLine.start.row :Infinity; + } + if (row > last) + break; + var lineElement = lineElements[lineElementsIdx++]; - if (!lineElement) - continue; - - var html = []; - var tokens = this.session.getTokens(i); - this.$renderLine(html, i, tokens, !this.$useLineGroups()); - lineElement = dom.setInnerHtml(lineElement, html.join("")); - - i = this.session.getRowFoldEnd(i); + if (lineElement) { + var html = []; + this.$renderLine( + html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false + ); + dom.setInnerHtml(lineElement, html.join("")); + } + row++; } }; this.scrollLines = function(config) { - this.$computeTabString(); var oldConfig = this.config; this.config = config; @@ -321,8 +355,7 @@ var Text = function(parentEl) { var html = []; // Get the tokens per line as there might be some lines in between // beeing folded. - var tokens = this.session.getTokens(row); - this.$renderLine(html, row, tokens, false); + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); // don't use setInnerHtml since we are working with an empty DIV container.innerHTML = html.join(""); @@ -341,7 +374,6 @@ var Text = function(parentEl) { }; this.update = function(config) { - this.$computeTabString(); this.config = config; var html = []; @@ -363,10 +395,7 @@ var Text = function(parentEl) { if (this.$useLineGroups()) html.push("
") - // Get the tokens per line as there might be some lines in between - // beeing folded. - var tokens = this.session.getTokens(row); - this.$renderLine(html, row, tokens, false); + this.$renderLine(html, row, false, row == foldStart ? foldLine : false); if (this.$useLineGroups()) html.push("
"); // end the line group @@ -429,38 +458,44 @@ var Text = function(parentEl) { return screenColumn + value.length; }; - this.$renderLineCore = function(stringBuilder, lastRow, tokens, splits, onlyContents) { + this.renderIndentGuide = function(stringBuilder, value) { + var cols = value.search(this.$indentGuideRe); + if (cols <= 0) + return value; + if (value[0] == " ") { + cols -= cols % this.tabSize; + stringBuilder.push(Array(cols/this.tabSize + 1).join(this.$tabStrings[" "])); + return value.substr(cols); + } else if (value[0] == "\t") { + stringBuilder.push(Array(cols + 1).join(this.$tabStrings["\t"])); + return value.substr(cols); + } + return value; + }; + + this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) { var chars = 0; var split = 0; - var splitChars; + var splitChars = splits[0]; var screenColumn = 0; - var self = this; - - if (!splits || splits.length == 0) - splitChars = Number.MAX_VALUE; - else - splitChars = splits[0]; - - if (!onlyContents) { - stringBuilder.push("
" - ); - } for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; var value = token.value; + if (i == 0 && this.displayIndentGuides) { + chars = value.length; + value = this.renderIndentGuide(stringBuilder, value); + if (!value) + continue; + chars -= value.length; + } if (chars + value.length < splitChars) { - screenColumn = self.$renderToken( - stringBuilder, screenColumn, token, value - ); + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); chars += value.length; - } - else { + } else { while (chars + value.length >= splitChars) { - screenColumn = self.$renderToken( + screenColumn = this.$renderToken( stringBuilder, screenColumn, token, value.substring(0, splitChars - chars) ); @@ -470,8 +505,7 @@ var Text = function(parentEl) { if (!onlyContents) { stringBuilder.push("
", "
" + this.config.lineHeight, "px'>" ); } @@ -481,37 +515,70 @@ var Text = function(parentEl) { } if (value.length != 0) { chars += value.length; - screenColumn = self.$renderToken( + screenColumn = this.$renderToken( stringBuilder, screenColumn, token, value ); } } } + }; + + this.$renderSimpleLine = function(stringBuilder, tokens) { + var screenColumn = 0; + var token = tokens[0]; + var value = token.value; + if (this.displayIndentGuides) + value = this.renderIndentGuide(stringBuilder, value); + if (value) + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + for (var i = 1; i < tokens.length; i++) { + token = tokens[i]; + value = token.value; + screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value); + } + }; + + // row is either first row of foldline or not in fold + this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) { + if (!foldLine && foldLine != false) + foldLine = this.session.getFoldLine(row); + + if (foldLine) + var tokens = this.$getFoldLineTokens(row, foldLine); + else + var tokens = this.session.getTokens(row); + + + if (!onlyContents) { + stringBuilder.push( + "
" + ); + } + + if (tokens.length) { + var splits = this.session.getRowSplitData(row); + if (splits && splits.length) + this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents); + else + this.$renderSimpleLine(stringBuilder, tokens); + } if (this.showInvisibles) { - if (lastRow !== this.session.getLength() - 1) - stringBuilder.push("" + this.EOL_CHAR + ""); - else - stringBuilder.push("" + this.EOF_CHAR + ""); + if (foldLine) + row = foldLine.end.row + + stringBuilder.push( + "", + row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR, + "" + ); } if (!onlyContents) stringBuilder.push("
"); }; - this.$renderLine = function(stringBuilder, row, tokens, onlyContents) { - // Check if the line to render is folded or not. If not, things are - // simple, otherwise, we need to fake some things... - if (!this.session.isRowFolded(row)) { - var splits = this.session.getRowSplitData(row); - this.$renderLineCore(stringBuilder, row, tokens, splits, onlyContents); - } else { - this.$renderFoldLine(stringBuilder, row, tokens, onlyContents); - } - }; - - this.$renderFoldLine = function(stringBuilder, row, tokens, onlyContents) { + this.$getFoldLineTokens = function(row, foldLine) { var session = this.session; - var foldLine = session.getFoldLine(row); var renderTokens = []; function addTokens(tokens, from, to) { @@ -552,6 +619,7 @@ var Text = function(parentEl) { } } + var tokens = session.getTokens(row); foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) { if (placeholder) { renderTokens.push({ @@ -567,9 +635,7 @@ var Text = function(parentEl) { } }, foldLine.end.row, this.session.getLine(foldLine.end.row).length); - // splits for foldline are stored at its' first row - var splits = this.session.$useWrapMode ? this.session.$wrapData[row] : null; - this.$renderLineCore(stringBuilder, row, renderTokens, splits, onlyContents); + return renderTokens; }; this.$useLineGroups = function() { diff --git a/lib/ace/test/mockrenderer.js b/lib/ace/test/mockrenderer.js index 4e5c515d..2ba4231d 100644 --- a/lib/ace/test/mockrenderer.js +++ b/lib/ace/test/mockrenderer.js @@ -154,6 +154,9 @@ MockRenderer.prototype.getScrollTopRow = function() { MockRenderer.prototype.draw = function() { }; +MockRenderer.prototype.onChangeTabSize = function(startRow, endRow) { +}; + MockRenderer.prototype.updateLines = function(startRow, endRow) { }; diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index d9a0c241..bba5ddf7 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -104,7 +104,6 @@ var VirtualRenderer = function(container, theme) { this.$gutterLayer = new GutterLayer(this.$gutter); this.$gutterLayer.on("changeGutterWidth", this.onResize.bind(this, true)); - this.setFadeFoldWidgets(true); this.$markerBack = new MarkerLayer(this.content); @@ -249,6 +248,11 @@ var VirtualRenderer = function(container, theme) { this.$loop.schedule(this.CHANGE_LINES); }; + this.onChangeTabSize = function() { + this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER); + this.$textLayer.onChangeTabSize(); + }; + /** * VirtualRenderer.updateText() -> Void * @@ -388,6 +392,15 @@ var VirtualRenderer = function(container, theme) { return this.$textLayer.showInvisibles; }; + this.getDisplayIndentGuides = function() { + return this.$textLayer.displayIndentGuides; + }; + + this.setDisplayIndentGuides = function(display) { + if (this.$textLayer.setDisplayIndentGuides(display)) + this.$loop.schedule(this.CHANGE_TEXT); + }; + this.$showPrintMargin = true; /** From 5e7434bdbb65f760ff74ddc25b1af1040d53086e Mon Sep 17 00:00:00 2001 From: nightwing Date: Mon, 16 Jul 2012 00:47:47 +0400 Subject: [PATCH 19/32] update tests --- lib/ace/editor.js | 1 - lib/ace/ext/static_highlight.js | 3 +-- lib/ace/layer/text.js | 5 ++-- lib/ace/layer/text_test.js | 44 ++++++++++++++++++++++++++------- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 476a08c6..9d6a08c3 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -218,7 +218,6 @@ var Editor = function(renderer, session) { this.onChangeBreakpoint(); this.onChangeAnnotation(); this.session.getUseWrapMode() && this.renderer.adjustWrapLimit(); - this.renderer.onChangeTabSize(); this.renderer.updateFull(); this._emit("changeSession", { diff --git a/lib/ace/ext/static_highlight.js b/lib/ace/ext/static_highlight.js index aca3fd9e..08cc4004 100644 --- a/lib/ace/ext/static_highlight.js +++ b/lib/ace/ext/static_highlight.js @@ -72,11 +72,10 @@ exports.render = function(input, mode, theme, lineStart, disableGutter) { var length = session.getLength(); for(var ix = 0; ix < length; ix++) { - var lineTokens = session.getTokens(ix); stringBuilder.push("
"); if (!disableGutter) stringBuilder.push("" + (ix + lineStart) + ""); - textLayer.$renderLine(stringBuilder, 0, lineTokens, true); + textLayer.$renderLine(stringBuilder, 0, true, false); stringBuilder.push("
"); } diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index 6c0f736a..3ca19683 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -196,6 +196,7 @@ var Text = function(parentEl) { this.setSession = function(session) { this.session = session; + this.$computeTabString(); }; this.showInvisibles = false; @@ -244,8 +245,8 @@ var Text = function(parentEl) { tabContent = this.TAB_CHAR + content.substr(6); } - this.$tabStrings[" "] = "" + content + ""; - this.$tabStrings["\t"] = "" + tabContent + ""; + this.$tabStrings[" "] = "" + content + ""; + this.$tabStrings["\t"] = "" + tabContent + ""; } }; diff --git a/lib/ace/layer/text_test.js b/lib/ace/layer/text_test.js index bd4f9cbf..38708e9c 100644 --- a/lib/ace/layer/text_test.js +++ b/lib/ace/layer/text_test.js @@ -67,35 +67,61 @@ module.exports = { this.textLayer.$computeTabString(); // row with hard tabs - var row = 0; - var tokens = this.session.getTokens(row); var stringBuilder = []; - this.textLayer.$renderLine(stringBuilder, row, tokens); + this.textLayer.$renderLine(stringBuilder, 0); // row with soft tabs - row = 1; - tokens = this.session.getTokens(row); var stringBuilder2 = []; - this.textLayer.$renderLine(stringBuilder2, row, tokens); + this.textLayer.$renderLine(stringBuilder2, 1); assert.equal(stringBuilder.join(""), stringBuilder2.join("")); }, "test rendering width of ideographic space (U+3000)" : function() { this.session.setValue("\u3000"); - var tokens = this.session.getTokens(0); var stringBuilder = []; - this.textLayer.$renderLine(stringBuilder, 0, tokens, true); + this.textLayer.$renderLine(stringBuilder, 0, true); assert.equal(stringBuilder.join(""), ""); this.textLayer.setShowInvisibles(true); var stringBuilder = []; - this.textLayer.$renderLine(stringBuilder, 0, tokens, true); + this.textLayer.$renderLine(stringBuilder, 0, true); assert.equal( stringBuilder.join(""), "" + this.textLayer.SPACE_CHAR + "" + "\xB6" ); + }, + + "test rendering of indent guides" : function() { + var textLayer = this.textLayer + var EOL = "" + textLayer.EOL_CHAR + ""; + var SPACE = function(i) {return Array(i+1).join(" ")} + var TAB = function(i) {return textLayer.TAB_CHAR + SPACE(i-1)} + function testRender(results) { + for (var i = results.length; i--; ) { + var stringBuilder = []; + textLayer.$renderLine(stringBuilder, i, true); + assert.equal(stringBuilder.join(""), results[i]); + } + } + + this.session.setValue(" \n\t\tf\n "); + testRender([ + "" + SPACE(4) + "" + SPACE(2), + "" + SPACE(4) + "" + SPACE(4) + "f", + SPACE(3) + ]); + this.textLayer.setShowInvisibles(true); + testRender([ + "" + SPACE(4) + "" + SPACE(2) + EOL, + "" + TAB(4) + "" + TAB(4) + "f" + EOL, + ]); + this.textLayer.setDisplayIndentGuides(false); + testRender([ + SPACE(6) + EOL, + "" + TAB(4) + "" + TAB(4) + "f" + EOL + ]); } }; From f29e12c78f3e8712a2f12b12e5a46691403076c2 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 28 Jul 2012 16:40:09 +0400 Subject: [PATCH 20/32] fix highlighting of multiline clojure strings --- lib/ace/mode/clojure_highlight_rules.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/ace/mode/clojure_highlight_rules.js b/lib/ace/mode/clojure_highlight_rules.js index 0a42e0dc..3ac380c3 100644 --- a/lib/ace/mode/clojure_highlight_rules.js +++ b/lib/ace/mode/clojure_highlight_rules.js @@ -190,10 +190,7 @@ var ClojureHighlightRules = function() { regex : "[a-zA-Z_$][a-zA-Z0-9_$]*\\b" }, { token : "string", // single line - regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' - }, { - token : "string", // multi line - regex : '["](?:(?:\\\\.)|(?:[^"\\\\]))*?$', + regex : '"', next: "string" }, { token : "string", // symbol @@ -217,12 +214,16 @@ var ClojureHighlightRules = function() { ], "string" : [ { - token : "string", + token : "constant.language.escape", merge : true, - regex : "\\\\." + regex : "\\\\.|\\\\$" }, { token : "string", - regex : '[^"\\\\]*?"', + merge : true, + regex : '[^"\\\\]+' + }, { + token : "string", + regex : '"', next : "start" } ] From cd6ebd846719812941a62f71ea99485c28f16135 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 28 Jul 2012 16:16:10 +0400 Subject: [PATCH 21/32] improve performance of search result folding --- lib/ace/mode/folding/c9search.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/ace/mode/folding/c9search.js b/lib/ace/mode/folding/c9search.js index 2c9828de..7b8253c7 100644 --- a/lib/ace/mode/folding/c9search.js +++ b/lib/ace/mode/folding/c9search.js @@ -48,18 +48,19 @@ oop.inherits(FoldMode, BaseFoldMode); (function() { - this.foldingStartMarker = /^(\w.*\:|Searching for.*)$/; + this.foldingStartMarker = /^(\S.*\:|Searching for.*)$/; this.foldingStopMarker = /^(\s+|Found.*)$/; this.getFoldWidgetRange = function(session, foldStyle, row) { - var line = session.getLine(row); + var lines = session.doc.getAllLines(row); + var line = lines[row]; var level1 = /^(Found.*|Searching for.*)$/; - var level2 = /^(\w.*\:|\s*)$/; + var level2 = /^(\S.*\:|\s*)$/; var re = level1.test(line) ? level1 : level2; if (this.foldingStartMarker.test(line)) { for (var i = row + 1, l = session.getLength(); i < l; i++) { - if (re.test(session.getLine(i))) + if (re.test(lines[i])) break; } @@ -68,7 +69,7 @@ oop.inherits(FoldMode, BaseFoldMode); if (this.foldingStopMarker.test(line)) { for (var i = row - 1; i >= 0; i--) { - line = session.getLine(i); + line = lines[i]; if (re.test(line)) break; } From 54c0a563087381d5b837bdd5dcc4cfd419653e19 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 28 Jul 2012 20:24:27 +0400 Subject: [PATCH 22/32] cleanup search.js --- lib/ace/search.js | 77 ++++++++++++++++++++---------------------- lib/ace/search_test.js | 18 ++++++++++ 2 files changed, 54 insertions(+), 41 deletions(-) diff --git a/lib/ace/search.js b/lib/ace/search.js index c03391e2..ad3249b8 100644 --- a/lib/ace/search.js +++ b/lib/ace/search.js @@ -137,23 +137,24 @@ var Search = function() { return []; this.$assembleRegExp(options); - if (options.range) { - var range = options.range; - var lines = session.getLines(range.start.row, range.end.row); - } else - var lines = session.doc.getAllLines(); + var range = options.range; + var lines = range + ? session.getLines(range.start.row, range.end.row) + : session.doc.getAllLines(); var ranges = []; var re = options.re; if (options.$isMultiLine) { var len = re.length; var maxRow = lines.length - len; - for (var row = re.offset || 0; row < maxRow; row++) { - for (var j = 0; j < re.length; j++) + for (var row = re.offset || 0; row <= maxRow; row++) { + for (var j = 0; j < len; j++) if (lines[row + j].search(re[j]) == -1) break; - - var startIndex = lines[row + j].match(re[0])[0].length; + + var startLine = lines[row]; + var line = lines[row + len - 1]; + var startIndex = startLine.match(re[0])[0].length; var endIndex = line.match(re[len - 1])[0].length; ranges.push(new Range( @@ -167,11 +168,11 @@ var Search = function() { for (var j = 0; j < matches.length; j++) { var match = matches[j]; ranges.push(new Range(i, match.offset, i, match.offset + match.length)); - }; + } } } - if (options.range) { + if (range) { var startColumn = range.start.column; var endColumn = range.start.column; var i = 0, j = ranges.length - 1; @@ -210,7 +211,7 @@ var Search = function() { if (!match || match[0].length != input.length) return null; - replacement = input.replace(re, replacement) + replacement = input.replace(re, replacement); if (options.preserveCase) { replacement = replacement.split(""); for (var i = Math.min(input.length, input.length); i--; ) { @@ -261,21 +262,21 @@ var Search = function() { if (callback(range)) return true; - } + }; } else if (backwards) { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = matches.length-1; i >= 0; i--) if (callback(matches[i], row, startIndex)) return true; - } + }; } else { var matchIterator = function(line, row, startIndex) { var matches = lang.getMatchOffsets(line, re); for (var i = 0; i < matches.length; i++) if (callback(matches[i], row, startIndex)) return true; - } + }; } return { @@ -310,7 +311,7 @@ var Search = function() { try { var re = new RegExp(needle, modifier); } catch(e) { - var re = false; + re = false; } return options.re = re; }; @@ -333,7 +334,6 @@ var Search = function() { }; this.$lineIterator = function(session, options) { - var range = options.range; var backwards = options.backwards == true; var skipCurrent = options.skipCurrent != false; @@ -346,30 +346,9 @@ var Search = function() { start = start[skipCurrent != backwards ? "end" : "start"]; var firstRow = range ? range.start.row : 0; - var firstColumn = range ? range.start.column : 0; var lastRow = range ? range.end.row : session.getLength() - 1; - if (!backwards) { - var forEach = function(callback) { - var row = start.row; - - var line = session.getLine(row).substr(start.column); - if (callback(line, row, start.column)) - return; - - for (row = row+1; row <= lastRow; row++) - if (callback(session.getLine(row), row)) - return; - - if (options.wrap == false) - return; - - for (row = firstRow, lastRow = start.row; row <= lastRow; row++) - if (callback(session.getLine(row), row)) - return; - } - } else { - var forEach = function(callback) { + var forEach = backwards ? function(callback) { var row = start.row; var line = session.getLine(row).substring(0, start.column); @@ -386,9 +365,25 @@ var Search = function() { for (row = lastRow, firstRow = start.row; row >= firstRow; row--) if (callback(session.getLine(row), row)) return; - } - } + } : function(callback) { + var row = start.row; + var line = session.getLine(row).substr(start.column); + if (callback(line, row, start.column)) + return; + + for (row = row+1; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + + if (options.wrap == false) + return; + + for (row = firstRow, lastRow = start.row; row <= lastRow; row++) + if (callback(session.getLine(row), row)) + return; + }; + return {forEach: forEach}; }; diff --git a/lib/ace/search_test.js b/lib/ace/search_test.js index 7a28d89c..c098e905 100644 --- a/lib/ace/search_test.js +++ b/lib/ace/search_test.js @@ -339,6 +339,24 @@ module.exports = { assert.position(ranges[1].start, 2, 1); assert.position(ranges[1].end, 2, 3); }, + + + "test: find all multiline matches" : function() { + var session = new EditSession(["juhu", "juhu", "juhu", "juhu"]); + + var search = new Search().set({ + needle: "hu\nju", + wrap: true + }); + + var ranges = search.findAll(session); + + assert.equal(ranges.length, 3); + assert.position(ranges[0].start, 0, 2); + assert.position(ranges[0].end, 1, 2); + assert.position(ranges[1].start, 1, 2); + assert.position(ranges[1].end, 2, 2); + }, "test: replace() should return the replacement if the input matches the needle" : function() { var search = new Search().set({ From 22ee0d0bc88a82a9e42c9b8244012591242c55e0 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 28 Jul 2012 16:42:12 +0400 Subject: [PATCH 23/32] fix typos --- lib/ace/commands/default_commands.js | 2 ++ lib/ace/lib/net.js | 2 +- lib/ace/mouse/fold_handler.js | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/ace/commands/default_commands.js b/lib/ace/commands/default_commands.js index 415fc2e9..c2140289 100644 --- a/lib/ace/commands/default_commands.js +++ b/lib/ace/commands/default_commands.js @@ -117,11 +117,13 @@ exports.commands = [{ name: "selecttostart", bindKey: bindKey("Ctrl-Shift-Home", "Command-Shift-Up"), exec: function(editor) { editor.getSelection().selectFileStart(); }, + multiSelectAction: "forEach", readOnly: true }, { name: "gotostart", bindKey: bindKey("Ctrl-Home", "Command-Home|Command-Up"), exec: function(editor) { editor.navigateFileStart(); }, + multiSelectAction: "forEach", readOnly: true }, { name: "selectup", diff --git a/lib/ace/lib/net.js b/lib/ace/lib/net.js index 438a26a2..bdb01ab6 100644 --- a/lib/ace/lib/net.js +++ b/lib/ace/lib/net.js @@ -8,7 +8,7 @@ define(function(require, exports, module) { "use strict"; -var useragent = require("ace/lib/useragent"); +var useragent = require("./useragent"); exports.get = function (url, callback) { var xhr = exports.createXhr(); diff --git a/lib/ace/mouse/fold_handler.js b/lib/ace/mouse/fold_handler.js index 2064660e..d7b6470e 100644 --- a/lib/ace/mouse/fold_handler.js +++ b/lib/ace/mouse/fold_handler.js @@ -62,7 +62,8 @@ function FoldHandler(editor) { if (gutterRegion == "foldWidgets") { var row = e.getDocumentPosition().row; - if (editor.session.foldWidgets[row]) + var session = editor.session; + if (session.foldWidgets && session.foldWidgets[row]) editor.session.onFoldWidgetClick(row, e); e.stop(); } From 0e5b77763f6433137837d328c6edf38c6403bb56 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 28 Jul 2012 16:53:56 +0400 Subject: [PATCH 24/32] revert acc3faf42ce69d004656d3b32b1be79b95954c87 since it was not working with folding enabled --- lib/ace/css/editor.css | 6 +++++ lib/ace/virtual_renderer.js | 49 ++++++++++++++----------------------- 2 files changed, 25 insertions(+), 30 deletions(-) diff --git a/lib/ace/css/editor.css b/lib/ace/css/editor.css index 2b9967a7..f0d31f10 100644 --- a/lib/ace/css/editor.css +++ b/lib/ace/css/editor.css @@ -27,6 +27,12 @@ z-index: 4; } +.ace_gutter_active_line { + position: absolute; + left: 0; + right: 0; +} + .ace_scroller.horscroll { box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset; } diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index d9a0c241..b9abc187 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -102,6 +102,7 @@ var VirtualRenderer = function(container, theme) { this.content.className = "ace_content"; this.scroller.appendChild(this.content); + this.setHighlightGutterLine(true); this.$gutterLayer = new GutterLayer(this.$gutter); this.$gutterLayer.on("changeGutterWidth", this.onResize.bind(this, true)); this.setFadeFoldWidgets(true); @@ -468,38 +469,30 @@ var VirtualRenderer = function(container, theme) { dom.removeCssClass(this.$gutter, "ace_fade-fold-widgets"); }; - this.$highlightGutterLine = true; + this.$highlightGutterLine = false; this.setHighlightGutterLine = function(shouldHighlight) { if (this.$highlightGutterLine == shouldHighlight) return; this.$highlightGutterLine = shouldHighlight; - this.$loop.schedule(this.CHANGE_GUTTER); + if (!this.$gutterLineHighlight) { + this.$gutterLineHighlight = dom.createElement("div"); + this.$gutterLineHighlight.className = "ace_gutter_active_line"; + this.$gutter.appendChild(this.$gutterLineHighlight); + return; + } + + this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; + this.$updateGutterLineHighlight(); }; this.getHighlightGutterLine = function() { return this.$highlightGutterLine; }; - this.$updateGutterLineHighlight = function(gutterReady) { - var i = this.session.selection.lead.row; - if (i == this.$gutterLineHighlight) - return; - - if (!gutterReady) { - var lineEl, ch = this.$gutterLayer.element.children; - var index = this.$gutterLineHighlight - this.layerConfig.firstRow; - if (index >= 0 && (lineEl = ch[index])) - dom.removeCssClass(lineEl, "ace_gutter_active_line"); - - index = i - this.layerConfig.firstRow; - if (index >= 0 && (lineEl = ch[index])) - dom.addCssClass(lineEl, "ace_gutter_active_line"); - } - - this.$gutterLayer.removeGutterDecoration(this.$gutterLineHighlight, "ace_gutter_active_line"); - this.$gutterLayer.addGutterDecoration(i, "ace_gutter_active_line"); - this.$gutterLineHighlight = i; + this.$updateGutterLineHighlight = function() { + this.$gutterLineHighlight.style.top = this.$cursorLayer.$pixelPos.top - this.layerConfig.offset + "px"; + this.$gutterLineHighlight.style.height = this.layerConfig.lineHeight + "px"; }; this.$updatePrintMargin = function() { @@ -693,15 +686,13 @@ var VirtualRenderer = function(container, theme) { // update scrollbar first to not lose scroll position when gutter calls resize this.$updateScrollBar(); this.$textLayer.update(this.layerConfig); - if (this.showGutter) { - if (this.$highlightGutterLine) - this.$updateGutterLineHighlight(true); + if (this.showGutter) this.$gutterLayer.update(this.layerConfig); - } this.$markerBack.update(this.layerConfig); this.$markerFront.update(this.layerConfig); this.$cursorLayer.update(this.layerConfig); this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); return; } @@ -713,15 +704,13 @@ var VirtualRenderer = function(container, theme) { else this.$textLayer.scrollLines(this.layerConfig); - if (this.showGutter) { - if (this.$highlightGutterLine) - this.$updateGutterLineHighlight(true); + if (this.showGutter) this.$gutterLayer.update(this.layerConfig); - } this.$markerBack.update(this.layerConfig); this.$markerFront.update(this.layerConfig); this.$cursorLayer.update(this.layerConfig); this.$moveTextAreaToCursor(); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); return; } @@ -744,7 +733,7 @@ var VirtualRenderer = function(container, theme) { if (changes & this.CHANGE_CURSOR) { this.$cursorLayer.update(this.layerConfig); this.$moveTextAreaToCursor(); - this.$highlightGutterLine && this.$updateGutterLineHighlight(false); + this.$highlightGutterLine && this.$updateGutterLineHighlight(); } if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) { From 2d0b6fc49f4cffc3e895c9bb8690f88d89fc68af Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 27 Jul 2012 01:27:48 +0400 Subject: [PATCH 25/32] fix starting selection from inside selection --- lib/ace/mouse/default_handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/ace/mouse/default_handlers.js b/lib/ace/mouse/default_handlers.js index 21ca5e84..8a9b2585 100644 --- a/lib/ace/mouse/default_handlers.js +++ b/lib/ace/mouse/default_handlers.js @@ -225,7 +225,7 @@ function DefaultHandlers(mouseHandler) { var editor = this.editor; if (distance > DRAG_OFFSET) { - this.startSelect(); + this.startSelect(this.mousedownEvent.getDocumentPosition()); } else if (time - this.mousedownEvent.time > editor.getDragDelay()) { this.startDrag(); } From f97666315006ee30f9e773ae7c6072b64b563ac5 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 29 Jul 2012 15:04:40 +0400 Subject: [PATCH 26/32] remove redundant getRowHeight method --- lib/ace/edit_session.js | 14 +------------- lib/ace/layer/gutter.js | 2 +- lib/ace/test/mockrenderer.js | 4 ++-- lib/ace/virtual_renderer.js | 10 +++++----- 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/lib/ace/edit_session.js b/lib/ace/edit_session.js index b903356a..144f2aff 100644 --- a/lib/ace/edit_session.js +++ b/lib/ace/edit_session.js @@ -2029,7 +2029,7 @@ var EditSession = function(text, mode) { * - row (Number): The row number to check * * - * Returns the length of the indicated row. + * Returns number of screenrows in a wrapped line. **/ this.getRowLength = function(row) { if (!this.$useWrapMode || !this.$wrapData[row]) { @@ -2039,18 +2039,6 @@ var EditSession = function(text, mode) { } }; - /** - * EditSession.getRowHeight(config, row) -> Number - * - config (Object): An object containing a parameter indicating the `lineHeight`. - * - row (Number): The row number to check - * - * Returns the height of the indicated row. This is mostly relevant for situations where wrapping occurs, and a single line spans across multiple rows. - * - **/ - this.getRowHeight = function(config, row) { - return this.getRowLength(row) * config.lineHeight; - }; - /** internal, hide, related to: EditSession.documentToScreenColumn * EditSession.getScreenLastRowColumn(screenRow) -> Number * - screenRow (Number): The screen row to check diff --git a/lib/ace/layer/gutter.js b/lib/ace/layer/gutter.js index d30c4ba3..2bf3bc53 100644 --- a/lib/ace/layer/gutter.js +++ b/lib/ace/layer/gutter.js @@ -129,7 +129,7 @@ var Gutter = function(parentEl) { breakpoints[i] ? " ace_breakpoint " : " ", annotation.className, "' title='", annotation.text.join("\n"), - "' style='height:", this.session.getRowLength(i) * config.lineHeight, "px;'>", (i+1)); + "' style='height:", this.session.getRowLength(i) * config.lineHeight, "px;'>", (i)); if (foldWidgets) { var c = foldWidgets[i]; diff --git a/lib/ace/test/mockrenderer.js b/lib/ace/test/mockrenderer.js index 4e5c515d..91b1c1ad 100644 --- a/lib/ace/test/mockrenderer.js +++ b/lib/ace/test/mockrenderer.js @@ -115,10 +115,10 @@ MockRenderer.prototype.scrollToX = function(scrollTop) {}; MockRenderer.prototype.scrollToY = function(scrollLeft) {}; MockRenderer.prototype.scrollToLine = function(line, center) { - var lineHeight = { lineHeight: 16 }; + var lineHeight = 16; var row = 0; for (var l = 1; l < line; l++) { - row += this.session.getRowHeight(lineHeight, l-1) / lineHeight.lineHeight; + row += this.session.getRowLength(l-1); } if (center) { diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index b9abc187..6a6dae4b 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -775,7 +775,7 @@ var VirtualRenderer = function(container, theme) { // Map lines on the screen to lines in the document. var firstRowScreen, firstRowHeight; - var lineHeight = { lineHeight: this.lineHeight }; + var lineHeight = this.lineHeight; firstRow = session.screenToDocumentRow(firstRow, 0); // Check if firstRow is inside of a foldLine. If true, then use the first @@ -786,13 +786,13 @@ var VirtualRenderer = function(container, theme) { } firstRowScreen = session.documentToScreenRow(firstRow, 0); - firstRowHeight = session.getRowHeight(lineHeight, firstRow); + firstRowHeight = session.getRowLength(firstRow) * lineHeight; lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1); - minHeight = this.$size.scrollerHeight + session.getRowHeight(lineHeight, lastRow)+ + minHeight = this.$size.scrollerHeight + session.getRowLength(lastRow) * lineHeight + firstRowHeight; - offset = this.scrollTop - firstRowScreen * this.lineHeight; + offset = this.scrollTop - firstRowScreen * lineHeight; this.layerConfig = { width : longestLine, @@ -800,7 +800,7 @@ var VirtualRenderer = function(container, theme) { firstRow : firstRow, firstRowScreen: firstRowScreen, lastRow : lastRow, - lineHeight : this.lineHeight, + lineHeight : lineHeight, characterWidth : this.characterWidth, minHeight : minHeight, maxHeight : maxHeight, From abcf0d4771ff06cbee3e1a6c5003de3933872eb4 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 31 Jul 2012 20:37:33 +0400 Subject: [PATCH 27/32] fix #855 do not stop mousemove events on old browsers --- lib/ace/lib/event.js | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 87da2cb2..9d03f868 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -108,11 +108,6 @@ exports.getButton = function(e) { if (document.documentElement.setCapture) { exports.capture = function(el, eventHandler, releaseCaptureHandler) { - function onMouseMove(e) { - eventHandler(e); - return exports.stopPropagation(e); - } - var called = false; function onReleaseCapture(e) { eventHandler(e); @@ -137,22 +132,17 @@ if (document.documentElement.setCapture) { } else { exports.capture = function(el, eventHandler, releaseCaptureHandler) { - function onMouseMove(e) { - eventHandler(e); - e.stopPropagation(); - } - function onMouseUp(e) { eventHandler && eventHandler(e); releaseCaptureHandler && releaseCaptureHandler(e); - document.removeEventListener("mousemove", onMouseMove, true); + document.removeEventListener("mousemove", eventHandler, true); document.removeEventListener("mouseup", onMouseUp, true); e.stopPropagation(); } - document.addEventListener("mousemove", onMouseMove, true); + document.addEventListener("mousemove", eventHandler, true); document.addEventListener("mouseup", onMouseUp, true); }; } From a9caa1144706c011421f587f6798ad428a1492ff Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 3 Aug 2012 18:27:32 +0400 Subject: [PATCH 28/32] fix pasting in readOnly mode --- lib/ace/editor.js | 3 +++ lib/ace/multi_select.js | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/lib/ace/editor.js b/lib/ace/editor.js index 5b387f98..4cf4ef80 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -694,6 +694,9 @@ var Editor = function(renderer, session) { * called whenever a text "paste" happens. **/ this.onPaste = function(text) { + // todo this should change when paste becomes a command + if (this.$readOnly) + return; this._emit("paste", text); this.insert(text); }; diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index 9cbc5417..eeae8039 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -502,7 +502,11 @@ var Editor = require("./editor").Editor; return text; }; + // todo this should change when paste becomes a command this.onPaste = function(text) { + if (this.$readOnly) + return; + this._emit("paste", text); if (!this.inMultiSelectMode) return this.insert(text); From 94ea9a58451711412f1c7550c0313c81ed97fec9 Mon Sep 17 00:00:00 2001 From: nightwing Date: Tue, 7 Aug 2012 19:13:23 +0400 Subject: [PATCH 29/32] fix for loading of files generated by r.js from the worker --- lib/ace/worker/worker.js | 7 +++++++ lib/ace/worker/worker_client.js | 2 ++ 2 files changed, 9 insertions(+) diff --git a/lib/ace/worker/worker.js b/lib/ace/worker/worker.js index 295f90b3..b4c86649 100644 --- a/lib/ace/worker/worker.js +++ b/lib/ace/worker/worker.js @@ -56,6 +56,10 @@ require.tlns = {}; var define = function(id, deps, factory) { if (arguments.length == 2) { factory = deps; + if (typeof id != "string") { + deps = id; + id = require.id; + } } else if (arguments.length == 1) { factory = id; id = require.id; @@ -135,4 +139,7 @@ onmessage = function(e) { else if (msg.event && sender) { sender._emit(msg.event, msg.data); } + if (msg.eval) { + console.log(eval(msg.eval)); + } }; diff --git a/lib/ace/worker/worker_client.js b/lib/ace/worker/worker_client.js index 0ec7a6a3..ed1ada78 100644 --- a/lib/ace/worker/worker_client.js +++ b/lib/ace/worker/worker_client.js @@ -114,6 +114,8 @@ var WorkerClient = function(topLevelNamespaces, mod, classname) { oop.implement(this, EventEmitter); this.$normalizePath = function(path) { + if (!location.host) // needed for file:// protocol + return path; path = path.replace(/^[a-z]+:\/\/[^\/]+/, ""); // Remove domain name and rebuild it path = location.protocol + "//" + location.host // paths starting with a slash are relative to the root (host) From 45ee0cd1210803d89edf0a72c6fa9bb7061cc190 Mon Sep 17 00:00:00 2001 From: nightwing Date: Thu, 9 Aug 2012 23:41:41 +0400 Subject: [PATCH 30/32] Defer gutter refresh until cursor is rendered based on pull #866 --- lib/ace/virtual_renderer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 6a6dae4b..2b65355f 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -483,7 +483,9 @@ var VirtualRenderer = function(container, theme) { } this.$gutterLineHighlight.style.display = shouldHighlight ? "" : "none"; - this.$updateGutterLineHighlight(); + // if cursorlayer have never been updated there's nothing on screen to update + if (this.$cursorLayer.$pixelPos) + this.$updateGutterLineHighlight(); }; this.getHighlightGutterLine = function() { From a69a9f12d4412bd927d5adddd01364159aa9cb88 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 11 Aug 2012 12:12:38 +0400 Subject: [PATCH 31/32] do not create infinite loop if module has circular dependencies + cleanup --- lib/ace/worker/worker.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/ace/worker/worker.js b/lib/ace/worker/worker.js index b4c86649..2e1853df 100644 --- a/lib/ace/worker/worker.js +++ b/lib/ace/worker/worker.js @@ -35,8 +35,8 @@ var require = function(parentId, id) { var module = require.modules[id]; if (module) { if (!module.initialized) { - module.exports = module.factory().exports; module.initialized = true; + module.exports = module.factory().exports; } return module.exports; } @@ -139,7 +139,4 @@ onmessage = function(e) { else if (msg.event && sender) { sender._emit(msg.event, msg.data); } - if (msg.eval) { - console.log(eval(msg.eval)); - } }; From f6daf02be1efa282646d1f0dad2236c7d11d6b47 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sat, 11 Aug 2012 12:23:03 +0400 Subject: [PATCH 32/32] do not overwrite readme of the build --- Makefile.dryice.js | 4 ---- build | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Makefile.dryice.js b/Makefile.dryice.js index 3b53a2db..f693d6b2 100755 --- a/Makefile.dryice.js +++ b/Makefile.dryice.js @@ -153,10 +153,6 @@ function ace() { source: ACE_HOME + "/LICENSE", dest: "build/LICENSE" }); - copy({ - source: ACE_HOME + "/Readme.md", - dest: "build/Readme.md" - }); copy({ source: ACE_HOME + "/ChangeLog.txt", dest: "build/ChangeLog.txt" diff --git a/build b/build index b5354412..8f508c64 160000 --- a/build +++ b/build @@ -1 +1 @@ -Subproject commit b5354412bfeb461b7d8020423562451a81da2c85 +Subproject commit 8f508c64856878dc43cb9d0aeb028ca34ede6f5c