-
Notifications
You must be signed in to change notification settings - Fork 0
/
NSString+addition.m
81 lines (67 loc) · 2.95 KB
/
NSString+addition.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
// NSString+addition.m
// iVerb
//
// Created by Max on 17/02/16.
//
//
#import "NSString+addition.h"
#import "NSMutableAttributedString+addition.h"
#import "UIColor+addition.h"
@implementation NSString (addition)
- (NSAttributedString *)highlightOccurrencesOfString:(NSString *)occurence fontSize:(CGFloat)fontSize
{
NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] init];
NSDictionary * const attributes = @{ NSFontAttributeName : [UIFont systemFontOfSize:fontSize] };
NSDictionary * const boldAttributes = @{ NSFontAttributeName : [UIFont systemFontOfSize:fontSize weight:UIFontWeightHeavy] };
NSInteger index = 0;
NSRange range;
while ((range = [self rangeOfString:occurence
options:NSCaseInsensitiveSearch
range:NSMakeRange(index, self.length - index)]).location != NSNotFound) {
[attrString appendString:[self substringWithRange:NSMakeRange(index, range.location - index)]
attributes:attributes];
[attrString appendString:[self substringWithRange:range]
attributes:boldAttributes];
index = range.location + range.length;
}
[attrString appendString:[self substringWithRange:NSMakeRange(index, self.length - index)]
attributes:attributes];
return attrString;
}
- (NSAttributedString *)highlightDifferencesAgainstReference:(NSString *)referenceString
{
NSDictionary * differencesAttrs = @{ NSForegroundColorAttributeName : [UIColor errorColor] };
NSMutableString * commonLongestString = [NSMutableString string];
NSMutableString * diffentLongestString = [NSMutableString string];
NSMutableAttributedString * attrString = [[NSMutableAttributedString alloc] init];
NSUInteger length = MIN(referenceString.length, self.length);
for (NSInteger i = 0, offset = 0; i < length; ++i, ++offset) {
NSString * const s1 = [referenceString substringWithRange:NSMakeRange(i, 1)];
// If we are looking differences, allows searching into the whole remaining string
NSRange range = (diffentLongestString.length > 0) ? NSMakeRange(offset, self.length - offset) : NSMakeRange(offset, 1);
NSString * const str2 = [self substringWithRange:range];
if ([str2 containsString:s1]) {
if (diffentLongestString.length) {
[attrString appendString:diffentLongestString attributes:differencesAttrs];
diffentLongestString.string = @"";
offset = MIN(offset+1, length-2);
}
[commonLongestString appendString:s1];
} else {
if (commonLongestString.length) {
[attrString appendString:commonLongestString attributes:@{}];
commonLongestString.string = @"";
--offset;
}
[diffentLongestString appendString:s1];
}
}
[attrString appendString:commonLongestString attributes:@{}];
[attrString appendString:diffentLongestString attributes:differencesAttrs];
if (length < referenceString.length)
[attrString appendString:[referenceString substringFromIndex:length] attributes:differencesAttrs];
NSAssert([attrString.string isEqualToString:referenceString], @"");
return attrString;
}
@end