Snippet #61
Language: Objective-C, Author: Vincent Esche
License: Public domain
An NSString ObjC category meant as an enhanced version of [myString capitalizedString].
It allows you to feed it with an array of words to be used with their very own capitalization (to protect words like "McCartney")
#import<Cocoa/Cocoa.h>
// Created by Vincent Esche on 13/07/08.
// Copyright 2007 Vincent Esche
// Big thanks to Norelius, whatever your real name might be :P
// Some rights reserved: <http://creativecommons.org/licenses/by/2.5/>
// Conditions: Leave a hint in te about box and source code and drop me a line.
@interface NSString (CapitalizationAdditions)
- (NSString*) capitalizedStringWithExceptions: (NSArray*) exceptions;
@end
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [NSAutoreleasePool new];
NSString *originalString = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In sit amet neque a enim sodales tempor.";
NSLog(@"Before: %@", originalString);
NSArray *wordValues = [NSArray arrayWithObjects: @"IPSUM", @"adiPISCing", @"neque", @"a", nil];
NSString *modifiedString = [originalString capitalizedStringWithExceptions:wordValues];
NSLog(@"After: %@", modifiedString);
[pool drain];
return 0;
}
@implementation NSString (CapitalizationAdditions)
- (NSString*) capitalizedStringWithExceptions: (NSArray*) exceptions
{
NSMutableString *capitalizedString = [[self capitalizedString] mutableCopy];
NSMutableDictionary *specialWords = [NSMutableDictionary dictionaryWithCapacity:[exceptions count]];
for (NSString *wordValue in exceptions) {
[specialWords setObject:wordValue forKey:[wordValue lowercaseString]];
}
CFRange stringRange = CFRangeMake(0, [capitalizedString length]);
CFLocaleRef localeRef = CFLocaleCopyCurrent();
CFStringTokenizerRef tokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, (CFStringRef)capitalizedString, stringRange, kCFStringTokenizerUnitWord, localeRef);
while (CFStringTokenizerAdvanceToNextToken(tokenizer) != kCFStringTokenizerTokenNone)
{
CFRange wordRange = CFStringTokenizerGetCurrentTokenRange(tokenizer);
NSRange tempRange = NSMakeRange(wordRange.location, wordRange.length);
NSString *tempWord = [capitalizedString substringWithRange:tempRange];
NSString *specialWord = [specialWords objectForKey:[tempWord lowercaseString]];
if (specialWord != nil) {
[capitalizedString replaceCharactersInRange:tempRange withString:specialWord];
}
}
CFRelease(tokenizer);
CFRelease(localeRef);
return [capitalizedString autorelease];
}
@endCompatible with:
- Mac OS X 10.5 PPC
- Mac OS X 10.5 Intel
Comments
Comment feed
