From d33cdfb18c4c3436d941cf96e9b7dd6775b0e3e9 Mon Sep 17 00:00:00 2001 From: John MacFarlane Date: Sat, 10 Jan 2015 22:14:40 -0800 Subject: More efficient detab. --- js/lib/blocks.js | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) (limited to 'js/lib') diff --git a/js/lib/blocks.js b/js/lib/blocks.js index b1f69eb..bd00b1a 100644 --- a/js/lib/blocks.js +++ b/js/lib/blocks.js @@ -42,23 +42,25 @@ var isBlank = function(s) { return !(reNonSpace.test(s)); }; +var tabSpaces = [' ', ' ', ' ', ' ']; + // Convert tabs to spaces on each line using a 4-space tab stop. var detabLine = function(text) { "use strict"; - if (text.indexOf('\u0000') !== -1) { - // replace NUL for security - text = text.replace(/\0/g, '\uFFFD'); - } - if (text.indexOf('\t') === -1) { - return text; - } else { - var lastStop = 0; - return text.replace(/\t/g, function(match, offset) { - var result = ' '.slice((offset - lastStop) % 4); - lastStop = offset + 1; - return result; - }); + + var start = 0; + var offset; + var lastStop = 0; + + while ((offset = text.indexOf('\t', start)) !== -1) { + var numspaces = (offset - lastStop) % 4; + var spaces = tabSpaces[numspaces]; + text = text.slice(0, offset) + spaces + text.slice(offset + 1); + lastStop = offset + numspaces; + start = lastStop; } + + return text; }; // Attempt to match a regex in string s at offset offset. @@ -245,6 +247,11 @@ var incorporateLine = function(ln, line_number) { var container = this.doc; var oldtip = this.tip; + // replace NUL characters for security + if (ln.indexOf('\u0000') !== -1) { + ln = ln.replace(/\0/g, '\uFFFD'); + } + // Convert tabs to spaces: ln = detabLine(ln); -- cgit v1.2.3