Fix bugs. Show version in settings. Update icons. Update version.
[pithos-ios] / Classes / RSSParser.m
1 //
2 //  RSSParser.m
3 //
4 //  Created by Mike Mayo on 1/28/10.
5 //  Copyright Mike Mayo 2010. All rights reserved.
6 //
7
8 #import "RSSParser.h"
9 #import "FeedItem.h"
10
11
12 @implementation RSSParser
13
14 @synthesize feedItem, currentDataType, feedItems;
15
16 #pragma mark -
17 #pragma mark Date Parser
18
19 -(NSDate *)dateFromString:(NSString *)dateString {
20         NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
21         [dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]];
22         [dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss zzzz"];
23         NSDate *date = [dateFormatter dateFromString:dateString];
24         [dateFormatter release];        
25         return date;
26 }
27
28 #pragma mark -
29 #pragma mark XML Parser Delegate Methods
30
31 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
32         
33         //Extract the attribute here.
34         //aBook.bookID = [[attributeDict objectForKey:@"id"] integerValue];
35         
36 //      if (![elementName isEqualToString:@"uri"]) {
37 //              // if it's not the uri, it's a data type
38 //              currentDataType = [NSString stringWithString:elementName];
39 //      }
40         
41         if ([elementName isEqualToString:@"rss"]) {
42                 // we're getting started, so go ahead and alloc the array
43                 self.feedItems = [NSMutableArray arrayWithCapacity:1];
44         } else if ([elementName isEqualToString:@"item"]) {
45                 self.feedItem = [[[FeedItem alloc] init] autorelease];
46                 parsingItem = YES;
47         }
48 }
49
50 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
51         
52 //      <pubDate>Fri, 15 Jan 2010 16:16:59 -0600</pubDate>
53         
54         if ([elementName isEqualToString:@"item"]) {
55                 [self.feedItems addObject:self.feedItem];
56                 parsingItem = NO;
57         } else if ([elementName isEqualToString:@"title"]) {            
58                 feedItem.title = [currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
59         } else if ([elementName isEqualToString:@"link"]) {
60                 feedItem.link = [currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
61         } else if ([elementName isEqualToString:@"guid"]) {
62                 feedItem.guid = [currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
63         } else if ([elementName isEqualToString:@"description"]) {
64                 feedItem.description = [currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
65         } else if ([elementName isEqualToString:@"content:encoded"]) {
66                 feedItem.content = [currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
67                 
68                 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"\n" withString:@""];
69                 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"\r" withString:@""];                
70         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&lt;/p&gt;&lt;p&gt;" withString:@"\n\n"];        
71         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&lt;p&gt;" withString:@""];
72         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&lt;/p&gt;" withString:@""];
73         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"</p><p>" withString:@"\n\n"];
74         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"<p>" withString:@""];
75         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"</p>" withString:@""];
76         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&amp;" withString:@"&"];
77         
78         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&#8216;" withString:@"‘"];
79         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&#8217;" withString:@"'"];
80         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&#8220;" withString:@"“"];
81         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&#8221;" withString:@"”"];
82         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"&#0160;" withString:@":"];
83
84         feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"\n" withString:@""];
85         
86         NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<[^<>]+>" options:NSRegularExpressionCaseInsensitive error:nil];
87         NSString *modifiedString = [regex stringByReplacingMatchesInString:feedItem.content options:0 range:NSMakeRange(0, [feedItem.content length]) withTemplate:@"$2$1"];
88         feedItem.content = modifiedString;
89         
90                 if ([feedItem.content characterAtIndex:0] == ' ' && [feedItem.content length] > 0) {
91                         feedItem.content = [feedItem.content substringFromIndex:1];
92                 }
93                 
94         } else if ([elementName isEqualToString:@"dc:creator"]) {
95                 feedItem.creator = [currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
96         } else if ([elementName isEqualToString:@"pubDate"]) {
97                 feedItem.pubDate = [self dateFromString:[currentElementValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
98         }
99         
100         [currentElementValue release];
101         currentElementValue = nil;      
102 }
103
104 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
105         if (!currentElementValue) {
106                 currentElementValue = [[NSMutableString alloc] initWithString:string];
107         } else {
108                 [currentElementValue appendString:string];
109         }
110 }
111
112 #pragma mark -
113 #pragma mark Memory Management
114
115 - (void)dealloc {
116         [feedItem release];
117         [currentDataType release];
118         [feedItems release];
119         [super dealloc];
120 }
121
122
123 @end