From ce2809a76e08780955198c11fc63eb990cd575cf Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Fri, 11 Sep 2015 13:26:31 +0100 Subject: Move escaping regex special chars to its own utility function --- background_scripts/completion.coffee | 4 +--- content_scripts/mode_find.coffee | 5 +---- lib/utils.coffee | 6 ++++++ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/background_scripts/completion.coffee b/background_scripts/completion.coffee index fb5a6120..2427bad8 100644 --- a/background_scripts/completion.coffee +++ b/background_scripts/completion.coffee @@ -762,8 +762,6 @@ RegexpCache = init: -> @initialized = true @clear() - # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex - @escapeRegExp ||= /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g clear: -> @cache = {} @@ -777,7 +775,7 @@ RegexpCache = # TODO: `prefix` and `suffix` might be useful in richer word-relevancy scoring. get: (string, prefix="", suffix="") -> @init() unless @initialized - regexpString = string.replace(@escapeRegExp, "\\$&") + regexpString = Utils.escapeRegexSpecialCharacters string # Avoid cost of constructing new strings if prefix/suffix are empty (which is expected to be a common case). regexpString = prefix + regexpString if prefix regexpString = regexpString + suffix if suffix diff --git a/content_scripts/mode_find.coffee b/content_scripts/mode_find.coffee index 9b47cfbd..8c4286ae 100644 --- a/content_scripts/mode_find.coffee +++ b/content_scripts/mode_find.coffee @@ -132,10 +132,7 @@ class FindMode extends Mode # show a the number of results. We can grep on document.body.innerText, as it should be indistinguishable # from the internal representation used by window.find. else - # escape all special characters, so RegExp just parses the string 'as is'. - # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex - escapeRegExp = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g - parsedNonRegexQuery = @query.parsedQuery.replace(escapeRegExp, (char) -> "\\" + char) + parsedNonRegexQuery = Utils.escapeRegexSpecialCharacters @query.parsedQuery pattern = new RegExp(parsedNonRegexQuery, "g" + (if @query.ignoreCase then "i" else "")) text = document.body.innerText @query.matchCount = text.match(pattern)?.length diff --git a/lib/utils.coffee b/lib/utils.coffee index 90469fad..e0b9ba36 100644 --- a/lib/utils.coffee +++ b/lib/utils.coffee @@ -19,6 +19,12 @@ Utils = func = obj[components.pop()] func.apply(obj, argArray) + # Escape all special characters, so RegExp will parse the string 'as is'. + # Taken from http://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex + escapeRegexSpecialCharacters: do -> + escapeRegex = /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g + (str) -> str.replace escapeRegex, "\\$&" + escapeHtml: (string) -> string.replace(//g, ">") # Generates a unique ID -- cgit v1.2.3 From 011a6b01fd2d05b5e3fa0181d6b5477e105616ca Mon Sep 17 00:00:00 2001 From: mrmr1993 Date: Fri, 11 Sep 2015 13:50:47 +0100 Subject: Move repeated conditional FindMode code into one place --- content_scripts/mode_find.coffee | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/content_scripts/mode_find.coffee b/content_scripts/mode_find.coffee index 8c4286ae..e863b553 100644 --- a/content_scripts/mode_find.coffee +++ b/content_scripts/mode_find.coffee @@ -115,27 +115,27 @@ class FindMode extends Mode # default to 'smartcase' mode, unless noIgnoreCase is explicitly specified @query.ignoreCase = !hasNoIgnoreCaseFlag && !Utils.hasUpperCase(@query.parsedQuery) - # if we are dealing with a regex, grep for all matches in the text, and then call window.find() on them - # sequentially so the browser handles the scrolling / text selection. - if @query.isRegex - try - pattern = new RegExp(@query.parsedQuery, "g" + (if @query.ignoreCase then "i" else "")) - catch error - # if we catch a SyntaxError, assume the user is not done typing yet and return quietly - return - # innerText will not return the text of hidden elements, and strip out tags while preserving newlines - text = document.body.innerText - @query.regexMatches = text.match(pattern) - @query.activeRegexIndex = 0 - @query.matchCount = @query.regexMatches?.length - # if we are doing a basic plain string match, we still want to grep for matches of the string, so we can - # show a the number of results. We can grep on document.body.innerText, as it should be indistinguishable - # from the internal representation used by window.find. + regexPattern = if @query.isRegex + @query.parsedQuery else - parsedNonRegexQuery = Utils.escapeRegexSpecialCharacters @query.parsedQuery - pattern = new RegExp(parsedNonRegexQuery, "g" + (if @query.ignoreCase then "i" else "")) - text = document.body.innerText - @query.matchCount = text.match(pattern)?.length + Utils.escapeRegexSpecialCharacters @query.parsedQuery + + # If we are dealing with a regex, grep for all matches in the text, and then call window.find() on them + # sequentially so the browser handles the scrolling / text selection. + # If we are doing a basic plain string match, we still want to grep for matches of the string, so we can + # show a the number of results. + try + pattern = new RegExp regexPattern, "g#{if @query.ignoreCase then "i" else ""}" + catch error + return # If we catch a SyntaxError, assume the user is not done typing yet and return quietly. + + # innerText will not return the text of hidden elements, and strip out tags while preserving newlines. + # NOTE(mrmr1993): innerText doesn't include the text contents of s and