From a673864f38874beb4ad8d2efa09e53ff3b318a2c Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 18 Dec 2011 18:15:35 +0400 Subject: [PATCH 1/3] coffescript folding improvements (fixes #582) --- lib/ace/mode/coffee.js | 2 +- lib/ace/mode/folding/pythonic.js | 7 ++++--- lib/ace/mode/folding/pythonic_test.js | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/ace/mode/coffee.js b/lib/ace/mode/coffee.js index 39054995..6213710d 100644 --- a/lib/ace/mode/coffee.js +++ b/lib/ace/mode/coffee.js @@ -49,7 +49,7 @@ var oop = require("../lib/oop"); function Mode() { this.$tokenizer = new Tokenizer(new Rules().getRules()); this.$outdent = new Outdent(); - this.foldingRules = new PythonFoldMode("\\[|=|(=>)|(->)"); + this.foldingRules = new PythonFoldMode("=|=>|->|\\s*class [^#]*"); } oop.inherits(Mode, TextMode); diff --git a/lib/ace/mode/folding/pythonic.js b/lib/ace/mode/folding/pythonic.js index c76588a0..8237375f 100644 --- a/lib/ace/mode/folding/pythonic.js +++ b/lib/ace/mode/folding/pythonic.js @@ -41,7 +41,7 @@ var oop = require("../../lib/oop"); var BaseFoldMode = require("./fold_mode").FoldMode; var FoldMode = exports.FoldMode = function(markers) { - this.foldingStartMarker = new RegExp("(?:(\\[)|" + markers + ")(?:\\s*)(?:#.*)?$"); + this.foldingStartMarker = new RegExp("(?:([\\[{])|(" + markers + "))(?:\\s*)(?:#.*)?$"); }; oop.inherits(FoldMode, BaseFoldMode); @@ -53,8 +53,9 @@ oop.inherits(FoldMode, BaseFoldMode); if (match) { if (match[1]) return this.openingBracketBlock(session, match[1], row, match.index); - - return this.indentationBlock(session, row, match.index + 1); + if (match[2]) + return this.indentationBlock(session, row, match.index + match[2].length); + return this.indentationBlock(session, row); } } diff --git a/lib/ace/mode/folding/pythonic_test.js b/lib/ace/mode/folding/pythonic_test.js index 1b667f9b..84c00bca 100644 --- a/lib/ace/mode/folding/pythonic_test.js +++ b/lib/ace/mode/folding/pythonic_test.js @@ -52,6 +52,7 @@ module.exports = { 'stuff', ']', '[ ' + '{ ' ]); var mode = new PythonMode(); @@ -62,6 +63,7 @@ module.exports = { assert.equal(session.getFoldWidget(1), ""); assert.equal(session.getFoldWidget(2), ""); assert.equal(session.getFoldWidget(3), "start"); + assert.equal(session.getFoldWidget(4), "start"); assert.range(session.getFoldWidgetRange(0), 0, 1, 2, 0); assert.equal(session.getFoldWidgetRange(3), null); From 00bc66fd9ac76b5bbd09b9e0b2d953a5847bc537 Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 18 Dec 2011 19:03:09 +0400 Subject: [PATCH 2/3] fix regression with horizontal scrolling --- lib/ace/virtual_renderer.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/ace/virtual_renderer.js b/lib/ace/virtual_renderer.js index 536096b1..ac72835e 100644 --- a/lib/ace/virtual_renderer.js +++ b/lib/ace/virtual_renderer.js @@ -646,12 +646,14 @@ var VirtualRenderer = function(container, theme) { var scrollLeft = this.scroller.scrollLeft; if (scrollLeft > left) { + if (left < this.$padding + 2 * this.layerConfig.characterWidth) + left = 0; this.scrollToX(left); } if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) { - if (left > this.layerConfig.width) - this.$desiredScrollLeft = left + 2 * this.characterWidth; + if (left > this.layerConfig.width + 2 * this.$padding) + this.$desiredScrollLeft = left; else this.scrollToX(Math.round(left + this.characterWidth - this.$size.scrollerWidth)); } @@ -701,7 +703,7 @@ var VirtualRenderer = function(container, theme) { }; this.scrollToX = function(scrollLeft) { - if (scrollLeft <= this.$padding + 2 * this.layerConfig.characterWidth) + if (scrollLeft <= this.$padding) scrollLeft = 0; this.scroller.scrollLeft = scrollLeft; From de9370ae926b4d8dd9b4431193e6562574ecd1de Mon Sep 17 00:00:00 2001 From: nightwing Date: Sun, 18 Dec 2011 19:03:57 +0400 Subject: [PATCH 3/3] fix marker sizing --- lib/ace/layer/marker.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ace/layer/marker.js b/lib/ace/layer/marker.js index ce8a5222..51bb85b5 100644 --- a/lib/ace/layer/marker.js +++ b/lib/ace/layer/marker.js @@ -140,10 +140,11 @@ var Marker = function(parentEl) { * Draws a multi line marker, where lines span the full width */ this.drawMultiLineMarker = function(stringBuilder, range, clazz, layerConfig, type) { - // from selection start to the end of the line var padding = type === "background" ? 0 : this.$padding; + var layerWidth = layerConfig.width + 2 * this.$padding - padding; + // from selection start to the end of the line var height = layerConfig.lineHeight; - var width = Math.round(layerConfig.width - (range.start.column * layerConfig.characterWidth)); + var width = Math.round(layerWidth - (range.start.column * layerConfig.characterWidth)); var top = this.$getTop(range.start.row, layerConfig); var left = Math.round( padding + range.start.column * layerConfig.characterWidth @@ -174,12 +175,11 @@ var Marker = function(parentEl) { if (height < 0) return; top = this.$getTop(range.start.row + 1, layerConfig); - width = layerConfig.width; stringBuilder.push( "
" );