diff --git a/lib/ace/document.js b/lib/ace/document.js index b0d3811c..710bd712 100644 --- a/lib/ace/document.js +++ b/lib/ace/document.js @@ -227,7 +227,7 @@ var Document = function(text) { * [Given a range within the document, this function returns all the text within that range as a single string.]{: #Document.getTextRange.desc} * @param {Range} range The range to work with * - * + * @returns {String} **/ this.getTextRange = function(range) { if (range.start.row == range.end.row) { diff --git a/lib/ace/editor.js b/lib/ace/editor.js index b3c0030a..201eeed8 100644 --- a/lib/ace/editor.js +++ b/lib/ace/editor.js @@ -780,15 +780,27 @@ var Editor = function(renderer, session) { this.$processRow = function(cursor, rows) { + var edit = false; + var checkedRows = []; + for (var r = 0, rowCount = rows.length; r < rowCount; r++) { - var cellWidthObj = this.$findCellWidthsForBlock(cursor, rows[r]); - cellWidthObj.cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); - console.log(cellWidthObj.cellWidths) - //for widths in cell_widths_by_row: - // checked_rows.add(row_index) - // edit = adjust_row(view, edit, row_index, widths) - // row_index += 1 + var row = rows[r]; + + if (checkedRows.indexOf(row) > -1) + continue; + var cellWidthObj = this.$findCellWidthsForBlock(cursor, row); + var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths); + var rowIndex = cellWidthObj.firstRow; + + for (var w = 0, l = cellWidths.length; w < l; w++) { + var widths = cellWidths[w]; + checkedRows.push(rowIndex); + edit = this.$adjustRow(edit, rowIndex, widths); + rowIndex++; + } } + + return edit; }; this.$findCellWidthsForBlock = function(cursor, row) { @@ -913,6 +925,62 @@ var Editor = function(renderer, session) { return rowTabs; }; + this.$adjustRow = function(edit, row, widths) { + var rowTabs = this.$tabsForRow(row); + + if (rowTabs.length == 0) + return edit; + + var bias = 0, location = -1; + + // this always only contains two elements, so we're safe in the loop below + var expandedSet = this.$izip(widths, rowTabs); + + for (var i = 0, l = expandedSet.length; i < l; i++) { + var w = expandedSet[i][0], it = expandedSet[i][1]; + location += 1 + w; + it += bias; + var difference = location - it; + + if (difference == 0) + continue; + + var endTabPoint = this.textPoint(row, it); + //console.log("wot " + row + " " + " " + it + " " + endTabPoint); + var partialLine = this.session.getLine(endTabPoint) + } + + /* + end_tab_point = view.text_point(row, it) + partial_line = view.substr(view.line(end_tab_point))[0:it] + stripped_partial_line = partial_line.rstrip() + ispaces = len(partial_line) - len(stripped_partial_line) + if difference > 0: + if not edit: + edit = view.begin_edit() + #put the spaces after the tab and then delete the tab, so any insertion + #points behave as expected + view.insert(edit, end_tab_point+1, (' ' * difference) + "\t") + view.erase(edit, sublime.Region(end_tab_point, end_tab_point + 1)) + bias += difference + if difference < 0 and ispaces >= -difference: + if not edit: + edit = view.begin_edit() + view.erase(edit, sublime.Region(end_tab_point, end_tab_point + difference)) + bias += difference + */ + + return edit; + }; + + this.textPoint = function(row, col) { + var selRange = new Range(0, 0, row, col); + + var text = this.session.getTextRange(selRange); + + return text.length; + }; + // the is a (naive) Python port--but works for these purposes this.$izip_longest = function(iterables) { var longest = iterables[0].length; @@ -942,6 +1010,19 @@ var Editor = function(renderer, session) { return expandedSet; }; + // an even more (naive) Python port + this.$izip = function(widths, tabs) { + // grab the shorter size + var size = widths.length >= tabs.length ? tabs.length : widths.length; + + var expandedSet = []; + for (var i = 0; i < size; i++) { + var set = [ widths[i], tabs[i] ]; + expandedSet.push(set); + } + return expandedSet; + }; + this.onTextInput = function(text) { this.keyBinding.onTextInput(text); };