NSString Templating

Posted by admin | Development,Objective-C | Sunday 3 January 2010 22:19

Ich hab nach einem einfachen Template System gesucht das mit NSStrings funktioniert. Ich konnte zwar diesen älteren Blogeintrag finden aber das verlinkte Disk-Image war leider nicht mehr auf dem Server zu finden. Da ich die Idee aber sehr gut fand habe ich das Interface hier einmal nachgebaut.
NSString+Template.h

//
//  NSString+Template.h
//
//  Created by Danny Thüring on 12/25/09.
//  Copyright 2009 Danny Thuering. All rights reserved.
//
 
#import 
 
@interface NSString (Template)
 
- (NSString*) stringByParsingTagsWithStartDelimeter:(NSString*)startDelim endDelimeter:(NSString*)endDelim usingObject:(id)object;
 
@end

NSString+Template.m

//
//  NSString+Template.m
//
//  Created by Danny Thüring on 12/25/09.
//  Copyright 2009 Danny Thuering. All rights reserved.
//
 
#import "NSString+Template.h"
 
@implementation NSString (Template)
 
- (NSString*) stringByParsingTagsWithStartDelimeter:(NSString*)startDelim endDelimeter:(NSString*)endDelim usingObject:(id)object {
	NSScanner *theScanner;
	NSString *text = nil;
	NSMutableString *workString = [[self mutableCopy] autorelease];
 
	theScanner = [NSScanner scannerWithString:workString];
 
	while([theScanner isAtEnd] == NO) {
		[theScanner scanUpToString:startDelim intoString:NULL];
		[theScanner scanUpToString:endDelim intoString:&text];
		NSMutableString *tmp = [text mutableCopy];
		[tmp appendString:endDelim];
		text = [text stringByReplacingOccurrencesOfString:startDelim withString:@""];
 
		workString = [[workString stringByReplacingOccurrencesOfString:tmp withString:[object valueForKey:text]] mutableCopy];
		[tmp release];
	}
 
	return workString;}
 
@end

Das NSString Objekt wird dabei durch Categories um die Funktion stringByParsingTagsWithStartDelimeter:endDelimeter:usingObject:
erweitert. Das NSString Objekt sollte dabei das Template enthalten. Die zu ersetzenden Felder müssen mit einem Start- und Endbegrenzer eingefasst sein. Zum Beispiel:

<$ text />

In dem Fall sollte @”<$ ” und @” />” als Begrenzer angegeben werden. Als Objekt kann dann ein NSDictionary übergeben werden, dass unter dem Key “text” dann den zu ersetzenden Eintrag erhält. Es können aber auch andere Objekte benutzt werden die den Wert durch Key-Value-Programmierung zurückliefern.

Share/Save/Bookmark

No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment