From 681a52059554c1f65fa42409e351009a41af30d4 Mon Sep 17 00:00:00 2001 From: Denis Lebedev Date: Wed, 25 Dec 2013 02:01:21 +0300 Subject: [PATCH] Add possibility to parse custom attributes --- Classes/MWFeedItem.h | 2 ++ Classes/MWFeedParser.h | 3 +++ Classes/MWFeedParser.m | 21 ++++++++++++++++++++- Classes/MWFeedParser_Private.h | 2 +- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Classes/MWFeedItem.h b/Classes/MWFeedItem.h index 47bea85..3707727 100644 --- a/Classes/MWFeedItem.h +++ b/Classes/MWFeedItem.h @@ -58,5 +58,7 @@ @property (nonatomic, copy) NSString *content; @property (nonatomic, copy) NSString *author; @property (nonatomic, copy) NSArray *enclosures; +@property (nonatomic, copy) NSDictionary *customProperties; + @end diff --git a/Classes/MWFeedParser.h b/Classes/MWFeedParser.h index d2a8a39..68fc004 100644 --- a/Classes/MWFeedParser.h +++ b/Classes/MWFeedParser.h @@ -126,6 +126,9 @@ typedef enum { FeedTypeUnknown, FeedTypeRSS, FeedTypeRSS1, FeedTypeAtom } FeedTy // Whether parsing is in progress @property (nonatomic, readonly, getter=isParsing) BOOL parsing; +// Defines custom item keys +@property (nonatomic, copy) NSArray *customKeys; + #pragma mark Public Methods // Init MWFeedParser with a URL string diff --git a/Classes/MWFeedParser.m b/Classes/MWFeedParser.m index 7d900ad..a26f2bd 100644 --- a/Classes/MWFeedParser.m +++ b/Classes/MWFeedParser.m @@ -515,7 +515,7 @@ - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName nam // New item MWFeedItem *newItem = [[MWFeedItem alloc] init]; self.item = newItem; - + self.currentCustomProperties = [[NSMutableDictionary alloc] init]; // Return return; @@ -583,6 +583,19 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName // Remove newlines and whitespace from currentText NSString *processedText = [currentText stringByRemovingNewLinesAndWhitespace]; + void (^fillCustomKeysWithBasePath)(NSString *) = ^ (NSString *path){ + [self.customKeys enumerateObjectsUsingBlock:^(id key, NSUInteger idx, BOOL *stop) { + NSString *path = [NSString stringWithFormat:@"/rss/channel/item/%@", key]; + if ([currentPath isEqualToString: path]) { + if (processedText.length > 0) { + self.currentCustomProperties[key] = processedText; + } else if (currentElementAttributes.count) { + self.currentCustomProperties[key] = currentElementAttributes; + } + } + }]; + }; + // Process switch (feedType) { case FeedTypeRSS: { @@ -603,6 +616,7 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName else if ([currentPath isEqualToString:@"/rss/channel/item/pubDate"]) { if (processedText.length > 0) item.date = [NSDate dateFromInternetDateTimeString:processedText formatHint:DateFormatHintRFC822]; processed = YES; } else if ([currentPath isEqualToString:@"/rss/channel/item/enclosure"]) { [self createEnclosureFromAttributes:currentElementAttributes andAddToItem:item]; processed = YES; } else if ([currentPath isEqualToString:@"/rss/channel/item/dc:date"]) { if (processedText.length > 0) item.date = [NSDate dateFromInternetDateTimeString:processedText formatHint:DateFormatHintRFC3339]; processed = YES; } + else if (self.customKeys.count) { fillCustomKeysWithBasePath(@"/rss/channel/item/%@"); } } // Info @@ -630,6 +644,7 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName else if ([currentPath isEqualToString:@"/rdf:RDF/item/dc:creator"]) { if (processedText.length > 0) item.author = processedText; processed = YES; } else if ([currentPath isEqualToString:@"/rdf:RDF/item/dc:date"]) { if (processedText.length > 0) item.date = [NSDate dateFromInternetDateTimeString:processedText formatHint:DateFormatHintRFC3339]; processed = YES; } else if ([currentPath isEqualToString:@"/rdf:RDF/item/enc:enclosure"]) { [self createEnclosureFromAttributes:currentElementAttributes andAddToItem:item]; processed = YES; } + else if (self.customKeys.count) { fillCustomKeysWithBasePath(@"/rdf:RDF/item/%@"); } } // Info @@ -658,6 +673,7 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName else if ([currentPath isEqualToString:@"/feed/entry/dc:creator"]) { if (processedText.length > 0) item.author = processedText; processed = YES; } else if ([currentPath isEqualToString:@"/feed/entry/published"]) { if (processedText.length > 0) item.date = [NSDate dateFromInternetDateTimeString:processedText formatHint:DateFormatHintRFC3339]; processed = YES; } else if ([currentPath isEqualToString:@"/feed/entry/updated"]) { if (processedText.length > 0) item.updated = [NSDate dateFromInternetDateTimeString:processedText formatHint:DateFormatHintRFC3339]; processed = YES; } + else if (self.customKeys.count) { fillCustomKeysWithBasePath(@"/feed/entry/%@"); } } // Info @@ -681,6 +697,9 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName if (((feedType == FeedTypeRSS || feedType == FeedTypeRSS1) && [qName isEqualToString:@"item"]) || (feedType == FeedTypeAtom && [qName isEqualToString:@"entry"])) { + if(self.currentCustomProperties.count) { + item.customProperties = self.currentCustomProperties; + } // Dispatch item to delegate [self dispatchFeedItemToDelegate]; diff --git a/Classes/MWFeedParser_Private.h b/Classes/MWFeedParser_Private.h index 4f69583..0bcd460 100644 --- a/Classes/MWFeedParser_Private.h +++ b/Classes/MWFeedParser_Private.h @@ -46,7 +46,7 @@ @property (nonatomic, strong) MWFeedItem *item; @property (nonatomic, strong) MWFeedInfo *info; @property (nonatomic, copy) NSString *pathOfElementWithXHTMLType; - +@property (nonatomic, strong) NSMutableDictionary *currentCustomProperties; #pragma mark Private Methods // Parsing Methods