diff options
author | George Goldberg <george@gberg.me> | 2017-08-11 16:52:24 +0100 |
---|---|---|
committer | Saturnino Abril <saturnino.abril@gmail.com> | 2017-08-11 23:52:24 +0800 |
commit | e7053b971b69f5b93c8ff18f4cfdde70a82a0e8e (patch) | |
tree | 65131fdd42c99cc17aa6c6b59d903076a8f3cb4d /webapp | |
parent | 44b976886fc9c68426dafb1efd9d75c207ce4acf (diff) | |
download | chat-e7053b971b69f5b93c8ff18f4cfdde70a82a0e8e.tar.gz chat-e7053b971b69f5b93c8ff18f4cfdde70a82a0e8e.tar.bz2 chat-e7053b971b69f5b93c8ff18f4cfdde70a82a0e8e.zip |
PLT-6609: Fix hashtag highlighting of search results (#7175)
* PLT-6609: Don't highlight #hashtag.dot when searching for #hashtag
* Fix bug that broke pre-release.
Diffstat (limited to 'webapp')
-rw-r--r-- | webapp/utils/markdown.jsx | 2 | ||||
-rw-r--r-- | webapp/utils/text_formatting.jsx | 27 |
2 files changed, 23 insertions, 6 deletions
diff --git a/webapp/utils/markdown.jsx b/webapp/utils/markdown.jsx index 8733e6200..5918b1581 100644 --- a/webapp/utils/markdown.jsx +++ b/webapp/utils/markdown.jsx @@ -175,7 +175,7 @@ class MattermostMarkdownRenderer extends marked.Renderer { if (this.formattingOptions.searchPatterns) { for (const pattern of this.formattingOptions.searchPatterns) { - if (pattern.test(href)) { + if (pattern.pattern.test(href)) { output += ' search-highlight'; break; } diff --git a/webapp/utils/text_formatting.jsx b/webapp/utils/text_formatting.jsx index 33cc3242c..4602a31b2 100644 --- a/webapp/utils/text_formatting.jsx +++ b/webapp/utils/text_formatting.jsx @@ -400,7 +400,10 @@ function convertSearchTermToRegex(term) { pattern = '\\b()(' + escapeRegex(term) + ')\\b'; } - return new RegExp(pattern, 'gi'); + return { + pattern: new RegExp(pattern, 'gi'), + term + }; } export function highlightSearchTerms(text, tokens, searchPatterns) { @@ -426,7 +429,21 @@ export function highlightSearchTerms(text, tokens, searchPatterns) { // highlight existing tokens matching search terms var newTokens = new Map(); for (const [alias, token] of tokens) { - if (pattern.test(token.originalText)) { + if (pattern.pattern.test(token.originalText)) { + // If it's a Hashtag, skip it unless the search term is an exact match. + let originalText = token.originalText; + if (originalText.startsWith('#')) { + originalText = originalText.substr(1); + } + let term = pattern.term; + if (term.startsWith('#')) { + term = term.substr(1); + } + + if (alias.startsWith('$MM_HASHTAG') && originalText !== term) { + continue; + } + const index = tokens.size + newTokens.size; const newAlias = `$MM_SEARCHTERM${index}`; @@ -438,10 +455,10 @@ export function highlightSearchTerms(text, tokens, searchPatterns) { output = output.replace(alias, newAlias); } - // The pattern regexes are global, so calling pattern.test() above alters their + // The pattern regexes are global, so calling pattern.pattern.test() above alters their // state. Reset lastIndex to 0 between calls to test() to ensure it returns the // same result every time it is called with the same value of token.originalText. - pattern.lastIndex = 0; + pattern.pattern.lastIndex = 0; } // the new tokens are stashed in a separate map since we can't add objects to a map during iteration @@ -449,7 +466,7 @@ export function highlightSearchTerms(text, tokens, searchPatterns) { tokens.set(newToken[0], newToken[1]); } - output = output.replace(pattern, replaceSearchTermWithToken); + output = output.replace(pattern.pattern, replaceSearchTermWithToken); } return output; |