diff --git a/README.md b/README.md index 34d386b..e188ef4 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ In the previous version, the test case for parsing a non-opml file (with `RSOPML ``` RSXMLData *xmlData = [[RSXMLData alloc] initWithData:d urlString:@"https://www.example.org"]; // TODO: check xmlData.parserError -RSFeedParser *parser = [[RSFeedParser alloc] initWithXMLData:xmlData]; +RSFeedParser *parser = [RSFeedParser parserWithXMLData:xmlData]; // TODO: check [parser canParse] // TODO: alternatively check error after parseSync: NSError *parseError; diff --git a/RSXML/RSXMLData.m b/RSXML/RSXMLData.m index f7cd52c..99e1d72 100644 --- a/RSXML/RSXMLData.m +++ b/RSXML/RSXMLData.m @@ -201,7 +201,7 @@ static const NSInteger numberOfCharactersToSearch = 4096; /// @return Kind of @c RSXMLParser or @c nil if no suitable parser found. - (id)getParser { - return [[_parserClass alloc] initWithXMLData:self]; + return [_parserClass parserWithXMLData:self]; } /// @return @c YES if any parser, regardless of type, is suitable. diff --git a/RSXML/RSXMLParser.h b/RSXML/RSXMLParser.h index eb18953..3c33fda 100644 --- a/RSXML/RSXMLParser.h +++ b/RSXML/RSXMLParser.h @@ -51,8 +51,6 @@ + (BOOL)isOPMLParser; /// @return @c YES if parser supports parsing HTML files. + (BOOL)isHTMLParser; -/// Keeps an internal pointer to the @c RSXMLData and initializes a new @c RSSAXParser. -- (instancetype)initWithXMLData:(RSXMLData * _Nonnull)xmlData; /// Will be called after the parsing is finished. @return Reference to parsed object. - (id)xmlParserWillReturnDocument; @end @@ -61,6 +59,8 @@ @interface RSXMLParser<__covariant T> : NSObject @property (nonatomic, readonly, nonnull, copy) NSString *documentURI; ++ (instancetype)parserWithXMLData:(RSXMLData * _Nonnull)xmlData; + - (T _Nullable)parseSync:(NSError ** _Nullable)error; - (void)parseAsync:(void(^)(T _Nullable parsedDocument, NSError * _Nullable error))block; - (BOOL)canParse; diff --git a/RSXML/RSXMLParser.m b/RSXML/RSXMLParser.m index 5934472..1deafd5 100644 --- a/RSXML/RSXMLParser.m +++ b/RSXML/RSXMLParser.m @@ -43,6 +43,18 @@ /** Designated initializer. Runs a check whether it matches the detected parser in @c RSXMLData. + Keeps an internal pointer to the @c RSXMLData and initializes a new @c RSSAXParser. + */ ++ (instancetype)parserWithXMLData:(nonnull RSXMLData *)xmlData { + if ([xmlData.parserClass isSubclassOfClass:[super class]]) { + return [[xmlData.parserClass alloc] initWithXMLData:xmlData]; + } + return [[super alloc] initWithXMLData:xmlData]; +} + +/** + Internal initializer. Use the class initializer to automatically initialize to proper subclass. + Keeps an internal pointer to the @c RSXMLData and initializes a new @c RSSAXParser. */ - (instancetype)initWithXMLData:(nonnull RSXMLData *)xmlData { self = [super init]; @@ -85,7 +97,6 @@ NSString *errMsg = [[NSString stringWithFormat:@"%s", msg] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; *error = [NSError errorWithDomain:kLIBXMLParserErrorDomain code:errCode userInfo:@{NSLocalizedDescriptionKey: errMsg}]; } -// *error = RSXMLMakeErrorFromLIBXMLError(); xmlResetLastError(); } } diff --git a/RSXMLTests/RSHTMLTests.m b/RSXMLTests/RSHTMLTests.m index 0b6e31b..61a9441 100644 --- a/RSXMLTests/RSHTMLTests.m +++ b/RSXMLTests/RSHTMLTests.m @@ -44,7 +44,7 @@ RSXMLData *xmlData = [self xmlData:@"DaringFireball" urlString:@"http://daringfireball.net/"]; XCTAssertTrue([xmlData.parserClass isHTMLParser]); - RSHTMLMetadataParser *parser = [[RSHTMLMetadataParser alloc] initWithXMLData:xmlData]; + RSHTMLMetadataParser *parser = [RSHTMLMetadataParser parserWithXMLData:xmlData]; NSError *error; RSHTMLMetadata *metadata = [parser parseSync:&error]; XCTAssertNil(error); @@ -66,7 +66,7 @@ RSXMLData *xmlData = [self xmlData:@"furbo" urlString:@"http://furbo.org/"]; XCTAssertTrue([xmlData.parserClass isHTMLParser]); - RSHTMLMetadataParser *parser = [[RSHTMLMetadataParser alloc] initWithXMLData:xmlData]; + RSHTMLMetadataParser *parser = [RSHTMLMetadataParser parserWithXMLData:xmlData]; NSError *error; RSHTMLMetadata *metadata = [parser parseSync:&error]; XCTAssertNil(error); @@ -87,7 +87,7 @@ RSXMLData *xmlData = [self xmlData:@"inessential" urlString:@"http://inessential.com/"]; XCTAssertTrue([xmlData.parserClass isHTMLParser]); - RSHTMLMetadataParser *parser = [[RSHTMLMetadataParser alloc] initWithXMLData:xmlData]; + RSHTMLMetadataParser *parser = [RSHTMLMetadataParser parserWithXMLData:xmlData]; NSError *error; RSHTMLMetadata *metadata = [parser parseSync:&error]; XCTAssertNil(error); @@ -111,7 +111,7 @@ RSXMLData *xmlData = [self xmlData:@"sixcolors" urlString:@"https://sixcolors.com/"]; XCTAssertTrue([xmlData.parserClass isHTMLParser]); - RSHTMLMetadataParser *parser = [[RSHTMLMetadataParser alloc] initWithXMLData:xmlData]; + RSHTMLMetadataParser *parser = [RSHTMLMetadataParser parserWithXMLData:xmlData]; NSError *error; RSHTMLMetadata *metadata = [parser parseSync:&error]; XCTAssertNil(error); @@ -143,7 +143,7 @@ RSXMLData *xmlData = [self xmlData:@"sixcolors" urlString:@"https://sixcolors.com/"]; XCTAssertTrue([xmlData.parserClass isHTMLParser]); - RSHTMLLinkParser *parser = [[RSHTMLLinkParser alloc] initWithXMLData:xmlData]; + RSHTMLLinkParser *parser = [RSHTMLLinkParser parserWithXMLData:xmlData]; NSError *error; NSArray *links = [parser parseSync:&error]; XCTAssertNil(error); diff --git a/RSXMLTests/RSOPMLTests.m b/RSXMLTests/RSOPMLTests.m index afdbfa5..3cdb9b4 100644 --- a/RSXMLTests/RSOPMLTests.m +++ b/RSXMLTests/RSOPMLTests.m @@ -61,7 +61,7 @@ NSData *importData = [exportString dataUsingEncoding:NSUTF8StringEncoding]; RSXMLData *xmlData = [[RSXMLData alloc] initWithData:importData urlString:@"none"]; XCTAssertEqual(xmlData.parserClass, [RSOPMLParser class]); - RSOPMLParser *parser = [[RSOPMLParser alloc] initWithXMLData:xmlData]; + RSOPMLParser *parser = [RSOPMLParser parserWithXMLData:xmlData]; XCTAssertNotNil(parser); NSError *error; RSOPMLItem *document = [parser parseSync:&error]; @@ -81,7 +81,7 @@ XCTAssertNotEqualObjects(xmlData.parserClass, [RSOPMLParser class]); XCTAssertNil(xmlData.parserError); - RSOPMLParser *parser = [[RSOPMLParser alloc] initWithXMLData:xmlData]; + RSOPMLParser *parser = [RSOPMLParser parserWithXMLData:xmlData]; RSOPMLItem *document = [parser parseSync:&error]; XCTAssertNil(document); XCTAssertNotNil(error); diff --git a/RSXMLTests/RSXMLTests.m b/RSXMLTests/RSXMLTests.m index 9621dc8..94b1b9a 100644 --- a/RSXMLTests/RSXMLTests.m +++ b/RSXMLTests/RSXMLTests.m @@ -95,8 +95,9 @@ RSXMLData *xmlData = [self xmlFile:@"OneFootTsunami" extension:@"atom"]; XCTAssertEqual(xmlData.parserClass, [RSAtomParser class]); + RSFeedParser *parser = [RSFeedParser parserWithXMLData:xmlData]; NSError *error = nil; - RSParsedFeed *parsedFeed = [[xmlData getParser] parseSync:&error]; + RSParsedFeed *parsedFeed = [parser parseSync:&error]; XCTAssertEqualObjects(parsedFeed.title, @"One Foot Tsunami"); XCTAssertEqualObjects(parsedFeed.subtitle, @"Slightly less disappointing than it sounds"); XCTAssertEqualObjects(parsedFeed.link, @"http://onefoottsunami.com");