Refactored OPML

This commit is contained in:
relikd
2018-12-16 19:18:49 +01:00
parent 3118747fa0
commit f9e672661a
21 changed files with 249 additions and 569 deletions

View File

@@ -6,7 +6,7 @@
// Copyright (c) 2015 Ranchero Software LLC. All rights reserved.
//
#import <libxml/xmlerror.h>
#import "RSXMLError.h"
#import "RSFeedParser.h"
#import "FeedParser.h"
#import "RSXMLData.h"
@@ -49,43 +49,10 @@ static BOOL dataHasLeftCaret(const char *bytes, NSUInteger numberOfBytes);
static const NSUInteger maxNumberOfBytesToSearch = 4096;
static const NSUInteger minNumberOfBytesToSearch = 20;
typedef enum {
RSXMLErrorNoData = 100,
RSXMLErrorMissingLeftCaret,
RSXMLErrorProbablyHTML,
RSXMLErrorContainsXMLErrorsTag,
RSXMLErrorNoSuitableParser
} RSXMLError;
static void setError(NSError **error, RSXMLError code) {
if (!error) {
return;
}
NSString *msg = @"";
switch (code) { // switch statement will warn if an enum value is missing
case RSXMLErrorNoData:
msg = @"Couldn't parse feed. No data available.";
break;
case RSXMLErrorMissingLeftCaret:
msg = @"Couldn't parse feed. Missing left caret character ('<').";
break;
case RSXMLErrorProbablyHTML:
msg = @"Couldn't parse feed. Expecting XML data but found html data.";
break;
case RSXMLErrorContainsXMLErrorsTag:
msg = @"Couldn't parse feed. XML contains 'errors' tag.";
break;
case RSXMLErrorNoSuitableParser:
msg = @"Couldn't parse feed. No suitable parser found. XML document not well-formed.";
break;
}
*error = [NSError errorWithDomain:kRSXMLParserErrorDomain code:code userInfo:@{NSLocalizedDescriptionKey: msg}];
}
static Class parserClassForXMLData(RSXMLData *xmlData, NSError **error) {
if (!feedMayBeParseable(xmlData)) {
setError(error, RSXMLErrorNoData);
RSXMLSetError(error, RSXMLErrorNoData, nil);
return nil;
}
@@ -101,7 +68,7 @@ static Class parserClassForXMLData(RSXMLData *xmlData, NSError **error) {
}
if (!dataHasLeftCaret(bytes, numberOfBytes)) {
setError(error, RSXMLErrorMissingLeftCaret);
RSXMLSetError(error, RSXMLErrorMissingLeftCaret, nil);
return nil;
}
if (optimisticCanParseRSSData(bytes, numberOfBytes)) {
@@ -114,11 +81,11 @@ static Class parserClassForXMLData(RSXMLData *xmlData, NSError **error) {
return [RSRSSParser class]; //TODO: parse RDF feeds, using RSS parser so far ...
}
if (dataIsProbablyHTML(bytes, numberOfBytes)) {
setError(error, RSXMLErrorProbablyHTML);
RSXMLSetError(error, RSXMLErrorProbablyHTML, nil);
return nil;
}
if (dataIsSomeWeirdException(bytes, numberOfBytes)) {
setError(error, RSXMLErrorContainsXMLErrorsTag);
RSXMLSetError(error, RSXMLErrorContainsXMLErrorsTag, nil);
return nil;
}
}
@@ -130,7 +97,7 @@ static Class parserClassForXMLData(RSXMLData *xmlData, NSError **error) {
}
}
// Try RSS anyway? libxml would return a parsing error
setError(error, RSXMLErrorNoSuitableParser);
RSXMLSetError(error, RSXMLErrorNoSuitableParser, nil);
return nil;
}
@@ -250,19 +217,11 @@ RSParsedFeed *RSParseFeedSync(RSXMLData *xmlData, NSError **error) {
xmlResetLastError();
id<FeedParser> parser = parserForXMLData(xmlData, error);
if (error && *error) {
//printf("ERROR in parserForXMLData(): %s\n", [[*error localizedDescription] UTF8String]);
return nil;
}
RSParsedFeed *parsedResult = [parser parseFeed];
xmlErrorPtr err = xmlGetLastError();
if (err && error) {
int errCode = err->code;
char * msg = err->message;
//if (err->level == XML_ERR_FATAL)
NSString *errMsg = [[NSString stringWithFormat:@"%s", msg] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
*error = [NSError errorWithDomain:kLIBXMLParserErrorDomain code:errCode userInfo:@{NSLocalizedDescriptionKey: errMsg}];
//printf("ERROR in [parseFeed] (%d): %s\n", err->level, [[*error localizedDescription] UTF8String]);
if (error) {
*error = RSXMLMakeErrorFromLIBXMLError(xmlGetLastError());
xmlResetLastError();
}
return parsedResult;