160 lines
4.2 KiB
Objective-C
160 lines
4.2 KiB
Objective-C
//
|
|
// 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];
|
|
NSLog(@"Spelling Cache Entries %zd", count);
|
|
if (count >= kMaxEntriesCount)
|
|
{
|
|
NSLog(@"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
|