ace.define( 'ace/ext/elastic_tabstops_lite', ['require', 'exports', 'module', 'ace/editor', 'ace/config'], function (e, t, n) { 'use strict' var r = function (e) { this.$editor = e var t = this, n = [], r = !1 ;(this.onAfterExec = function () { ;(r = !1), t.processRows(n), (n = []) }), (this.onExec = function () { r = !0 }), (this.onChange = function (e) { r && (n.indexOf(e.start.row) == -1 && n.push(e.start.row), e.end.row != e.start.row && n.push(e.end.row)) }) } ;(function () { ;(this.processRows = function (e) { this.$inChange = !0 var t = [] for (var n = 0, r = e.length; n < r; n++) { var i = e[n] if (t.indexOf(i) > -1) continue var s = this.$findCellWidthsForBlock(i), o = this.$setBlockCellWidthsToMax(s.cellWidths), u = s.firstRow for (var a = 0, f = o.length; a < f; a++) { var l = o[a] t.push(u), this.$adjustRow(u, l), u++ } } this.$inChange = !1 }), (this.$findCellWidthsForBlock = function (e) { var t = [], n, r = e while (r >= 0) { n = this.$cellWidthsForRow(r) if (n.length == 0) break t.unshift(n), r-- } var i = r + 1 r = e var s = this.$editor.session.getLength() while (r < s - 1) { r++, (n = this.$cellWidthsForRow(r)) if (n.length == 0) break t.push(n) } return { cellWidths: t, firstRow: i } }), (this.$cellWidthsForRow = function (e) { var t = this.$selectionColumnsForRow(e), n = [-1].concat(this.$tabsForRow(e)), r = n .map(function (e) { return 0 }) .slice(1), i = this.$editor.session.getLine(e) for (var s = 0, o = n.length - 1; s < o; s++) { var u = n[s] + 1, a = n[s + 1], f = this.$rightmostSelectionInCell(t, a), l = i.substring(u, a) r[s] = Math.max(l.replace(/\s+$/g, '').length, f - u) } return r }), (this.$selectionColumnsForRow = function (e) { var t = [], n = this.$editor.getCursorPosition() return this.$editor.session.getSelection().isEmpty() && e == n.row && t.push(n.column), t }), (this.$setBlockCellWidthsToMax = function (e) { var t = !0, n, r, i, s = this.$izip_longest(e) for (var o = 0, u = s.length; o < u; o++) { var a = s[o] if (!a.push) { console.error(a) continue } a.push(NaN) for (var f = 0, l = a.length; f < l; f++) { var c = a[f] t && ((n = f), (i = 0), (t = !1)) if (isNaN(c)) { r = f for (var h = n; h < r; h++) e[h][o] = i t = !0 } i = Math.max(i, c) } } return e }), (this.$rightmostSelectionInCell = function (e, t) { var n = 0 if (e.length) { var r = [] for (var i = 0, s = e.length; i < s; i++) e[i] <= t ? r.push(i) : r.push(0) n = Math.max.apply(Math, r) } return n }), (this.$tabsForRow = function (e) { var t = [], n = this.$editor.session.getLine(e), r = /\t/g, i while ((i = r.exec(n)) != null) t.push(i.index) return t }), (this.$adjustRow = function (e, t) { var n = this.$tabsForRow(e) if (n.length == 0) return var r = 0, i = -1, s = this.$izip(t, n) for (var o = 0, u = s.length; o < u; o++) { var a = s[o][0], f = s[o][1] ;(i += 1 + a), (f += r) var l = i - f if (l == 0) continue var c = this.$editor.session.getLine(e).substr(0, f), h = c.replace(/\s*$/g, ''), p = c.length - h.length l > 0 && (this.$editor.session .getDocument() .insertInLine({ row: e, column: f + 1 }, Array(l + 1).join(' ') + ' '), this.$editor.session.getDocument().removeInLine(e, f, f + 1), (r += l)), l < 0 && p >= -l && (this.$editor.session.getDocument().removeInLine(e, f + l, f), (r += l)) } }), (this.$izip_longest = function (e) { if (!e[0]) return [] var t = e[0].length, n = e.length for (var r = 1; r < n; r++) { var i = e[r].length i > t && (t = i) } var s = [] for (var o = 0; o < t; o++) { var u = [] for (var r = 0; r < n; r++) e[r][o] === '' ? u.push(NaN) : u.push(e[r][o]) s.push(u) } return s }), (this.$izip = function (e, t) { var n = e.length >= t.length ? t.length : e.length, r = [] for (var i = 0; i < n; i++) { var s = [e[i], t[i]] r.push(s) } return r }) }).call(r.prototype), (t.ElasticTabstopsLite = r) var i = e('../editor').Editor e('../config').defineOptions(i.prototype, 'editor', { useElasticTabstops: { set: function (e) { e ? (this.elasticTabstops || (this.elasticTabstops = new r(this)), this.commands.on('afterExec', this.elasticTabstops.onAfterExec), this.commands.on('exec', this.elasticTabstops.onExec), this.on('change', this.elasticTabstops.onChange)) : this.elasticTabstops && (this.commands.removeListener('afterExec', this.elasticTabstops.onAfterExec), this.commands.removeListener('exec', this.elasticTabstops.onExec), this.removeListener('change', this.elasticTabstops.onChange)) }, }, }) } ) ;(function () { ace.require(['ace/ext/elastic_tabstops_lite'], function (m) { if (typeof module == 'object' && typeof exports == 'object' && module) { module.exports = m } }) })()