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]; } @end
Compatible with:
- Mac OS X 10.5 PPC
- Mac OS X 10.5 Intel
Comments
Comment feed
