blob: 848ac468cfca4f5a30f63bb6fddd3677be5a9d34 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#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: @"<a href=\"wp://localhost/%@\">%@</a>", 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: @"<h%d>%@</h%d>", level, text, level];
}
-(void) parseItalic {
if(italic) {
italic = NO;
[html appendString: @"</i>"];
} else {
italic = YES;
[html appendString: @"<i>"];
}
}
-(void) parseBold {
[raw expect: '\''];
if(bold) {
bold = NO;
[html appendString: @"</b>"];
} else {
bold = YES;
[html appendString: @"<b>"];
}
}
-(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
|