forked from atg/Ingredients
-
Notifications
You must be signed in to change notification settings - Fork 0
/
IGKWordMembership.m
117 lines (101 loc) · 2.69 KB
/
IGKWordMembership.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//
// IGKWordMembership.m
// Ingredients
//
// Created by Alex Gordon on 02/05/2010.
// Written in 2010 by Fileability.
//
#import "IGKWordMembership.h"
@implementation IGKWordMembership
- (id)initWithCapacity:(NSUInteger)capacity
{
if (self = [super init])
{
words = [[NSHashTable alloc] initWithOptions:NSHashTableStrongMemory capacity:capacity];
}
}
- (void)addWord:(NSString *)word
{
[words addObject:word];
}
- (NSString *)addHyperlinksToPassage:(NSString *)passage
{
NSUInteger length = [passage length];
NSMutableString *newString = [[NSMutableString alloc] initWithCapacity:length];
__block NSRange previousRange = NSMakeRange(0, 0);
[passage enumerateSubstringsInRange:NSMakeRange(0, length)
options:NSStringEnumerationByWords
usingBlock:
^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
NSInteger inbetweenLength = substringRange.location - NSMaxRange(previousRange);
if (inbetweenLength > 0)
{
[newString appendString:[passage substringWithRange:NSMakeRange(NSMaxRange(previousRange), inbetweenLength)]];
}
if ([substring length] > 1 && [words containsObject:substring])
{
[newString appendString:@"<a href='http://ingr-link/"];
[newString appendString:substring];
[newString appendString:@"' class='semistealth'><span>"];
[newString appendString:substring];
[newString appendString:@"</span></a>"];
}
else
{
[newString appendString:substring];
}
previousRange = substringRange;
}];
NSInteger inbetweenLength = length - NSMaxRange(previousRange);
if (inbetweenLength > 0)
{
[newString appendString:[passage substringWithRange:NSMakeRange(NSMaxRange(previousRange), inbetweenLength)]];
}
return newString;
}
#pragma mark Singleton
static IGKWordMembership *sharedManager = nil;
+ (IGKWordMembership *)sharedManager
{
return [self sharedManagerWithCapacity:0];
}
+ (IGKWordMembership *)sharedManagerWithCapacity:(NSUInteger)capacity
{
@synchronized(self) {
if (sharedManager == nil) {
[[self alloc] initWithCapacity:capacity]; // assignment not done here
}
}
return sharedManager;
}
+ (id)allocWithZone:(NSZone *)zone
{
@synchronized(self) {
if (sharedManager == nil) {
sharedManager = [super allocWithZone:zone];
return sharedManager; // assignment and return on first allocation
}
}
return nil; //on subsequent allocation attempts return nil
}
- (id)copyWithZone:(NSZone *)zone
{
return self;
}
- (id)retain
{
return self;
}
- (unsigned)retainCount
{
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
@end