#import "WPParser.h" @implementation WPParser -(WPParser *) initWithMarkup: (NSString *) markup { [self init]; raw = [[ReadStream alloc] initWithString: markup]; return self; } -(void) parseLink { NSString *linkText, *linkHref, *text; [raw expect: '[']; [raw expect: '[']; text = [raw readUpto: ']']; [raw expect: ']']; [raw expect: ']']; NSRange range = [text rangeOfString: @"|"]; if(range.location != NSNotFound) { linkText = [text substringFromIndex: range.location + 1]; linkHref = [text substringToIndex: range.location]; } else linkText = linkHref = text; [html appendFormat: @"%@", linkHref, linkText]; } -(void) parseHeading { NSString *text; int level = 0; while([raw peek] == '=') { [raw read]; level++; } text = [raw readUpto: '=']; while([raw peek] == '=') [raw read]; [html appendFormat: @"%@", level, text, level]; } -(void) parseItalic { if(italic) { italic = NO; [html appendString: @""]; } else { italic = YES; [html appendString: @""]; } } -(void) parseBold { [raw expect: '\'']; if(bold) { bold = NO; [html appendString: @""]; } else { bold = YES; [html appendString: @""]; } } -(void) parseBoldItalic { [raw expect: '\'']; [raw expect: '\'']; if([raw peek] == '\'') [self parseBold]; else [self parseItalic]; } -(void) parseTemplateStart { [raw expect: '{']; [raw expect: '{']; tmplLevel++; } -(void) parseTemplateEnd { [raw expect: '}']; [raw expect: '}']; tmplLevel--; } -(void) parse { while(![raw isAtEnd]) { unichar c = [raw peek]; if(c == '{' && [raw peekTwo] == '{') [self parseTemplateStart]; else if(c == '}' && [raw peekTwo] == '}') [self parseTemplateEnd]; else if(tmplLevel > 0) [raw read]; else if(c == '[' && [raw peekTwo] == '[') [self parseLink]; else if ([raw peekBack] == '\n' && [raw peek] == '=') [self parseHeading]; else if(c == '\'' && [raw peekTwo] == '\'') [self parseBoldItalic]; else [html appendFormat: @"%c", [raw read]]; } } -(NSString *) parsed { html = [[NSMutableString alloc] init]; bold = NO; italic = NO; tmplLevel = 0; [self parse]; return html; } @end