/*********************************************************************************** * * The MIT License (MIT) * * Copyright (c) 2013 Matthew Styles * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ***********************************************************************************/ #import NS_ASSUME_NONNULL_BEGIN /** * Constants for identifying link types we can detect */ typedef NS_ENUM(NSUInteger, KILinkType) { /** * Usernames starting with "@" token */ KILinkTypeUserHandle, /** * Hashtags starting with "#" token */ KILinkTypeHashtag, /** * URLs, http etc */ KILinkTypeURL, }; /** * Flags for specifying combinations of link types as a bitmask */ typedef NS_OPTIONS(NSUInteger, KILinkTypeOption) { /** * No links */ KILinkTypeOptionNone = 0, /** * Specifies to include KILinkTypeUserHandle links */ KILinkTypeOptionUserHandle = 1 << KILinkTypeUserHandle, /** * Specifies to include KILinkTypeHashtag links */ KILinkTypeOptionHashtag = 1 << KILinkTypeHashtag, /** * Specifies to include KILinkTypeURL links */ KILinkTypeOptionURL = 1 << KILinkTypeURL, /** * Convenience contstant to include all link types */ KILinkTypeOptionAll = NSUIntegerMax, }; @class KILabel; /** * Type for block that is called when a link is tapped * * @param label The KILabel in which the tap took place * @param string Content of the link that was tapped, includes @ or # tokens * @param range The range of the string within the label's text */ typedef void (^KILinkTapHandler)(KILabel *label, NSString *string, NSRange range); extern NSString * const KILabelLinkTypeKey; extern NSString * const KILabelRangeKey; extern NSString * const KILabelLinkKey; /** * A UILabel subclass that highlights links, hashtags and usernames and enables response to user * interactions with those links. **/ IB_DESIGNABLE @interface KILabel : UILabel /** ****************************************************************************************** ** * @name Setting the link detector ** ****************************************************************************************** **/ /** * Enable/disable automatic detection of links, hashtags and usernames. */ @property (nonatomic, assign, getter = isAutomaticLinkDetectionEnabled) IBInspectable BOOL automaticLinkDetectionEnabled; /** * Specifies the combination of link types to detect. Default value is KILinkTypeAll. */ @property (nonatomic, assign) IBInspectable KILinkTypeOption linkDetectionTypes; /** * Set containing words to be ignored as links, hashtags or usernames. * * @discussion The comparison between the matches and the ignored words is case insensitive. */ @property (nullable, nonatomic, strong) NSSet *ignoredKeywords; /** ****************************************************************************************** ** * @name Format & Appearance ** ****************************************************************************************** **/ /** * The color used to highlight selected link background. * * @discussion The default value is (0.95, 0.95, 0.95, 1.0). */ @property (nullable, nonatomic, copy) IBInspectable UIColor *selectedLinkBackgroundColor; /** * Flag sets if the sytem appearance for URLs should be used (underlined + blue color). Default value is NO. */ @property (nonatomic, assign) IBInspectable BOOL systemURLStyle; /** * Get the current attributes for the given link type. * * @param linkType The link type to get the attributes. * @return A dictionary of text attributes. * @discussion Default attributes contain colored font using the tintColor color property. */ - (nullable NSDictionary*)attributesForLinkType:(KILinkType)linkType; /** * Set the text attributes for each link type. * * @param attributes The text attributes. * @param linkType The link type. * @discussion Default attributes contain colored font using the tintColor color property. */ - (void)setAttributes:(nullable NSDictionary*)attributes forLinkType:(KILinkType)linkType; /** ****************************************************************************************** ** * @name Callbacks ** ****************************************************************************************** **/ /** * Callback block for KILinkTypeUserHandle link tap. **/ @property (nullable, nonatomic, copy) KILinkTapHandler userHandleLinkTapHandler; /** * Callback block for KILinkTypeHashtag link tap. */ @property (nullable, nonatomic, copy) KILinkTapHandler hashtagLinkTapHandler; /** * Callback block for KILinkTypeURL link tap. */ @property (nullable, nonatomic, copy) KILinkTapHandler urlLinkTapHandler; /** ****************************************************************************************** ** * @name Geometry ** ****************************************************************************************** **/ /** * Returns a dictionary of data about the link that it at the location. Returns nil if there is no link. * * A link dictionary contains the following keys: * * - **KILabelLinkTypeKey**, a TDLinkType that identifies the type of link. * - **KILabelRangeKey**, the range of the link within the label text. * - **KILabelLinkKey**, the link text. This could be an URL, handle or hashtag depending on the linkType value. * * @param point The point in the coordinates of the label view. * @return A dictionary containing the link. */ - (nullable NSDictionary*)linkAtPoint:(CGPoint)point; @end NS_ASSUME_NONNULL_END