// // NTESSpellingCenter.m // NIM // // Created by amao on 13-1-21. // Copyright (c) 2013年 Netease. All rights reserved. // #import "NTESSpellingCenter.h" #import "NTESPinyinConverter.h" #define SPELLING_UNIT_FULLSPELLING @"f" #define SPELLING_UNIT_SHORTSPELLING @"s" #define SPELLING_CACHE @"sc" @implementation SpellingUnit - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_fullSpelling forKey:SPELLING_UNIT_FULLSPELLING]; [aCoder encodeObject:_shortSpelling forKey:SPELLING_UNIT_SHORTSPELLING]; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) { self.fullSpelling = [aDecoder decodeObjectForKey:SPELLING_UNIT_FULLSPELLING]; self.shortSpelling= [aDecoder decodeObjectForKey:SPELLING_UNIT_SHORTSPELLING]; } return self; } @end @interface NTESSpellingCenter () - (SpellingUnit *)calcSpellingOfString: (NSString *)source; @end @implementation NTESSpellingCenter + (NTESSpellingCenter *)sharedCenter { static NTESSpellingCenter *instance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[NTESSpellingCenter alloc]init]; }); return instance; } - (id)init { if (self = [super init]) { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *appDocumentPath= [[NSString alloc] initWithFormat:@"%@/",[paths objectAtIndex:0]]; _filepath = [appDocumentPath stringByAppendingPathComponent:SPELLING_CACHE]; _spellingCache = nil; if ([[NSFileManager defaultManager] fileExistsAtPath:_filepath]) { NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithFile:_filepath]; if ([dict isKindOfClass:[NSDictionary class]]) { _spellingCache = [[NSMutableDictionary alloc]initWithDictionary:dict]; } } if (!_spellingCache) { _spellingCache = [[NSMutableDictionary alloc]init]; } } return self; } - (void)saveSpellingCache { static const NSInteger kMaxEntriesCount = 5000; @synchronized(self) { NSInteger count = [_spellingCache count]; DDLogDebug(@"Spelling Cache Entries %zd", count); if (count >= kMaxEntriesCount) { DDLogDebug(@"Clear Spelling Cache %zd Entries",count); [_spellingCache removeAllObjects]; } if (_spellingCache) { NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_spellingCache]; [data writeToFile:_filepath atomically:YES]; } } } - (SpellingUnit *)spellingForString:(NSString *)source { if ([source length] == 0) { return nil; } SpellingUnit *spellingUnit = nil; @synchronized(self) { SpellingUnit *unit = [_spellingCache objectForKey:source]; if (!unit) { unit = [self calcSpellingOfString:source]; if ([unit.fullSpelling length] && [unit.shortSpelling length]) { [_spellingCache setObject:unit forKey:source]; } } spellingUnit = unit; } return spellingUnit; } - (NSString *)firstLetter:(NSString *)input { SpellingUnit *unit = [self spellingForString:input]; NSString *spelling = unit.fullSpelling; return [spelling length] ? [spelling substringWithRange:NSMakeRange(0, 1)] : nil; } - (SpellingUnit *)calcSpellingOfString:(NSString *)source { NSMutableString *fullSpelling = [[NSMutableString alloc]init]; NSMutableString *shortSpelling= [[NSMutableString alloc]init]; for (NSInteger i = 0; i < [source length]; i++) { NSString *word = [source substringWithRange:NSMakeRange(i, 1)]; NSString *pinyin = [[NTESPinyinConverter sharedInstance] toPinyin:word]; if ([pinyin length]) { [fullSpelling appendString:pinyin]; [shortSpelling appendString:[pinyin substringToIndex:1]]; } } SpellingUnit *unit = [[SpellingUnit alloc]init]; unit.fullSpelling = [fullSpelling lowercaseString]; unit.shortSpelling= [shortSpelling lowercaseString]; return unit; } @end