diff --git a/Classes/MWFeedParser.m b/Classes/MWFeedParser.m index 935d758..49301c8 100644 --- a/Classes/MWFeedParser.m +++ b/Classes/MWFeedParser.m @@ -467,8 +467,9 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName names else if ([currentPath isEqualToString:@"/rss/channel/item/link"]) { if (currentText.length > 0) item.link = currentText; processed = YES; } else if ([currentPath isEqualToString:@"/rss/channel/item/description"]) { if (currentText.length > 0) item.summary = currentText; processed = YES; } else if ([currentPath isEqualToString:@"/rss/channel/item/content:encoded"]) { if (currentText.length > 0) item.content = currentText; processed = YES; } - else if ([currentPath isEqualToString:@"/rss/channel/item/pubDate"]) { if (currentText.length > 0) item.date = [self dateFromRFC822String:currentText]; processed = YES; } + else if ([currentPath isEqualToString:@"/rss/channel/item/pubDate"]) { if (currentText.length > 0) item.date = [self dateFromInternetString:currentText 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 (currentText.length > 0) item.date = [self dateFromInternetString:currentText formatHint:DateFormatHintRFC3339]; processed = YES; } } // Info @@ -488,7 +489,7 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName names else if ([currentPath isEqualToString:@"/rdf:RDF/item/link"]) { if (currentText.length > 0) item.link = currentText; processed = YES; } else if ([currentPath isEqualToString:@"/rdf:RDF/item/description"]) { if (currentText.length > 0) item.summary = currentText; processed = YES; } else if ([currentPath isEqualToString:@"/rdf:RDF/item/content:encoded"]) { if (currentText.length > 0) item.content = currentText; processed = YES; } - else if ([currentPath isEqualToString:@"/rdf:RDF/item/dc:date"]) { if (currentText.length > 0) item.date = [self dateFromRFC3339String:currentText]; processed = YES; } + else if ([currentPath isEqualToString:@"/rdf:RDF/item/dc:date"]) { if (currentText.length > 0) item.date = [self dateFromInternetString:currentText formatHint:DateFormatHintRFC3339]; processed = YES; } else if ([currentPath isEqualToString:@"/rdf:RDF/item/enc:enclosure"]) { [self createEnclosureFromAttributes:currentElementAttributes andAddToItem:item]; processed = YES; } } @@ -509,8 +510,8 @@ - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName names else if ([currentPath isEqualToString:@"/feed/entry/link"]) { [self processAtomLink:currentElementAttributes andAddToMWObject:item]; processed = YES; } else if ([currentPath isEqualToString:@"/feed/entry/summary"]) { if (currentText.length > 0) item.summary = currentText; processed = YES; } else if ([currentPath isEqualToString:@"/feed/entry/content"]) { if (currentText.length > 0) item.content = currentText; processed = YES; } - else if ([currentPath isEqualToString:@"/feed/entry/published"]) { if (currentText.length > 0) item.date = [self dateFromRFC3339String:currentText]; processed = YES; } - else if ([currentPath isEqualToString:@"/feed/entry/updated"]) { if (currentText.length > 0) item.updated = [self dateFromRFC3339String:currentText]; processed = YES; } + else if ([currentPath isEqualToString:@"/feed/entry/published"]) { if (currentText.length > 0) item.date = [self dateFromInternetString:currentText formatHint:DateFormatHintRFC3339]; processed = YES; } + else if ([currentPath isEqualToString:@"/feed/entry/updated"]) { if (currentText.length > 0) item.updated = [self dateFromInternetString:currentText formatHint:DateFormatHintRFC3339]; processed = YES; } } // Info @@ -774,6 +775,22 @@ - (BOOL)processAtomLink:(NSDictionary *)attributes andAddToMWObject:(id)MWObject return NO; } +// Get a date from a string - hit (from specs) can be used to speed up +- (NSDate *)dateFromInternetString:(NSString *)dateString formatHint:(DateFormatHint)hint { + NSDate *date = nil; + if (hint != DateFormatHintRFC3339) { + // Try RFC822 first + date = [self dateFromRFC822String:dateString]; + if (!date) date = [self dateFromRFC3339String:dateString]; + } else { + // Try RFC3339 first + date = [self dateFromRFC3339String:dateString]; + if (!date) date = [self dateFromRFC822String:dateString]; + } + return date; +} + +// See http://www.faqs.org/rfcs/rfc822.html - (NSDate *)dateFromRFC822String:(NSString *)dateString { NSDate *date = nil; NSString *RFC822String = [[NSString stringWithString:dateString] uppercaseString]; @@ -811,6 +828,7 @@ - (NSDate *)dateFromRFC822String:(NSString *)dateString { return date; } +// See http://www.faqs.org/rfcs/rfc3339.html - (NSDate *)dateFromRFC3339String:(NSString *)dateString { NSDate *date = nil; NSString *RFC3339String = [[NSString stringWithString:dateString] uppercaseString]; diff --git a/Classes/MWFeedParser_Private.h b/Classes/MWFeedParser_Private.h index b7898e4..962d91b 100644 --- a/Classes/MWFeedParser_Private.h +++ b/Classes/MWFeedParser_Private.h @@ -27,7 +27,8 @@ // THE SOFTWARE. // -#import +// Date format hints for parsing date from internet string +typedef enum {DateFormatHintNone, DateFormatHintRFC822, DateFormatHintRFC3339} DateFormatHint; @interface MWFeedParser () @@ -65,6 +66,7 @@ // Misc - (BOOL)createEnclosureFromAttributes:(NSDictionary *)attributes andAddToItem:(MWFeedItem *)currentItem; - (BOOL)processAtomLink:(NSDictionary *)attributes andAddToMWObject:(id)MWObject; +- (NSDate *)dateFromInternetString:(NSString *)dateString formatHint:(DateFormatHint)hint; - (NSDate *)dateFromRFC822String:(NSString *)dateString; - (NSDate *)dateFromRFC3339String:(NSString *)dateString; diff --git a/MWFeedParser.xcodeproj/Michael.mode1v3 b/MWFeedParser.xcodeproj/Michael.mode1v3 index 62395ec..0dfdd4c 100644 --- a/MWFeedParser.xcodeproj/Michael.mode1v3 +++ b/MWFeedParser.xcodeproj/Michael.mode1v3 @@ -209,7 +209,7 @@ ChosenToolbarItems active-executable-popup - active-platform-popup + active-combo-popup active-buildstyle-popup NSToolbarFlexibleSpaceItem debugger-enable-breakpoints @@ -302,7 +302,7 @@ 269 RubberWindowFrame - 229 264 1378 772 0 0 1920 1178 + 275 196 1378 772 0 0 1920 1178 Module PBXSmartGroupTreeModule @@ -332,31 +332,31 @@ _historyCapacity 0 bookmark - 4C618F5412261B2100ECDD2B + 4C79458C122F09AF00D521CE history 4CAA7A0411A409C60009078E 4C65F37212086A6900606CFC - 4C65F37612086B5C00606CFC - 4C65F37812086B5C00606CFC - 4C7FF962120EA25800D73C3C - 4C7FF963120EA25800D73C3C 4CE21DB71215DFDC00A39C07 - 4C481A891215EDD8002DD3DD - 4C481B0C1215FAAD002DD3DD 4C481B261215FBDA002DD3DD 4C481B281215FBDA002DD3DD 4CDD6CE712218E7E008A0D7C 4CDD6CE812218E7E008A0D7C - 4CDD6CEB12218E7E008A0D7C - 4CDD6D1F12219536008A0D7C - 4CDD6D231221961C008A0D7C 4C618F4812261B1200ECDD2B - 4C618F4912261B1200ECDD2B - 4C618F4A12261B1200ECDD2B - 4C618F4B12261B1200ECDD2B - 4C618F4C12261B1200ECDD2B - 4C618F4D12261B1200ECDD2B + 4C79457B122F093E00D521CE + 4C79457C122F093E00D521CE + 4C79457D122F093E00D521CE + 4C79457E122F093E00D521CE + 4C79457F122F093E00D521CE + 4C794580122F093E00D521CE + 4C794581122F093E00D521CE + 4C794582122F093E00D521CE + 4C794583122F093E00D521CE + 4C794584122F093E00D521CE + 4C794585122F093E00D521CE + 4C794586122F093E00D521CE + 4C794587122F093E00D521CE + 4C794588122F093E00D521CE SplitCount @@ -370,7 +370,7 @@ Frame {{0, 0}, {1087, 726}} RubberWindowFrame - 229 264 1378 772 0 0 1920 1178 + 275 196 1378 772 0 0 1920 1178 Module PBXNavigatorGroup @@ -390,7 +390,7 @@ Frame {{0, 731}, {1087, 0}} RubberWindowFrame - 229 264 1378 772 0 0 1920 1178 + 275 196 1378 772 0 0 1920 1178 Module XCDetailModule @@ -414,9 +414,9 @@ TableOfContents - 4C618F4F12261B1200ECDD2B + 4C794560122F04CB00D521CE 1CE0B1FE06471DED0097A5F4 - 4C618F5012261B1200ECDD2B + 4C794561122F04CB00D521CE 1CE0B20306471E060097A5F4 1CE0B20506471E060097A5F4 @@ -554,16 +554,15 @@ 5 WindowOrderList - 4C618F5212261B1200ECDD2B - 4C618F5312261B1200ECDD2B + 4C79456A122F04CB00D521CE + 4C79456B122F04CB00D521CE 1C78EAAD065D492600B07095 1CD10A99069EF8BA00B06720 - 4C618F4012261A4900ECDD2B 4CC895FE119F0CCB00ED61B6 /Users/Michael/My Work/d3i/Projects/MWFeedParser/MWFeedParser.xcodeproj WindowString - 229 264 1378 772 0 0 1920 1178 + 275 196 1378 772 0 0 1920 1178 WindowToolsV3 @@ -601,8 +600,6 @@ 402pt - BecomeActive - ContentConfiguration PBXProjectModuleGUID @@ -642,7 +639,7 @@ TableOfContents 4CC895FE119F0CCB00ED61B6 - 4C618F3712261A4900ECDD2B + 4C794562122F04CB00D521CE 1CD0528F0623707200166675 XCMainBuildResultsModuleGUID @@ -686,8 +683,8 @@ yes sizes - {{0, 0}, {757, 361}} - {{757, 0}, {671, 361}} + {{0, 0}, {757, 368}} + {{757, 0}, {671, 368}} VerticalSplitView @@ -702,8 +699,8 @@ yes sizes - {{0, 0}, {1428, 361}} - {{0, 361}, {1428, 342}} + {{0, 0}, {1428, 368}} + {{0, 368}, {1428, 335}} @@ -736,7 +733,7 @@ 441 Frame - {{757, 0}, {671, 361}} + {{757, 0}, {671, 368}} RubberWindowFrame 246 279 1428 744 0 0 1920 1178 @@ -764,13 +761,13 @@ TableOfContents 1CD10A99069EF8BA00B06720 - 4C618F3812261A4900ECDD2B + 4C794563122F04CB00D521CE 1C162984064C10D400B95A72 - 4C618F3912261A4900ECDD2B - 4C618F3A12261A4900ECDD2B - 4C618F3B12261A4900ECDD2B - 4C618F3C12261A4900ECDD2B - 4C618F3D12261A4900ECDD2B + 4C794564122F04CB00D521CE + 4C794565122F04CB00D521CE + 4C794566122F04CB00D521CE + 4C794567122F04CB00D521CE + 4C794568122F04CB00D521CE ToolbarConfiguration xcode.toolbar.config.debugV3 @@ -926,7 +923,7 @@ TableOfContents 1C78EAAD065D492600B07095 - 4C618F3E12261A4900ECDD2B + 4C794569122F04CB00D521CE 1C78EAAC065D492600B07095 ToolbarConfiguration diff --git a/MWFeedParser.xcodeproj/Michael.pbxuser b/MWFeedParser.xcodeproj/Michael.pbxuser index 4d3ef55..d5aae0b 100644 --- a/MWFeedParser.xcodeproj/Michael.pbxuser +++ b/MWFeedParser.xcodeproj/Michael.pbxuser @@ -9,9 +9,9 @@ }; 1D3623250D0F684500981E51 /* MWFeedParserAppDelegate.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1088, 741}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 845}}"; sepNavSelRange = "{555, 0}"; - sepNavVisRange = "{0, 895}"; + sepNavVisRange = "{0, 2060}"; }; }; 1D6058900D05DD3D006BFB54 /* MWFeedParser */ = { @@ -115,32 +115,32 @@ PBXFileDataSource_Warnings_ColumnID, ); }; - PBXPerProjectTemplateStateSaveDate = 304486516; - PBXWorkspaceStateSaveDate = 304486516; + PBXPerProjectTemplateStateSaveDate = 305069726; + PBXWorkspaceStateSaveDate = 305069726; }; perUserProjectItems = { - 4C481A891215EDD8002DD3DD /* PBXTextBookmark */ = 4C481A891215EDD8002DD3DD /* PBXTextBookmark */; - 4C481B0C1215FAAD002DD3DD /* PBXTextBookmark */ = 4C481B0C1215FAAD002DD3DD /* PBXTextBookmark */; 4C481B261215FBDA002DD3DD /* PlistBookmark */ = 4C481B261215FBDA002DD3DD /* PlistBookmark */; 4C481B281215FBDA002DD3DD /* PBXTextBookmark */ = 4C481B281215FBDA002DD3DD /* PBXTextBookmark */; 4C618F4812261B1200ECDD2B /* PBXTextBookmark */ = 4C618F4812261B1200ECDD2B /* PBXTextBookmark */; - 4C618F4912261B1200ECDD2B /* PBXTextBookmark */ = 4C618F4912261B1200ECDD2B /* PBXTextBookmark */; - 4C618F4A12261B1200ECDD2B /* PBXTextBookmark */ = 4C618F4A12261B1200ECDD2B /* PBXTextBookmark */; - 4C618F4B12261B1200ECDD2B /* PBXTextBookmark */ = 4C618F4B12261B1200ECDD2B /* PBXTextBookmark */; - 4C618F4C12261B1200ECDD2B /* PBXTextBookmark */ = 4C618F4C12261B1200ECDD2B /* PBXTextBookmark */; - 4C618F4D12261B1200ECDD2B /* PBXTextBookmark */ = 4C618F4D12261B1200ECDD2B /* PBXTextBookmark */; - 4C618F5412261B2100ECDD2B /* PBXTextBookmark */ = 4C618F5412261B2100ECDD2B /* PBXTextBookmark */; 4C65F37212086A6900606CFC /* PBXTextBookmark */ = 4C65F37212086A6900606CFC /* PBXTextBookmark */; - 4C65F37612086B5C00606CFC /* PBXTextBookmark */ = 4C65F37612086B5C00606CFC /* PBXTextBookmark */; - 4C65F37812086B5C00606CFC /* PBXTextBookmark */ = 4C65F37812086B5C00606CFC /* PBXTextBookmark */; - 4C7FF962120EA25800D73C3C /* PBXTextBookmark */ = 4C7FF962120EA25800D73C3C /* PBXTextBookmark */; - 4C7FF963120EA25800D73C3C /* PBXTextBookmark */ = 4C7FF963120EA25800D73C3C /* PBXTextBookmark */; + 4C79457B122F093E00D521CE /* PBXTextBookmark */ = 4C79457B122F093E00D521CE /* PBXTextBookmark */; + 4C79457C122F093E00D521CE /* PBXTextBookmark */ = 4C79457C122F093E00D521CE /* PBXTextBookmark */; + 4C79457D122F093E00D521CE /* PBXTextBookmark */ = 4C79457D122F093E00D521CE /* PBXTextBookmark */; + 4C79457E122F093E00D521CE /* PBXTextBookmark */ = 4C79457E122F093E00D521CE /* PBXTextBookmark */; + 4C79457F122F093E00D521CE /* PBXTextBookmark */ = 4C79457F122F093E00D521CE /* PBXTextBookmark */; + 4C794580122F093E00D521CE /* PBXTextBookmark */ = 4C794580122F093E00D521CE /* PBXTextBookmark */; + 4C794581122F093E00D521CE /* PBXTextBookmark */ = 4C794581122F093E00D521CE /* PBXTextBookmark */; + 4C794582122F093E00D521CE /* PBXTextBookmark */ = 4C794582122F093E00D521CE /* PBXTextBookmark */; + 4C794583122F093E00D521CE /* PBXTextBookmark */ = 4C794583122F093E00D521CE /* PBXTextBookmark */; + 4C794584122F093E00D521CE /* PBXTextBookmark */ = 4C794584122F093E00D521CE /* PBXTextBookmark */; + 4C794585122F093E00D521CE /* PBXTextBookmark */ = 4C794585122F093E00D521CE /* PBXTextBookmark */; + 4C794586122F093E00D521CE /* PBXTextBookmark */ = 4C794586122F093E00D521CE /* PBXTextBookmark */; + 4C794587122F093E00D521CE /* PBXTextBookmark */ = 4C794587122F093E00D521CE /* PBXTextBookmark */; + 4C794588122F093E00D521CE /* PBXTextBookmark */ = 4C794588122F093E00D521CE /* PBXTextBookmark */; + 4C79458C122F09AF00D521CE /* PBXTextBookmark */ = 4C79458C122F09AF00D521CE /* PBXTextBookmark */; 4CAA7A0411A409C60009078E /* PBXTextBookmark */ = 4CAA7A0411A409C60009078E /* PBXTextBookmark */; 4CDD6CE712218E7E008A0D7C /* PBXTextBookmark */ = 4CDD6CE712218E7E008A0D7C /* PBXTextBookmark */; 4CDD6CE812218E7E008A0D7C /* PBXTextBookmark */ = 4CDD6CE812218E7E008A0D7C /* PBXTextBookmark */; - 4CDD6CEB12218E7E008A0D7C /* PBXTextBookmark */ = 4CDD6CEB12218E7E008A0D7C /* PBXTextBookmark */; - 4CDD6D1F12219536008A0D7C /* PBXTextBookmark */ = 4CDD6D1F12219536008A0D7C /* PBXTextBookmark */; - 4CDD6D231221961C008A0D7C /* PBXTextBookmark */ = 4CDD6D231221961C008A0D7C /* PBXTextBookmark */; 4CE21DB71215DFDC00A39C07 /* PBXTextBookmark */ = 4CE21DB71215DFDC00A39C07 /* PBXTextBookmark */; }; sourceControlManager = 4CC89600119F0CCB00ED61B6 /* Source Control */; @@ -154,26 +154,6 @@ sepNavVisRange = "{0, 360}"; }; }; - 4C481A891215EDD8002DD3DD /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4C65F2EA12085ACE00606CFC /* GTMNSString+HTML.m */; - name = "GTMNSString+HTML.m: 450"; - rLen = 49; - rLoc = 10945; - rType = 0; - vrLen = 2316; - vrLoc = 8598; - }; - 4C481B0C1215FAAD002DD3DD /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CC89610119F0D0C00ED61B6 /* RootViewController.h */; - name = "RootViewController.h: 25"; - rLen = 14; - rLoc = 489; - rType = 0; - vrLen = 511; - vrLoc = 0; - }; 4C481B261215FBDA002DD3DD /* PlistBookmark */ = { isa = PlistBookmark; fRef = 8D1107310486CEB800E47090 /* MWFeedParser-Info.plist */; @@ -205,99 +185,39 @@ vrLen = 1997; vrLoc = 0; }; - 4C618F4912261B1200ECDD2B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CAD0E1111DA03BD0086F5F8 /* DetailTableViewController.m */; - name = "DetailTableViewController.m: 115"; - rLen = 0; - rLoc = 3023; - rType = 0; - vrLen = 2039; - vrLoc = 2062; - }; - 4C618F4A12261B1200ECDD2B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CAA79C911A406890009078E /* MWFeedParser_Private.h */; - name = "MWFeedParser_Private.h: 15"; - rLen = 0; - rLoc = 269; - rType = 0; - vrLen = 1533; - vrLoc = 0; - }; - 4C618F4B12261B1200ECDD2B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CC89603119F0CED00ED61B6 /* MWFeedParser.h */; - name = "MWFeedParser.h: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 1699; - vrLoc = 0; - }; - 4C618F4C12261B1200ECDD2B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CC89604119F0CED00ED61B6 /* MWFeedParser.m */; - name = "MWFeedParser.m: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 2090; - vrLoc = 0; - }; - 4C618F4D12261B1200ECDD2B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CC89611119F0D0C00ED61B6 /* RootViewController.m */; - name = "RootViewController.m: 43"; - rLen = 0; - rLoc = 1254; - rType = 0; - vrLen = 2357; - vrLoc = 345; - }; - 4C618F5412261B2100ECDD2B /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4CC89611119F0D0C00ED61B6 /* RootViewController.m */; - name = "RootViewController.m: 19"; - rLen = 0; - rLoc = 387; - rType = 0; - vrLen = 1455; - vrLoc = 0; - }; 4C65F2E912085ACE00606CFC /* GTMNSString+HTML.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1544, 1018}}"; - sepNavSelRange = "{685, 0}"; - sepNavVisRange = "{0, 2288}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 858}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 2019}"; }; }; 4C65F2EA12085ACE00606CFC /* GTMNSString+HTML.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1544, 6396}}"; - sepNavSelRange = "{10945, 49}"; - sepNavVisRange = "{8598, 2316}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 6435}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1503}"; }; }; 4C65F2FA12085B9200606CFC /* GTMDefines.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1544, 4407}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 4641}}"; sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 2429}"; + sepNavVisRange = "{0, 1430}"; }; }; 4C65F316120863F800606CFC /* NSString+HTML.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1088, 741}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 694}}"; sepNavSelRange = "{280, 0}"; - sepNavVisRange = "{0, 582}"; + sepNavVisRange = "{0, 1846}"; }; }; 4C65F317120863F800606CFC /* NSString+HTML.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1300, 3575}}"; + sepNavIntBoundsRect = "{{0, 0}, {1300, 3718}}"; sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 1899}"; + sepNavVisRange = "{0, 2473}"; }; }; 4C65F37212086A6900606CFC /* PBXTextBookmark */ = { @@ -310,51 +230,161 @@ vrLen = 490; vrLoc = 0; }; - 4C65F37612086B5C00606CFC /* PBXTextBookmark */ = { + 4C79457B122F093E00D521CE /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4C65F2FA12085B9200606CFC /* GTMDefines.h */; - name = "GTMDefines.h: 1"; + fRef = 4CC89610119F0D0C00ED61B6 /* RootViewController.h */; + name = "RootViewController.h: 11"; + rLen = 14; + rLoc = 489; + rType = 0; + vrLen = 1775; + vrLoc = 0; + }; + 4C79457C122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 1D3623250D0F684500981E51 /* MWFeedParserAppDelegate.m */; + name = "MWFeedParserAppDelegate.m: 12"; rLen = 0; - rLoc = 0; + rLoc = 555; rType = 0; - vrLen = 2429; + vrLen = 2060; vrLoc = 0; }; - 4C65F37812086B5C00606CFC /* PBXTextBookmark */ = { + 4C79457D122F093E00D521CE /* PBXTextBookmark */ = { isa = PBXTextBookmark; - fRef = 4C65F2E912085ACE00606CFC /* GTMNSString+HTML.h */; - name = "GTMNSString+HTML.h: 20"; + fRef = 4CAD0E1111DA03BD0086F5F8 /* DetailTableViewController.m */; + name = "DetailTableViewController.m: 95"; rLen = 0; - rLoc = 685; + rLoc = 3023; rType = 0; - vrLen = 2288; + vrLen = 2009; vrLoc = 0; }; - 4C7FF962120EA25800D73C3C /* PBXTextBookmark */ = { + 4C79457E122F093E00D521CE /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4CC89605119F0CED00ED61B6 /* MWFeedInfo.h */; - name = "MWFeedInfo.h: 15"; + name = "MWFeedInfo.h: 10"; rLen = 0; rLoc = 345; rType = 0; - vrLen = 493; + vrLen = 1757; vrLoc = 0; }; - 4C7FF963120EA25800D73C3C /* PBXTextBookmark */ = { + 4C79457F122F093E00D521CE /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4CC89607119F0CED00ED61B6 /* MWFeedItem.h */; - name = "MWFeedItem.h: 23"; + name = "MWFeedItem.h: 17"; rLen = 0; rLoc = 747; rType = 0; - vrLen = 1164; + vrLen = 2326; + vrLoc = 0; + }; + 4C794580122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4C65F2FA12085B9200606CFC /* GTMDefines.h */; + name = "GTMDefines.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1430; + vrLoc = 0; + }; + 4C794581122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4C65F2EA12085ACE00606CFC /* GTMNSString+HTML.m */; + name = "GTMNSString+HTML.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1503; + vrLoc = 0; + }; + 4C794582122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4C65F2E912085ACE00606CFC /* GTMNSString+HTML.h */; + name = "GTMNSString+HTML.h: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 2019; + vrLoc = 0; + }; + 4C794583122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4C65F317120863F800606CFC /* NSString+HTML.m */; + name = "NSString+HTML.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 2473; + vrLoc = 0; + }; + 4C794584122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4C65F316120863F800606CFC /* NSString+HTML.h */; + name = "NSString+HTML.h: 9"; + rLen = 0; + rLoc = 280; + rType = 0; + vrLen = 1846; + vrLoc = 0; + }; + 4C794585122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4CAA79C911A406890009078E /* MWFeedParser_Private.h */; + name = "MWFeedParser_Private.h: 29"; + rLen = 0; + rLoc = 1424; + rType = 0; + vrLen = 2081; + vrLoc = 927; + }; + 4C794586122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4CC89604119F0CED00ED61B6 /* MWFeedParser.m */; + name = "MWFeedParser.m: 30"; + rLen = 0; + rLoc = 1441; + rType = 0; + vrLen = 2508; + vrLoc = 0; + }; + 4C794587122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4CC89603119F0CED00ED61B6 /* MWFeedParser.h */; + name = "MWFeedParser.h: 30"; + rLen = 0; + rLoc = 1450; + rType = 0; + vrLen = 2315; + vrLoc = 0; + }; + 4C794588122F093E00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4CC89611119F0D0C00ED61B6 /* RootViewController.m */; + name = "RootViewController.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1990; + vrLoc = 0; + }; + 4C79458C122F09AF00D521CE /* PBXTextBookmark */ = { + isa = PBXTextBookmark; + fRef = 4CC89611119F0D0C00ED61B6 /* RootViewController.m */; + name = "RootViewController.m: 1"; + rLen = 0; + rLoc = 0; + rType = 0; + vrLen = 1990; vrLoc = 0; }; 4CAA79C911A406890009078E /* MWFeedParser_Private.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1026, 694}}"; - sepNavSelRange = "{269, 0}"; - sepNavVisRange = "{0, 1533}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 949}}"; + sepNavSelRange = "{1424, 0}"; + sepNavVisRange = "{927, 2081}"; }; }; 4CAA7A0411A409C60009078E /* PBXTextBookmark */ = { @@ -376,9 +406,9 @@ }; 4CAD0E1111DA03BD0086F5F8 /* DetailTableViewController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1568, 2197}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 2392}}"; sepNavSelRange = "{3023, 0}"; - sepNavVisRange = "{2062, 2039}"; + sepNavVisRange = "{0, 2009}"; }; }; 4CC895F1119F0CC900ED61B6 /* MWFeedParser */ = { @@ -429,24 +459,24 @@ }; 4CC89603119F0CED00ED61B6 /* MWFeedParser.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1026, 1560}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 1699}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 1651}}"; + sepNavSelRange = "{1450, 0}"; + sepNavVisRange = "{0, 2315}"; }; }; 4CC89604119F0CED00ED61B6 /* MWFeedParser.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {2805, 10517}}"; - sepNavSelRange = "{0, 0}"; - sepNavVisRange = "{0, 2090}"; + sepNavIntBoundsRect = "{{0, 0}, {2805, 10946}}"; + sepNavSelRange = "{1441, 0}"; + sepNavVisRange = "{0, 2508}"; sepNavWindowFrame = "{{-1425, 217}, {1230, 874}}"; }; }; 4CC89605119F0CED00ED61B6 /* MWFeedInfo.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1544, 1018}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 694}}"; sepNavSelRange = "{345, 0}"; - sepNavVisRange = "{0, 493}"; + sepNavVisRange = "{0, 1757}"; }; }; 4CC89606119F0CED00ED61B6 /* MWFeedInfo.m */ = { @@ -458,9 +488,9 @@ }; 4CC89607119F0CED00ED61B6 /* MWFeedItem.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1544, 1018}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 754}}"; sepNavSelRange = "{747, 0}"; - sepNavVisRange = "{0, 1164}"; + sepNavVisRange = "{0, 2326}"; }; }; 4CC89608119F0CED00ED61B6 /* MWFeedItem.m */ = { @@ -486,16 +516,16 @@ }; 4CC89610119F0D0C00ED61B6 /* RootViewController.h */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1544, 1018}}"; + sepNavIntBoundsRect = "{{0, 0}, {1026, 694}}"; sepNavSelRange = "{489, 14}"; - sepNavVisRange = "{0, 511}"; + sepNavVisRange = "{0, 1775}"; }; }; 4CC89611119F0D0C00ED61B6 /* RootViewController.m */ = { uiCtxt = { - sepNavIntBoundsRect = "{{0, 0}, {1272, 2093}}"; - sepNavSelRange = "{387, 0}"; - sepNavVisRange = "{0, 1455}"; + sepNavIntBoundsRect = "{{0, 0}, {1272, 2314}}"; + sepNavSelRange = "{0, 0}"; + sepNavVisRange = "{0, 1990}"; }; }; 4CDD6CE712218E7E008A0D7C /* PBXTextBookmark */ = { @@ -518,36 +548,6 @@ vrLen = 494; vrLoc = 0; }; - 4CDD6CEB12218E7E008A0D7C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 1D3623250D0F684500981E51 /* MWFeedParserAppDelegate.m */; - name = "MWFeedParserAppDelegate.m: 22"; - rLen = 0; - rLoc = 555; - rType = 0; - vrLen = 895; - vrLoc = 0; - }; - 4CDD6D1F12219536008A0D7C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4C65F317120863F800606CFC /* NSString+HTML.m */; - name = "NSString+HTML.m: 1"; - rLen = 0; - rLoc = 0; - rType = 0; - vrLen = 1899; - vrLoc = 0; - }; - 4CDD6D231221961C008A0D7C /* PBXTextBookmark */ = { - isa = PBXTextBookmark; - fRef = 4C65F316120863F800606CFC /* NSString+HTML.h */; - name = "NSString+HTML.h: 14"; - rLen = 0; - rLoc = 280; - rType = 0; - vrLen = 582; - vrLoc = 0; - }; 4CE21DB71215DFDC00A39C07 /* PBXTextBookmark */ = { isa = PBXTextBookmark; fRef = 4CC89606119F0CED00ED61B6 /* MWFeedInfo.m */; diff --git a/README.markdown b/README.markdown index a6e36f2..cd4b763 100644 --- a/README.markdown +++ b/README.markdown @@ -1,6 +1,6 @@ -# MWFeedParser +# MWFeedParser — An RSS and Atom web feed parser for iOS -MWFeedParser is an RSS and Atom web feed parser for iOS. It is a very simple and clean implementation and that parses the following information from a web feed: +MWFeedParser is an Objective-C framework for downloading and parsing RSS (1.* and 2.*) and Atom web feeds. It is a very simple and clean implementation that reads the following information from a web feed: #### Feed Information - Title @@ -20,7 +20,7 @@ If you use MWFeedParser on your iPhone/iPad app then please do let me know, I'd ***Important:*** This free software is provided under the MIT licence (X11 license) with the addition of the following condition: -> This Software cannot be used to archive or collect data such as (but not +>This Software cannot be used to archive or collect data such as (but not limited to) that of events, news, experiences and activities, for the purpose of any concept relating to diary/journal keeping. @@ -157,13 +157,27 @@ MWFeedParser is not currently thread-safe. Copyright (c) 2010 Michael Waterfall -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -1. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -2. This Software cannot be used to archive or collect data such as (but not limited to) that of events, news, experiences and activities, for the purpose of any concept relating to diary/journal keeping. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +1. The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + +2. This Software cannot be used to archive or collect data such as (but not + limited to) that of events, news, experiences and activities, for the + purpose of any concept relating to diary/journal keeping. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. Contact