]> cat aescling's git repositories - mastodon.git/commitdiff
In keyword filter, account for reblogs, HTML and whole-words (#7960)
authorEugen Rochko <eugen@zeonfederated.com>
Fri, 6 Jul 2018 00:15:44 +0000 (02:15 +0200)
committerGitHub <noreply@github.com>
Fri, 6 Jul 2018 00:15:44 +0000 (02:15 +0200)
* In keyword filter, account for reblogs, HTML and whole-words

* Match whole words in JS filter, too

* Fix typo

app/javascript/mastodon/selectors/index.js
app/lib/feed_manager.rb

index 56eca1f02a81860b8a83c71d7e634206297ddbdc..ba9777eba7e10c636d2af6b2a36eadfcce63ca5c 100644 (file)
@@ -43,7 +43,7 @@ const regexFromFilters = filters => {
     return null;
   }
 
-  return new RegExp(filters.map(filter => escapeRegExp(filter.get('phrase'))).join('|'), 'i');
+  return new RegExp(filters.map(filter => escapeRegExp(filter.get('phrase'))).map(expr => `\\b${expr}\\b`).join('|'), 'i');
 };
 
 export const makeGetStatus = () => {
index efe7e2b7bb021ffaa2938e062ae312b629b37f74..55c72d0eacad836f24d5ef838586fee749e6a011 100644 (file)
@@ -200,13 +200,14 @@ class FeedManager
     active_filters = Rails.cache.fetch("filters:#{receiver_id}") { CustomFilter.where(account_id: receiver_id).active_irreversible.to_a }.to_a
 
     active_filters.select! { |filter| filter.context.include?(context.to_s) && !filter.expired? }
-    active_filters.map! { |filter| Regexp.new(Regexp.escape(filter.phrase), true) }
+    active_filters.map! { |filter| Regexp.new("\\b#{Regexp.escape(filter.phrase)}\\b", true) }
 
     return false if active_filters.empty?
 
     combined_regex = active_filters.reduce { |memo, obj| Regexp.union(memo, obj) }
+    status         = status.reblog if status.reblog?
 
-    !combined_regex.match(status.text).nil? ||
+    !combined_regex.match(Formatter.instance.plaintext(status)).nil? ||
       (status.spoiler_text.present? && !combined_regex.match(status.spoiler_text).nil?)
   end