From d12e5c45488df05e7019c0dd1b5e810dd00a54b6 Mon Sep 17 00:00:00 2001 From: DanyaPostfactum Date: Fri, 11 Jan 2013 16:11:14 +1000 Subject: [PATCH 1/3] Improve lang.stringRepeat function perfomance --- lib/ace/lib/lang.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/ace/lib/lang.js b/lib/ace/lib/lang.js index 4f81c842..563c7f24 100644 --- a/lib/ace/lib/lang.js +++ b/lib/ace/lib/lang.js @@ -36,7 +36,16 @@ exports.stringReverse = function(string) { }; exports.stringRepeat = function (string, count) { - return new Array(count + 1).join(string); + var result = ''; + while (count) + { + if (count & 1) + result += string; + + if (count >>= 1) + string += string; + } + return result; }; var trimBeginRegexp = /^\s\s*/; From 70f34b6b383f94c48d2ba38ebdc5f81db391c1e5 Mon Sep 17 00:00:00 2001 From: DanyaPostfactum Date: Fri, 11 Jan 2013 16:12:10 +1000 Subject: [PATCH 2/3] Display spaces, text layer little perfomance fixes --- lib/ace/layer/text.js | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/ace/layer/text.js b/lib/ace/layer/text.js index 812dd066..a54f9250 100644 --- a/lib/ace/layer/text.js +++ b/lib/ace/layer/text.js @@ -223,23 +223,25 @@ var Text = function(parentEl) { if (this.showInvisibles) { tabStr.push("" + this.TAB_CHAR - + Array(i).join(" ") + + lang.stringRepeat("\xa0", i - 1) + ""); } else { - tabStr.push(new Array(i+1).join(" ")); + tabStr.push(lang.stringRepeat("\xa0", i)); } } 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); + var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize); + var tabContent = this.TAB_CHAR + lang.stringRepeat("\xa0", this.tabSize - 1); + } else{ + var spaceContent = lang.stringRepeat("\xa0", this.tabSize); + var tabContent = spaceContent; } - this.$tabStrings[" "] = "" + content + ""; + this.$tabStrings[" "] = "" + spaceContent + ""; this.$tabStrings["\t"] = "" + tabContent + ""; } }; @@ -411,7 +413,9 @@ var Text = function(parentEl) { var replaceReg = /\t|&|<|( +)|([\x00-\x1f\x80-\xa0\u1680\u180E\u2000-\u200f\u2028\u2029\u202F\u205F\u3000\uFEFF])|[\u1100-\u115F\u11A3-\u11A7\u11FA-\u11FF\u2329-\u232A\u2E80-\u2E99\u2E9B-\u2EF3\u2F00-\u2FD5\u2FF0-\u2FFB\u3000-\u303E\u3041-\u3096\u3099-\u30FF\u3105-\u312D\u3131-\u318E\u3190-\u31BA\u31C0-\u31E3\u31F0-\u321E\u3220-\u3247\u3250-\u32FE\u3300-\u4DBF\u4E00-\uA48C\uA490-\uA4C6\uA960-\uA97C\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFAFF\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE66\uFE68-\uFE6B\uFF01-\uFF60\uFFE0-\uFFE6]/g; var replaceFunc = function(c, a, b, tabIdx, idx4) { if (a) { - return new Array(c.length+1).join(" "); + return self.showInvisibles ? + "" + lang.stringRepeat(self.SPACE_CHAR, c.length) + "" : + lang.stringRepeat("\xa0", c.length); } else if (c == "&") { return "&"; } else if (c == "<") { @@ -459,10 +463,10 @@ var Text = function(parentEl) { return value; if (value[0] == " ") { cols -= cols % this.tabSize; - stringBuilder.push(Array(cols/this.tabSize + 1).join(this.$tabStrings[" "])); + stringBuilder.push(lang.stringRepeat(this.$tabStrings[" "], cols/this.tabSize)); return value.substr(cols); } else if (value[0] == "\t") { - stringBuilder.push(Array(cols + 1).join(this.$tabStrings["\t"])); + stringBuilder.push(lang.stringRepeat(this.$tabStrings["\t"], cols)); return value.substr(cols); } return value; From 2894ecdb40de2ee0a65d2a66989a2a4a7b89c1ac Mon Sep 17 00:00:00 2001 From: nightwing Date: Fri, 11 Jan 2013 16:38:39 +0400 Subject: [PATCH 3/3] small cleanup --- lib/ace/lib/lang.js | 7 +++---- lib/ace/multi_select.js | 16 ++++++++-------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/ace/lib/lang.js b/lib/ace/lib/lang.js index 563c7f24..4e6ebf2c 100644 --- a/lib/ace/lib/lang.js +++ b/lib/ace/lib/lang.js @@ -37,13 +37,12 @@ exports.stringReverse = function(string) { exports.stringRepeat = function (string, count) { var result = ''; - while (count) - { + while (count > 0) { if (count & 1) - result += string; + result += string; if (count >>= 1) - string += string; + string += string; } return result; }; diff --git a/lib/ace/multi_select.js b/lib/ace/multi_select.js index e1ecd80c..2940b8e0 100644 --- a/lib/ace/multi_select.js +++ b/lib/ace/multi_select.js @@ -780,23 +780,23 @@ var Editor = require("./editor").Editor; return m; }).map(isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign); - function strRepeat(n, ch) { - return Array(n + 1).join(ch) + function spaces(n) { + return lang.stringRepeat(" ", n); } function alignLeft(m) { - return !m[2] ? m[0] : strRepeat(startW, " ") + m[2] - + strRepeat(textW - m[2].length + endW, " ") + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(textW - m[2].length + endW) + m[4].replace(/^([=:])\s+/, "$1 ") } function alignRight(m) { - return !m[2] ? m[0] : strRepeat(startW + textW - m[2].length, " ") + m[2] - + strRepeat(endW, " ") + return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2] + + spaces(endW, " ") + m[4].replace(/^([=:])\s+/, "$1 ") } function unAlign(m) { - return !m[2] ? m[0] : strRepeat(startW, " ") + m[2] - + strRepeat(endW, " ") + return !m[2] ? m[0] : spaces(startW) + m[2] + + spaces(endW) + m[4].replace(/^([=:])\s+/, "$1 ") } }