| Index | Submit class | Submit snippet | Submission feed | List |

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:


Comments

Name

Website

Do you hate spammers? (Answer "Yes")