5 // Copyright (c) 2005 A. Karl Keller (http://karlk.net)
7 // This code is open-source, free software, made available without warranty under
8 // the terms of the GNU General Public License, either version 2 or later (see
9 // http://www.gnu.org/licenses/gpl.html or included copy); as such, it may be
10 // redistributed and/or modified in accordance with that document.
15 #import "RTKRevision.h"
16 #import "RTKStringCategory.h"
17 #import "RTKMutableAttributedStringCategory.h"
18 #import "Chomp/Chomp.h"
21 @implementation RTKRevision
25 if(self = [super init]) {
28 backTranslation = @"";
33 [self setDictionary:[NSDictionary dictionary]];
38 - (id)initWithDictionary:(NSDictionary *)dict
40 if(self = [self init]) {
41 [self setRoman:[dict objectForKey:@"roman"]];
42 [self setScript:[dict objectForKey:@"script"]];
43 [self setBackTranslation:[dict objectForKey:@"backTranslation"]];
44 [self setNotes:[dict objectForKey:@"notes"]];
45 [self setChecking:[dict objectForKey:@"checking"]];
46 [self setLocked:[[dict objectForKey:@"locked"] intValue]];
48 [self setDictionary:dict];
54 + (RTKRevision *)revisionWithDictionary:(NSDictionary *)dict
56 return [[[RTKRevision alloc] initWithDictionary:dict] autorelease];
60 - (id)initWithString:(NSString *)string
62 if(self = [self init]) {
63 NSEnumerator * e = [[string componentsSeparatedByString:[[NSUserDefaults standardUserDefaults] objectForKey:@"RTKPlainTextDelimiter"]] objectEnumerator];
65 [self setScript:[self stringFromTextSafeString:[e nextObject]]];
66 [self setRoman:[self stringFromTextSafeString:[e nextObject]]];
67 [self setBackTranslation:[self stringFromTextSafeString:[e nextObject]]];
68 [self setNotes:[self stringFromTextSafeString:[e nextObject]]];
69 [self setChecking:[self stringFromTextSafeString:[e nextObject]]];
74 + (RTKRevision *)revisionWithString:string
76 return [[[RTKRevision alloc] initWithString:string] autorelease];
80 - (id)initWithSFMString:(NSString *)string
82 if(self = [self init]) {
83 [self setRoman:string];
88 + (RTKRevision *)revisionWithSFMString:string
90 return [[[RTKRevision alloc] initWithSFMString:string] autorelease];
93 - (void)appendLine:(NSString *)line
95 [self setRoman:[NSString stringWithFormat:@"%@\n%@", roman, line]];
102 [backTranslation release];
106 [dictionary release];
114 RTKRevision * copy = [[[RTKRevision alloc] init] autorelease];
116 // Should be safe, since NSString is immutable.
117 [copy setScript:script];
118 [copy setRoman:roman];
119 [copy setBackTranslation:backTranslation];
120 [copy setNotes:notes];
121 [copy setChecking:checking];
122 [copy setLocked:locked];
124 [copy setDictionary:dictionary];
130 - (NSMutableDictionary *)dictionaryRepresentation
132 NSMutableDictionary * dict = [NSMutableDictionary dictionaryWithDictionary:dictionary];
134 [dict setObject:roman forKey:@"roman"];
135 [dict setObject:script forKey:@"script"];
136 [dict setObject:backTranslation forKey:@"backTranslation"];
137 [dict setObject:notes forKey:@"notes"];
138 [dict setObject:checking forKey:@"checking"];
139 [dict setObject:[NSNumber numberWithInt:locked] forKey:@"locked"];
145 - (NSMutableString *)textSafeStringForString:(NSString *)string;
147 NSMutableString * textSafeString = [string mutableCopy];
149 [textSafeString replaceOccurrencesOfString:[NSString stringWithFormat:@"%C", 0x2028] // LINE SEPARATOR
150 withString:[[NSUserDefaults standardUserDefaults] objectForKey:@"RTKPlainTextReturnCharacter"]
151 options:NSLiteralSearch
152 range:NSMakeRange(0,[string length])];
154 [textSafeString replaceOccurrencesOfString:@"\n" // newline
155 withString:[[NSUserDefaults standardUserDefaults] objectForKey:@"RTKPlainTextReturnCharacter"]
156 options:NSLiteralSearch
157 range:NSMakeRange(0,[string length])];
159 [textSafeString replaceOccurrencesOfString:@"\r" // return
160 withString:[[NSUserDefaults standardUserDefaults] objectForKey:@"RTKPlainTextReturnCharacter"]
161 options:NSLiteralSearch
162 range:NSMakeRange(0,[string length])];
164 return textSafeString;
168 - (NSMutableString *)stringFromTextSafeString:(NSString *)textSafeString;
170 NSMutableString * string = [textSafeString mutableCopy];
172 [string replaceOccurrencesOfString:[[NSUserDefaults standardUserDefaults] objectForKey:@"RTKPlainTextReturnCharacter"]
173 withString:@"\n" // newline -- just go with standard unix way
174 options:NSLiteralSearch
175 range:NSMakeRange(0,[string length])];
177 string = [NSMutableString stringWithString:@""]; // AKK 2012
182 - (NSString *)stringWithVerseNumber:(NSString *)verseNumber
184 NSMutableString * string = [NSMutableString new];
185 NSString * delimiter = [[NSUserDefaults standardUserDefaults] objectForKey:@"RTKPlainTextDelimiter"];
189 [string appendString:[self textSafeStringForString:[verseNumber stringByAppendingString:script]]];
190 [string appendString:delimiter];
191 [string appendString:[self textSafeStringForString:[verseNumber stringByAppendingString:roman]]];
192 [string appendString:delimiter];
193 [string appendString:[self textSafeStringForString:backTranslation]];
194 [string appendString:delimiter];
195 [string appendString:[self textSafeStringForString:notes]];
196 [string appendString:delimiter];
197 [string appendString:[self textSafeStringForString:checking]];
202 - (NSMutableAttributedString *)mutableAttributedString:(BOOL)romanString
204 // TODO: Add support for transliteration.
205 NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:(romanString ? roman : script)];
206 // Provide a link back from the string to this object.
207 [string addAttribute:@"RTKRevision" value:self];
212 - (void)setDictionary:(NSDictionary *)theDictionary
214 [theDictionary retain];
215 [dictionary release];
216 dictionary = theDictionary;
219 - (NSDictionary *)dictionary
225 - (RTKRevision *)copy
227 return [self deepCopy];
243 - (NSString *)backTranslation
245 return backTranslation;
255 - (NSString *)checking
267 - (void)setRoman:(NSString *)string
273 [[NSNotificationCenter defaultCenter] postNotificationName:@"RTKRevisionSetRoman" object:self userInfo:nil];
276 - (void)setScript:(NSString *)string
282 [[NSNotificationCenter defaultCenter] postNotificationName:@"RTKRevisionSetScript" object:self userInfo:nil];
285 - (void)setBackTranslation:(NSString *)string
288 [backTranslation release];
289 backTranslation = string;
291 [[NSNotificationCenter defaultCenter] postNotificationName:@"RTKRevisionSetBackTranslation" object:self userInfo:nil];
294 - (void)setNotes:(NSString *)string
300 [[NSNotificationCenter defaultCenter] postNotificationName:@"RTKRevisionSetNotes" object:self userInfo:nil];
303 - (void)setChecking:(NSString *)string
309 [[NSNotificationCenter defaultCenter] postNotificationName:@"RTKRevisionSetChecking" object:self userInfo:nil];
312 - (void)setLocked:(bool)state
316 [[NSNotificationCenter defaultCenter] postNotificationName:@"RTKRevisionSetLocked" object:self userInfo:nil];
320 // Returns YES if all fields are still set to default values.
323 //if(![script isEqualToString:@""])
325 if(![roman isEqualToString:@""])
327 if(![backTranslation isEqualToString:@""])
329 if(![notes isEqualToString:@""])
331 if(![checking isEqualToString:@""])
339 - (BOOL)matchesString:(NSString *)string
341 if([script containsCaseInsensitiveSubstring:string])
343 if([roman containsCaseInsensitiveSubstring:string])
345 if([backTranslation containsCaseInsensitiveSubstring:string])
347 if([notes containsCaseInsensitiveSubstring:string])
349 if([checking containsCaseInsensitiveSubstring:string])