diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 6d74cd7a2..f6c069760 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -542,7 +542,7 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, """ - let middleText = OPMLString(indentLevel: 0) + let middleText = OPMLString(indentLevel: 0, strictConformance: false) let closingText = """ @@ -1079,6 +1079,7 @@ private extension Account { } if let folder = ensureFolder(with: folderName) { + folder.externalID = item.attributes?["nnw_externalID"] as? String if let itemChildren = item.children { loadOPMLItems(itemChildren, parentFolder: folder) } @@ -1160,13 +1161,13 @@ extension Account { extension Account: OPMLRepresentable { - public func OPMLString(indentLevel: Int) -> String { + public func OPMLString(indentLevel: Int, strictConformance: Bool) -> String { var s = "" for feed in topLevelFeeds { - s += feed.OPMLString(indentLevel: indentLevel + 1) + s += feed.OPMLString(indentLevel: indentLevel + 1, strictConformance: strictConformance) } for folder in folders! { - s += folder.OPMLString(indentLevel: indentLevel + 1) + s += folder.OPMLString(indentLevel: indentLevel + 1, strictConformance: strictConformance) } return s } diff --git a/Frameworks/Account/Feed.swift b/Frameworks/Account/Feed.swift index 058bafdfc..397753161 100644 --- a/Frameworks/Account/Feed.swift +++ b/Frameworks/Account/Feed.swift @@ -226,7 +226,7 @@ public final class Feed: DisplayNameProvider, Renamable, UnreadCountProvider, Ha extension Feed: OPMLRepresentable { - public func OPMLString(indentLevel: Int) -> String { + public func OPMLString(indentLevel: Int, strictConformance: Bool) -> String { // https://github.com/brentsimmons/NetNewsWire/issues/527 // Don’t use nameForDisplay because that can result in a feed name "Untitled" written to disk, // which NetNewsWire may take later to be the actual name. diff --git a/Frameworks/Account/Folder.swift b/Frameworks/Account/Folder.swift index bdfe13118..9cfd52e18 100644 --- a/Frameworks/Account/Folder.swift +++ b/Frameworks/Account/Folder.swift @@ -24,6 +24,7 @@ public final class Folder: DisplayNameProvider, Renamable, Container, UnreadCoun static let untitledName = NSLocalizedString("Untitled ƒ", comment: "Folder name") public let folderID: Int // not saved: per-run only + public var externalID: String? = nil static var incrementingID = 0 // MARK: - DisplayNameProvider @@ -136,20 +137,29 @@ private extension Folder { extension Folder: OPMLRepresentable { - public func OPMLString(indentLevel: Int) -> String { + public func OPMLString(indentLevel: Int, strictConformance: Bool) -> String { + + let attrExternalID: String = { + if !strictConformance, let externalID = externalID { + return " nnw_externalID=\"\(externalID)\"" + } else { + return "" + } + }() + let escapedTitle = nameForDisplay.rs_stringByEscapingSpecialXMLCharacters() - var s = "\n" + var s = "\n" s = s.rs_string(byPrependingNumberOfTabs: indentLevel) var hasAtLeastOneChild = false for feed in topLevelFeeds { - s += feed.OPMLString(indentLevel: indentLevel + 1) + s += feed.OPMLString(indentLevel: indentLevel + 1, strictConformance: strictConformance) hasAtLeastOneChild = true } if !hasAtLeastOneChild { - s = "\n" + s = "\n" s = s.rs_string(byPrependingNumberOfTabs: indentLevel) return s } diff --git a/Mac/Scriptability/Account+Scriptability.swift b/Mac/Scriptability/Account+Scriptability.swift index 520c3d298..2b2bdac09 100644 --- a/Mac/Scriptability/Account+Scriptability.swift +++ b/Mac/Scriptability/Account+Scriptability.swift @@ -150,7 +150,7 @@ class ScriptableAccount: NSObject, UniqueIdScriptingObject, ScriptingObjectConta @objc(opmlRepresentation) var opmlRepresentation:String { - return self.account.OPMLString(indentLevel:0) + return self.account.OPMLString(indentLevel:0, strictConformance: true) } @objc(accountType) diff --git a/Mac/Scriptability/Feed+Scriptability.swift b/Mac/Scriptability/Feed+Scriptability.swift index 27a1aa791..f2ae486e5 100644 --- a/Mac/Scriptability/Feed+Scriptability.swift +++ b/Mac/Scriptability/Feed+Scriptability.swift @@ -146,7 +146,7 @@ class ScriptableFeed: NSObject, UniqueIdScriptingObject, ScriptingObjectContaine @objc(opmlRepresentation) var opmlRepresentation:String { - return self.feed.OPMLString(indentLevel:0) + return self.feed.OPMLString(indentLevel:0, strictConformance: true) } // MARK: --- scriptable elements --- diff --git a/Mac/Scriptability/Folder+Scriptability.swift b/Mac/Scriptability/Folder+Scriptability.swift index a5ea88618..8f522513c 100644 --- a/Mac/Scriptability/Folder+Scriptability.swift +++ b/Mac/Scriptability/Folder+Scriptability.swift @@ -101,7 +101,7 @@ class ScriptableFolder: NSObject, UniqueIdScriptingObject, ScriptingObjectContai @objc(opmlRepresentation) var opmlRepresentation:String { - return self.folder.OPMLString(indentLevel:0) + return self.folder.OPMLString(indentLevel:0, strictConformance: true) } } diff --git a/Shared/Exporters/OPMLExporter.swift b/Shared/Exporters/OPMLExporter.swift index c177431ef..75dde22d5 100644 --- a/Shared/Exporters/OPMLExporter.swift +++ b/Shared/Exporters/OPMLExporter.swift @@ -27,7 +27,7 @@ struct OPMLExporter { """ - let middleText = account.OPMLString(indentLevel: 0) + let middleText = account.OPMLString(indentLevel: 0, strictConformance: true) let closingText = """ diff --git a/submodules/RSCore b/submodules/RSCore index b3a3178b0..d70c24feb 160000 --- a/submodules/RSCore +++ b/submodules/RSCore @@ -1 +1 @@ -Subproject commit b3a3178b00810c9e2c668a8c3b17080501cf1f33 +Subproject commit d70c24feb4bdad8fdbe7e0beb6edd12d3383c7dc