From 7551b6da04a7fcea157e76b797f944621e8b2f69 Mon Sep 17 00:00:00 2001 From: Roman Gorbunov Date: Mon, 8 Jul 2019 03:36:24 -0700 Subject: [PATCH] Added search in text of some components Summary: Added a possibility to search for the text not only in name and id of components but also in text for all components, that conforms to a protocol Reviewed By: priteshrnandgaonkar Differential Revision: D16108297 fbshipit-source-id: 31da4ac6762c487ef644d62c9576d9eff43e8cd4 --- FlipperKit.podspec | 9 +++++++++ .../SKComponentLayoutDescriptor.mm | 19 +++++++++++++++++++ .../SKNodeDescriptor.mm | 10 +++++++++- .../FKTextSearchable.h | 13 +++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutTextSearchable/FKTextSearchable.h diff --git a/FlipperKit.podspec b/FlipperKit.podspec index 53db283e0..10c51cc76 100644 --- a/FlipperKit.podspec +++ b/FlipperKit.podspec @@ -83,9 +83,17 @@ Pod::Spec.new do |spec| "HEADER_SEARCH_PATHS" => header_search_paths } end + spec.subspec 'FlipperKitLayoutTextSearchable' do |ss| + ss.header_dir = 'FlipperKitLayoutTextSearchable' + ss.compiler_flags = folly_compiler_flags + ss.source_files = 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutTextSearchable/FKTextSearchable.h' + ss.public_header_files = 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutTextSearchable/FKTextSearchable.h' + end + spec.subspec "FlipperKitLayoutPlugin" do |ss| ss.header_dir = "FlipperKitLayoutPlugin" ss.dependency 'FlipperKit/Core' + ss.dependency 'FlipperKit/FlipperKitLayoutTextSearchable' ss.dependency 'Yoga', yoga_version ss.dependency 'YogaKit', yogakit_version ss.compiler_flags = folly_compiler_flags @@ -112,6 +120,7 @@ Pod::Spec.new do |spec| ss.dependency 'Yoga', yoga_version ss.dependency 'ComponentKit', '~> 0.27' ss.dependency 'FlipperKit/FlipperKitLayoutPlugin' + ss.dependency 'FlipperKit/FlipperKitLayoutTextSearchable' ss.compiler_flags = folly_compiler_flags ss.public_header_files = 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/FlipperKitLayoutComponentKitSupport.h', 'iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKSubDescriptor.h' diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm index 966528d8a..b6744f39a 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutComponentKitSupport/SKComponentLayoutDescriptor.mm @@ -22,6 +22,7 @@ #import #import +#import #import "SKSubDescriptor.h" #import "SKComponentLayoutWrapper.h" @@ -193,6 +194,24 @@ [touch finish]; } +- (BOOL)matchesQuery:(NSString *)query forNode:(id)node { + if ([super matchesQuery:query forNode:node]) { + return YES; + } + if ([node isKindOfClass:[SKComponentLayoutWrapper class]]) { + const auto layoutWrapper = (SKComponentLayoutWrapper *)node; + if ([layoutWrapper.component conformsToProtocol:@protocol(FKTextSearchable)]) { + NSString *text = ((id)layoutWrapper.component).searchableText; + return [self string:text contains:query]; + } + } + return NO; +} + +- (BOOL)string:(NSString *)string contains:(NSString *)substring { + return string != nil && substring != nil && [string rangeOfString: substring options: NSCaseInsensitiveSearch].location != NSNotFound; +} + @end #endif diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKNodeDescriptor.mm b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKNodeDescriptor.mm index 977e0d5a9..5d77ff462 100644 --- a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKNodeDescriptor.mm +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutPlugin/SKNodeDescriptor.mm @@ -8,6 +8,7 @@ #if FB_SONARKIT_ENABLED #import "SKNodeDescriptor.h" +#import @implementation SKNodeDescriptor { @@ -71,7 +72,13 @@ - (BOOL)matchesQuery:(NSString *)query forNode:(id)node { NSString *name = [self nameForNode: node]; - return [self string:name contains:query] || [self string:[self identifierForNode: node] contains: query]; + NSString *text = nil; + if ([node conformsToProtocol:@protocol(FKTextSearchable)]) { + text = [node searchableText]; + } + return [self string:name contains:query] || + [self string:[self identifierForNode: node] contains: query] || + [self string:text contains:query]; } - (BOOL)string:(NSString *)string contains:(NSString *)substring { @@ -80,4 +87,5 @@ @end + #endif diff --git a/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutTextSearchable/FKTextSearchable.h b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutTextSearchable/FKTextSearchable.h new file mode 100644 index 000000000..5369bc779 --- /dev/null +++ b/iOS/Plugins/FlipperKitLayoutPlugin/FlipperKitLayoutTextSearchable/FKTextSearchable.h @@ -0,0 +1,13 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. + */ +#import + +@protocol FKTextSearchable + +- (NSString *)searchableText; + +@end