Skip to content

Commit

Permalink
Added some NSString and NSAttributedString convenience methods.
Browse files Browse the repository at this point in the history
  • Loading branch information
Thesaurus committed Aug 14, 2015
1 parent f14288f commit a630f5a
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 12 deletions.
17 changes: 17 additions & 0 deletions NSTextFieldHyperlinks/HyperlinkTextField.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,20 @@
- (NSAttributedString *)hyperlink:(NSString *)linktext toURL:(NSURL *)linkURL;

@end

@interface NSString (HyperTextField)
- (NSAttributedString *)htf_hyperlinkToURL:(NSURL *)linkURL linkColor:(NSColor *)linkColor;
@end

@interface NSAttributedString (HyperTextField)

- (NSAttributedString *)htf_replaceSubstringWithHyperLink:(NSString *)linktext
toURL:(NSURL *)linkURL
linkColor:(NSColor *)linkColor;

- (NSAttributedString *)htf_replaceSubstring:(NSString *)linkKey
withHyperLink:(NSString *)linktext
toURL:(NSURL *)linkURL
linkColor:(NSColor *)linkColor;
@end

64 changes: 52 additions & 12 deletions NSTextFieldHyperlinks/HyperlinkTextField.m
Original file line number Diff line number Diff line change
Expand Up @@ -161,25 +161,17 @@ - (void)updateSubstring:(NSString *)linktext withHyperLinkToURL:(NSURL *)linkURL

- (void)replaceSubstring:(NSString *)linkKey withHyperLink:(NSString *)linktext toURL:(NSURL *)linkURL
{

// get substring
NSString *sourceString = self.stringValue;
NSRange linkrange = [sourceString rangeOfString:linkKey];
if (linkrange.location == NSNotFound) {
return;
}

// build the hyper link
NSAttributedString *hyperlinkString = [self hyperlink:linktext toURL:linkURL];

// get link prefix and suffix strings
NSString *linkPrefix = [sourceString substringToIndex:linkrange.location];
NSString *linkSuffix = [sourceString substringFromIndex:linkrange.location + linkrange.length];

// build new attributed string containg the hyperlink
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:linkPrefix];
[attrString appendAttributedString:hyperlinkString];
[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:linkSuffix]];
NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:sourceString];
attrString = [attrString htf_replaceSubstring:linkKey withHyperLink:linktext toURL:linkURL linkColor:self.linkColor];

// update the control attributed string value
[self setAttributedStringValue:attrString];
Expand All @@ -190,12 +182,60 @@ - (void)replaceSubstring:(NSString *)linkKey withHyperLink:(NSString *)linktext

- (NSAttributedString *)hyperlink:(NSString *)linktext toURL:(NSURL *)linkURL
{
NSMutableAttributedString *hyperlinkString = [[NSMutableAttributedString alloc] initWithString:linktext];
NSAttributedString *hyperlinkString = [linktext htf_hyperlinkToURL:linkURL linkColor:self.linkColor];

return hyperlinkString;
}
@end


@implementation NSString (HyperTextField)

- (NSAttributedString *)htf_hyperlinkToURL:(NSURL *)linkURL linkColor:(NSColor *)linkColor
{
NSMutableAttributedString *hyperlinkString = [[NSMutableAttributedString alloc] initWithString:self];
[hyperlinkString beginEditing];
[hyperlinkString addAttribute:NSLinkAttributeName value:linkURL range:NSMakeRange(0, [hyperlinkString length])];
[hyperlinkString addAttribute:NSForegroundColorAttributeName value:self.linkColor range:NSMakeRange(0, [hyperlinkString length])];
[hyperlinkString addAttribute:NSForegroundColorAttributeName value:linkColor range:NSMakeRange(0, [hyperlinkString length])];
[hyperlinkString endEditing];

return hyperlinkString;
}
@end

@implementation NSAttributedString (HyperTextField)

- (NSAttributedString *)htf_replaceSubstringWithHyperLink:(NSString *)linktext
toURL:(NSURL *)linkURL
linkColor:(NSColor *)linkColor
{
return [self htf_replaceSubstring:linktext withHyperLink:linktext toURL:linkURL linkColor:linkColor];
}

- (NSAttributedString *)htf_replaceSubstring:(NSString *)linkKey
withHyperLink:(NSString *)linktext
toURL:(NSURL *)linkURL
linkColor:(NSColor *)linkColor
{
// get substring
NSString *sourceString = self.string;
NSRange linkrange = [sourceString rangeOfString:linkKey];
if (linkrange.location == NSNotFound) {
return nil;
}

// build the hyper link
NSAttributedString *hyperlinkString = [linktext htf_hyperlinkToURL:linkURL linkColor:linkColor];

// get link prefix and suffix strings
NSString *linkPrefix = [sourceString substringToIndex:linkrange.location];
NSString *linkSuffix = [sourceString substringFromIndex:linkrange.location + linkrange.length];

// build new attributed string containg the hyperlink
NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:linkPrefix];
[attrString appendAttributedString:hyperlinkString];
[attrString appendAttributedString:[[NSAttributedString alloc] initWithString:linkSuffix]];

return attrString;
}
@end

0 comments on commit a630f5a

Please sign in to comment.