From 1eebbfe2bcc1a0d46a0de40359f3e620f0743088 Mon Sep 17 00:00:00 2001 From: Jeremy Ashkenas Date: Thu, 12 Aug 2010 20:24:53 -0400 Subject: [PATCH] allowing more flexible whitespace-started regexes. You have to wrap 'em in parens or assign to 'em, but it's better than nothing. --- lib/lexer.js | 9 ++++++--- src/lexer.coffee | 5 +++-- test/test_regexps.coffee | 5 +++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/lexer.js b/lib/lexer.js index 7c6e1e35..72079c55 100644 --- a/lib/lexer.js +++ b/lib/lexer.js @@ -191,8 +191,11 @@ return true; }; Lexer.prototype.regexToken = function() { - var end, flags, regex, str; - if (!(this.chunk.match(REGEX_START))) { + var _d, end, first, flags, regex, str; + if (!(first = this.chunk.match(REGEX_START))) { + return false; + } + if (first[1] === ' ' && !('CALL_START' === (_d = this.tag()) || '=' === _d)) { return false; } if (include(NOT_REGEX, this.tag())) { @@ -606,7 +609,7 @@ MULTI_DENT = /^((\n([ \t]*))+)(\.)?/; LAST_DENTS = /\n([ \t]*)/g; LAST_DENT = /\n([ \t]*)/; - REGEX_START = /^\/[^\/ ]/; + REGEX_START = /^\/([^\/])/; REGEX_INTERPOLATION = /([^\\]#\{.*[^\\]\})/; REGEX_END = /^(([imgy]{1,4})\b|\W|$)/; REGEX_ESCAPE = /\\[^\$]/g; diff --git a/src/lexer.coffee b/src/lexer.coffee index 5d8c9457..cd3c388b 100644 --- a/src/lexer.coffee +++ b/src/lexer.coffee @@ -163,7 +163,8 @@ exports.Lexer = class Lexer # JavaScript and Ruby, borrow slash balancing from `@balancedToken`, and # borrow interpolation from `@interpolateString`. regexToken: -> - return false unless @chunk.match REGEX_START + return false unless first = @chunk.match REGEX_START + return false if first[1] is ' ' and @tag() not in ['CALL_START', '='] return false if include NOT_REGEX, @tag() return false unless regex = @balancedToken ['/', '/'] return false unless end = @chunk.substr(regex.length).match REGEX_END @@ -527,7 +528,7 @@ LAST_DENTS = /\n([ \t]*)/g LAST_DENT = /\n([ \t]*)/ # Regex-matching-regexes. -REGEX_START = /^\/[^\/ ]/ +REGEX_START = /^\/([^\/])/ REGEX_INTERPOLATION = /([^\\]#\{.*[^\\]\})/ REGEX_END = /^(([imgy]{1,4})\b|\W|$)/ REGEX_ESCAPE = /\\[^\$]/g diff --git a/test/test_regexps.coffee b/test/test_regexps.coffee index 968ac2da..4b63f67a 100644 --- a/test/test_regexps.coffee +++ b/test/test_regexps.coffee @@ -20,4 +20,9 @@ obj = { } id = 2 +ok ' '.match(/ /)[0] is ' ' + +regexp = / / +ok ' '.match regexp + ok (obj.width()/id - obj.height()/id) is -5