Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/woip/app/WPParser.m
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