Skip to content

Instantly share code, notes, and snippets.

@vigorouscoding
Forked from popcornylu/NSString+template.c
Last active December 11, 2015 20:29
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vigorouscoding/4655844 to your computer and use it in GitHub Desktop.
Save vigorouscoding/4655844 to your computer and use it in GitHub Desktop.
A simple templating category for NSString. I made a couple of small changes to better suit my needs. (check out the diff to see what)
#import <Foundation/Foundation.h>
@interface NSString (Templating)
+(NSString*)stringWithTemplate:(NSString*)tpl
fromMap:(NSDictionary*)map;
@end
#import "NSString+Templating.h"
@implementation NSString (Templating)
+(NSString*)stringWithTemplate:(NSString*)tpl
fromMap:(NSDictionary*)map
{
NSString* retStr = nil;
NSMutableString* buffer = [NSMutableString new];
NSScanner* scanner = [[NSScanner alloc] initWithString:tpl];
// Otherwise spaces right after a bracket expression are skipped
[scanner setCharactersToBeSkipped:nil];
NSString* tempString = nil;
while([scanner scanUpToString:@"$[" intoString:&tempString])
{
NSString* key = nil;
NSString* value = nil;
[buffer appendString:tempString];
if([scanner isAtEnd])
{
break;
}
[scanner scanString:@"$[" intoString:nil];
[scanner scanUpToString:@"]" intoString:&key];
[scanner scanString:@"]" intoString:nil];
if(key)
{
value = [map objectForKey:key];
}
if(value)
{
// just 'value' does not work for NSNumber etc
[buffer appendString:[value description]];
}
else
{
[buffer appendFormat:@"$[%@]", key];
}
}
retStr = [NSString stringWithString:buffer];
[buffer release];
[scanner release];
return retStr;
}
@end
- (void)test
{
NSString* testTemplate = @"Hello $[name], welcome to $[city].";
NSString* testString = [NSString stringWithTemplate:testTemplate fromMap:@{@"name" : @"Popcorny", @"city", @"Taipei"}];
NSLog(@"%@", testString);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment