Fix OPML importing.

This commit is contained in:
Brent Simmons 2017-10-21 21:00:21 -07:00
parent 8d5e568cde
commit 649f62207f
4 changed files with 61 additions and 21 deletions

View File

@ -253,7 +253,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
return false // TODO return false // TODO
} }
public func addFolder(_ folder: Folder, to containingFolder: Folder?) -> Bool { @discardableResult
public func addFolder(_ folder: Folder, to parentFolder: Folder?) -> Bool {
return false // TODO return false // TODO
} }
@ -263,7 +264,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
guard let children = opmlDocument.children else { guard let children = opmlDocument.children else {
return return
} }
importOPMLItems(children, parentFolder: nil, foldersAllowed: true) importOPMLItems(children, parentFolder: nil)
dirty = true dirty = true
} }
@ -472,22 +473,37 @@ private extension Account {
}) })
} }
func importOPMLItems(_ items: [RSOPMLItem], parentFolder: Folder?, foldersAllowed: Bool) { func createFeed(with opmlFeedSpecifier: RSOPMLFeedSpecifier) -> Feed {
for item in items { let feed = Feed(accountID: accountID, url: opmlFeedSpecifier.feedURL, feedID: opmlFeedSpecifier.feedURL)
feed.editedName = opmlFeedSpecifier.title
return feed
}
func importOPMLItems(_ items: [RSOPMLItem], parentFolder: Folder?) {
items.forEach { (item) in
if let feedSpecifier = item.feedSpecifier { if let feedSpecifier = item.feedSpecifier {
if hasFeed(withURL: feedSpecifier.feedURL) { let feed = createFeed(with: feedSpecifier)
continue addFeed(feed, to: parentFolder)
} return
} }
if item.isFolder { guard item.isFolder, let itemChildren = item.children else {
return
} }
else {
// TODO: possibly support sub folders.
guard let folderName = item.titleFromAttributes else {
// Folder doesnt have a name, so it wont be created, and its items will go one level up.
importOPMLItems(itemChildren, parentFolder: parentFolder)
return
}
if let folder = ensureFolder(with: folderName) {
importOPMLItems(itemChildren, parentFolder: folder)
} }
} }
} }

View File

@ -23,6 +23,9 @@ public protocol Container {
func hasAtLeastOneFeed() -> Bool func hasAtLeastOneFeed() -> Bool
func objectIsChild(_ object: AnyObject) -> Bool func objectIsChild(_ object: AnyObject) -> Bool
func hasChildFolder(with: String) -> Bool
func childFolder(with: String) -> Folder?
//Recursive //Recursive
func flattenedFeeds() -> Set<Feed> func flattenedFeeds() -> Set<Feed>
func hasFeed(with feedID: String) -> Bool func hasFeed(with feedID: String) -> Bool
@ -52,6 +55,22 @@ public extension Container {
return false return false
} }
func hasChildFolder(with name: String) -> Bool {
return childFolder(with: name) != nil
}
func childFolder(with name: String) -> Folder? {
for child in children {
if let folder = child as? Folder, folder.name == name {
return folder
}
}
return nil
}
func objectIsChild(_ object: AnyObject) -> Bool { func objectIsChild(_ object: AnyObject) -> Bool {
for child in children { for child in children {

View File

@ -8,16 +8,17 @@
@import Foundation; @import Foundation;
NS_ASSUME_NONNULL_BEGIN
@interface RSOPMLFeedSpecifier : NSObject @interface RSOPMLFeedSpecifier : NSObject
- (instancetype)initWithTitle:(NSString * _Nullable)title feedDescription:(NSString * _Nullable)feedDescription homePageURL:(NSString * _Nullable)homePageURL feedURL:(NSString *)feedURL;
- (instancetype)initWithTitle:(NSString *)title feedDescription:(NSString *)feedDescription homePageURL:(NSString *)homePageURL feedURL:(NSString *)feedURL; @property (nonatomic, nullable, readonly) NSString *title;
@property (nonatomic, nullable, readonly) NSString *feedDescription;
@property (nonatomic, readonly) NSString *title; @property (nonatomic, nullable, readonly) NSString *homePageURL;
@property (nonatomic, readonly) NSString *feedDescription;
@property (nonatomic, readonly) NSString *homePageURL;
@property (nonatomic, readonly) NSString *feedURL; @property (nonatomic, readonly) NSString *feedURL;
@end @end
NS_ASSUME_NONNULL_END

View File

@ -10,17 +10,21 @@
@class RSOPMLFeedSpecifier; @class RSOPMLFeedSpecifier;
NS_ASSUME_NONNULL_BEGIN
@interface RSOPMLItem : NSObject @interface RSOPMLItem : NSObject
@property (nonatomic) NSDictionary *attributes; @property (nonatomic, nullable) NSDictionary *attributes;
@property (nonatomic) NSArray <RSOPMLItem *> *children; @property (nonatomic, nullable) NSArray <RSOPMLItem *> *children;
- (void)addChild:(RSOPMLItem *)child; - (void)addChild:(RSOPMLItem *)child;
@property (nonatomic, readonly) RSOPMLFeedSpecifier *feedSpecifier; //May be nil. @property (nonatomic, nullable, readonly) RSOPMLFeedSpecifier *feedSpecifier;
@property (nonatomic, readonly) NSString *titleFromAttributes; //May be nil. @property (nonatomic, nullable, readonly) NSString *titleFromAttributes;
@property (nonatomic, readonly) BOOL isFolder; @property (nonatomic, readonly) BOOL isFolder;
@end @end
NS_ASSUME_NONNULL_END