4 // Created by Mike Mayo on 1/28/10.
5 // Copyright Mike Mayo 2010. All rights reserved.
12 @implementation RSSParser
14 @synthesize feedItem, currentDataType, feedItems;
17 #pragma mark Date Parser
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];
29 #pragma mark XML Parser Delegate Methods
31 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
33 //Extract the attribute here.
34 //aBook.bookID = [[attributeDict objectForKey:@"id"] integerValue];
36 // if (![elementName isEqualToString:@"uri"]) {
37 // // if it's not the uri, it's a data type
38 // currentDataType = [NSString stringWithString:elementName];
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];
50 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
52 // <pubDate>Fri, 15 Jan 2010 16:16:59 -0600</pubDate>
54 if ([elementName isEqualToString:@"item"]) {
55 [self.feedItems addObject:self.feedItem];
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]];
68 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"\n" withString:@""];
69 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"\r" withString:@""];
70 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"</p><p>" withString:@"\n\n"];
71 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"<p>" withString:@""];
72 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"</p>" 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:@"&" withString:@"&"];
78 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"‘" withString:@"‘"];
79 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"’" withString:@"'"];
80 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"“" withString:@"“"];
81 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"”" withString:@"”"];
82 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@" " withString:@":"];
84 feedItem.content = [feedItem.content stringByReplacingOccurrencesOfString:@"\n" withString:@""];
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;
90 if ([feedItem.content characterAtIndex:0] == ' ' && [feedItem.content length] > 0) {
91 feedItem.content = [feedItem.content substringFromIndex:1];
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]]];
100 [currentElementValue release];
101 currentElementValue = nil;
104 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
105 if (!currentElementValue) {
106 currentElementValue = [[NSMutableString alloc] initWithString:string];
108 [currentElementValue appendString:string];
113 #pragma mark Memory Management
117 [currentDataType release];