Add the ability to import NNW 3 Subscription plist files. Issue #1129
This commit is contained in:
parent
427c0da0d3
commit
19145505c5
@ -57,6 +57,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
private var addFeedController: AddFeedController?
|
private var addFeedController: AddFeedController?
|
||||||
private var addFolderWindowController: AddFolderWindowController?
|
private var addFolderWindowController: AddFolderWindowController?
|
||||||
private var importOPMLController: ImportOPMLWindowController?
|
private var importOPMLController: ImportOPMLWindowController?
|
||||||
|
private var importNNW3Controller: ImportNNW3WindowController?
|
||||||
private var exportOPMLController: ExportOPMLWindowController?
|
private var exportOPMLController: ExportOPMLWindowController?
|
||||||
private var keyboardShortcutsWindowController: WebViewWindowController?
|
private var keyboardShortcutsWindowController: WebViewWindowController?
|
||||||
private var inspectorWindowController: InspectorWindowController?
|
private var inspectorWindowController: InspectorWindowController?
|
||||||
@ -126,6 +127,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
logDebugMessage("Is first run.")
|
logDebugMessage("Is first run.")
|
||||||
}
|
}
|
||||||
let localAccount = AccountManager.shared.defaultAccount
|
let localAccount = AccountManager.shared.defaultAccount
|
||||||
|
NNW3FeedsImporter.importIfNeeded(isFirstRun, account: localAccount)
|
||||||
DefaultFeedsImporter.importIfNeeded(isFirstRun, account: localAccount)
|
DefaultFeedsImporter.importIfNeeded(isFirstRun, account: localAccount)
|
||||||
|
|
||||||
let tempDirectory = NSTemporaryDirectory()
|
let tempDirectory = NSTemporaryDirectory()
|
||||||
@ -395,7 +397,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func toggleInspectorWindow(_ sender: Any?) {
|
@IBAction func toggleInspectorWindow(_ sender: Any?) {
|
||||||
|
|
||||||
if inspectorWindowController == nil {
|
if inspectorWindowController == nil {
|
||||||
inspectorWindowController = (windowControllerWithName("Inspector") as! InspectorWindowController)
|
inspectorWindowController = (windowControllerWithName("Inspector") as! InspectorWindowController)
|
||||||
}
|
}
|
||||||
@ -410,7 +411,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func importOPMLFromFile(_ sender: Any?) {
|
@IBAction func importOPMLFromFile(_ sender: Any?) {
|
||||||
|
|
||||||
createAndShowMainWindow()
|
createAndShowMainWindow()
|
||||||
if mainWindowController!.isDisplayingSheet {
|
if mainWindowController!.isDisplayingSheet {
|
||||||
return
|
return
|
||||||
@ -418,11 +418,19 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
|
|
||||||
importOPMLController = ImportOPMLWindowController()
|
importOPMLController = ImportOPMLWindowController()
|
||||||
importOPMLController?.runSheetOnWindow(mainWindowController!.window!)
|
importOPMLController?.runSheetOnWindow(mainWindowController!.window!)
|
||||||
|
}
|
||||||
|
|
||||||
|
@IBAction func importNNW3FromFile(_ sender: Any?) {
|
||||||
|
createAndShowMainWindow()
|
||||||
|
if mainWindowController!.isDisplayingSheet {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
importNNW3Controller = ImportNNW3WindowController()
|
||||||
|
importNNW3Controller?.runSheetOnWindow(mainWindowController!.window!)
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func exportOPML(_ sender: Any?) {
|
@IBAction func exportOPML(_ sender: Any?) {
|
||||||
|
|
||||||
createAndShowMainWindow()
|
createAndShowMainWindow()
|
||||||
if mainWindowController!.isDisplayingSheet {
|
if mainWindowController!.isDisplayingSheet {
|
||||||
return
|
return
|
||||||
@ -430,11 +438,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations,
|
|||||||
|
|
||||||
exportOPMLController = ExportOPMLWindowController()
|
exportOPMLController = ExportOPMLWindowController()
|
||||||
exportOPMLController?.runSheetOnWindow(mainWindowController!.window!)
|
exportOPMLController?.runSheetOnWindow(mainWindowController!.window!)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func addAppNews(_ sender: Any?) {
|
@IBAction func addAppNews(_ sender: Any?) {
|
||||||
|
|
||||||
if AccountManager.shared.anyAccountHasFeedWithURL(appNewsURLString) {
|
if AccountManager.shared.anyAccountHasFeedWithURL(appNewsURLString) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="15504" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
<deployment identifier="macosx"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15504"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
<!--Application-->
|
<!--Application-->
|
||||||
@ -91,6 +92,12 @@
|
|||||||
<action selector="importOPMLFromFile:" target="Ady-hI-5gd" id="eGY-fm-uvK"/>
|
<action selector="importOPMLFromFile:" target="Ady-hI-5gd" id="eGY-fm-uvK"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
<menuItem title="Import NNW 3 Subscriptions ..." id="ely-yi-STg">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="importNNW3FromFile:" target="Voe-Tx-rLC" id="mu3-gN-7uA"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
<menuItem title="Export Subscriptions…" keyEquivalent="e" id="Xy2-v8-Lj8">
|
<menuItem title="Export Subscriptions…" keyEquivalent="e" id="Xy2-v8-Lj8">
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
<connections>
|
<connections>
|
||||||
|
104
Mac/MainWindow/NNW3/ImportNNW3Sheet.xib
Normal file
104
Mac/MainWindow/NNW3/ImportNNW3Sheet.xib
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15504" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="macosx"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15504"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<customObject id="-2" userLabel="File's Owner" customClass="ImportNNW3WindowController" customModule="NetNewsWire" customModuleProvider="target">
|
||||||
|
<connections>
|
||||||
|
<outlet property="accountPopUpButton" destination="sEU-ot-DE2" id="9W3-o6-YsH"/>
|
||||||
|
<outlet property="window" destination="QvC-M9-y7g" id="KF3-y6-Xy7"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="QvC-M9-y7g">
|
||||||
|
<windowStyleMask key="styleMask" titled="YES"/>
|
||||||
|
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||||
|
<rect key="contentRect" x="196" y="240" width="433" height="183"/>
|
||||||
|
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
||||||
|
<view key="contentView" wantsLayer="YES" misplaced="YES" id="EiT-Mj-1SZ">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="433" height="183"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="vE6-sv-BA0">
|
||||||
|
<rect key="frame" x="18" y="100" width="405" height="32"/>
|
||||||
|
<textFieldCell key="cell" selectable="YES" title="Choose the account to get the imported subscriptions. This requires a NetNewsWire 3 Subscriptions.plist file." id="1Vu-Te-PGl">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kZ4-y9-lYy">
|
||||||
|
<rect key="frame" x="18" y="64" width="63" height="16"/>
|
||||||
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Account:" id="e9g-7H-VWa">
|
||||||
|
<font key="font" metaFont="systemBold"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sEU-ot-DE2" userLabel="Account Popup">
|
||||||
|
<rect key="frame" x="85" y="58" width="339" height="25"/>
|
||||||
|
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="xsd-12-2yb" id="NuO-Hk-nk3">
|
||||||
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<menu key="menu" id="8LY-np-ij1">
|
||||||
|
<items>
|
||||||
|
<menuItem title="Item 1" state="on" id="xsd-12-2yb"/>
|
||||||
|
<menuItem title="Item 2" id="JGa-5R-SV5"/>
|
||||||
|
<menuItem title="Item 3" id="92e-hX-kYj"/>
|
||||||
|
</items>
|
||||||
|
</menu>
|
||||||
|
</popUpButtonCell>
|
||||||
|
</popUpButton>
|
||||||
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ceu-mM-EKm">
|
||||||
|
<rect key="frame" x="81" y="13" width="173" height="32"/>
|
||||||
|
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="9ab-cB-hex">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<string key="keyEquivalent" base64-UTF8="YES">
|
||||||
|
Gw
|
||||||
|
</string>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="cancel:" target="-2" id="TTV-OR-P3d"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<button horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="et6-I1-6wB">
|
||||||
|
<rect key="frame" x="254" y="13" width="173" height="32"/>
|
||||||
|
<buttonCell key="cell" type="push" title="Import from NNW 3 …" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="dhV-on-ayM">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<string key="keyEquivalent" base64-UTF8="YES">
|
||||||
|
DQ
|
||||||
|
</string>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="importNNW3:" target="-2" id="C33-8m-XQA"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="vE6-sv-BA0" secondAttribute="trailing" constant="20" symbolic="YES" id="2UM-dU-XgH"/>
|
||||||
|
<constraint firstItem="kZ4-y9-lYy" firstAttribute="top" secondItem="vE6-sv-BA0" secondAttribute="bottom" constant="20" id="8Wf-Iv-teA"/>
|
||||||
|
<constraint firstItem="sEU-ot-DE2" firstAttribute="firstBaseline" secondItem="kZ4-y9-lYy" secondAttribute="firstBaseline" id="EPd-vD-8pa"/>
|
||||||
|
<constraint firstItem="et6-I1-6wB" firstAttribute="width" secondItem="ceu-mM-EKm" secondAttribute="width" id="Ldw-C8-F5X"/>
|
||||||
|
<constraint firstItem="vE6-sv-BA0" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="M8o-2f-uax"/>
|
||||||
|
<constraint firstItem="et6-I1-6wB" firstAttribute="top" secondItem="sEU-ot-DE2" secondAttribute="bottom" constant="20" symbolic="YES" id="OXm-Ns-r9Z"/>
|
||||||
|
<constraint firstItem="kZ4-y9-lYy" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" symbolic="YES" id="SZo-1P-yYA"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="et6-I1-6wB" secondAttribute="bottom" constant="20" symbolic="YES" id="T9O-XC-wdY"/>
|
||||||
|
<constraint firstItem="et6-I1-6wB" firstAttribute="leading" secondItem="ceu-mM-EKm" secondAttribute="trailing" constant="12" symbolic="YES" id="Y8m-P8-JQh"/>
|
||||||
|
<constraint firstItem="sEU-ot-DE2" firstAttribute="leading" secondItem="kZ4-y9-lYy" secondAttribute="trailing" constant="8" symbolic="YES" id="a0f-Ak-Zdq"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="et6-I1-6wB" secondAttribute="trailing" constant="20" symbolic="YES" id="chg-8b-D51"/>
|
||||||
|
<constraint firstItem="ceu-mM-EKm" firstAttribute="centerY" secondItem="et6-I1-6wB" secondAttribute="centerY" id="eKt-vM-3wn"/>
|
||||||
|
<constraint firstItem="ceu-mM-EKm" firstAttribute="leading" secondItem="sEU-ot-DE2" secondAttribute="leading" id="gb5-bZ-0R6"/>
|
||||||
|
<constraint firstItem="vE6-sv-BA0" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" symbolic="YES" id="ggA-m1-5pj"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="sEU-ot-DE2" secondAttribute="trailing" constant="20" symbolic="YES" id="sFO-00-DR0"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
<point key="canvasLocation" x="99.5" y="103.5"/>
|
||||||
|
</window>
|
||||||
|
</objects>
|
||||||
|
</document>
|
110
Mac/MainWindow/NNW3/ImportNNW3WindowController.swift
Normal file
110
Mac/MainWindow/NNW3/ImportNNW3WindowController.swift
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
//
|
||||||
|
// ImportNNW3WindowController.swift
|
||||||
|
// NetNewsWire
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 10/14/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import AppKit
|
||||||
|
import Account
|
||||||
|
|
||||||
|
class ImportNNW3WindowController: NSWindowController {
|
||||||
|
|
||||||
|
@IBOutlet weak var accountPopUpButton: NSPopUpButton!
|
||||||
|
private weak var hostWindow: NSWindow?
|
||||||
|
|
||||||
|
convenience init() {
|
||||||
|
self.init(windowNibName: NSNib.Name("ImportNNW3Sheet"))
|
||||||
|
}
|
||||||
|
|
||||||
|
override func windowDidLoad() {
|
||||||
|
accountPopUpButton.removeAllItems()
|
||||||
|
|
||||||
|
let menu = NSMenu()
|
||||||
|
accountPopUpButton.menu = menu
|
||||||
|
|
||||||
|
for oneAccount in AccountManager.shared.sortedActiveAccounts {
|
||||||
|
|
||||||
|
let oneMenuItem = NSMenuItem()
|
||||||
|
oneMenuItem.title = oneAccount.nameForDisplay
|
||||||
|
oneMenuItem.representedObject = oneAccount
|
||||||
|
menu.addItem(oneMenuItem)
|
||||||
|
|
||||||
|
if oneAccount.accountID == AppDefaults.importOPMLAccountID {
|
||||||
|
accountPopUpButton.select(oneMenuItem)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: API
|
||||||
|
|
||||||
|
func runSheetOnWindow(_ hostWindow: NSWindow) {
|
||||||
|
|
||||||
|
self.hostWindow = hostWindow
|
||||||
|
|
||||||
|
if AccountManager.shared.activeAccounts.count == 1 {
|
||||||
|
let account = AccountManager.shared.activeAccounts.first!
|
||||||
|
importNNW3(account: account)
|
||||||
|
} else {
|
||||||
|
hostWindow.beginSheet(window!)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: Actions
|
||||||
|
|
||||||
|
@IBAction func cancel(_ sender: Any) {
|
||||||
|
hostWindow!.endSheet(window!, returnCode: NSApplication.ModalResponse.cancel)
|
||||||
|
}
|
||||||
|
|
||||||
|
@IBAction func importNNW3(_ sender: Any) {
|
||||||
|
|
||||||
|
guard let menuItem = accountPopUpButton.selectedItem else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
let account = menuItem.representedObject as! Account
|
||||||
|
AppDefaults.importOPMLAccountID = account.accountID
|
||||||
|
hostWindow!.endSheet(window!, returnCode: NSApplication.ModalResponse.OK)
|
||||||
|
importNNW3(account: account)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func importNNW3(account: Account) {
|
||||||
|
|
||||||
|
let panel = NSOpenPanel()
|
||||||
|
panel.canDownloadUbiquitousContents = true
|
||||||
|
panel.canResolveUbiquitousConflicts = true
|
||||||
|
panel.canChooseFiles = true
|
||||||
|
panel.allowsMultipleSelection = false
|
||||||
|
panel.canChooseDirectories = false
|
||||||
|
panel.resolvesAliases = true
|
||||||
|
panel.directoryURL = URL(fileURLWithPath: NNW3PlistConverter.defaultFilePath)
|
||||||
|
panel.allowedFileTypes = ["plist"]
|
||||||
|
panel.allowsOtherFileTypes = false
|
||||||
|
|
||||||
|
panel.beginSheetModal(for: hostWindow!) { modalResult in
|
||||||
|
if modalResult == NSApplication.ModalResponse.OK, let url = panel.url {
|
||||||
|
|
||||||
|
guard let opmlURL = NNW3PlistConverter.convertToOPML(url: url) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
account.importOPML(opmlURL) { result in
|
||||||
|
try? FileManager.default.removeItem(at: opmlURL)
|
||||||
|
switch result {
|
||||||
|
case .success:
|
||||||
|
break
|
||||||
|
case .failure(let error):
|
||||||
|
NSApplication.shared.presentError(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
53
Mac/MainWindow/NNW3/NNW3Document.swift
Normal file
53
Mac/MainWindow/NNW3/NNW3Document.swift
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
//
|
||||||
|
// NNW3Document.swift
|
||||||
|
// NetNewsWire
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 10/14/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
class NNW3Document: NNW3Entry {
|
||||||
|
|
||||||
|
init(plist: [[String: Any]]) {
|
||||||
|
super.init(title: "NNW3")
|
||||||
|
|
||||||
|
for child in plist {
|
||||||
|
if child["isContainer"] as? Bool ?? false {
|
||||||
|
entries.append(NNW3Entry(plist: child, parent: self))
|
||||||
|
} else {
|
||||||
|
entries.append(NNW3Feed(plist: child, parent: self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
override func makeXML(indentLevel: Int) -> String {
|
||||||
|
|
||||||
|
var s =
|
||||||
|
"""
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<opml version="1.1">
|
||||||
|
<head>
|
||||||
|
<title>\(title ?? "")</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
for entry in entries {
|
||||||
|
s += entry.makeXML(indentLevel: indentLevel + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
s +=
|
||||||
|
"""
|
||||||
|
</body>
|
||||||
|
</opml>
|
||||||
|
"""
|
||||||
|
|
||||||
|
return s
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
61
Mac/MainWindow/NNW3/NNW3Entry.swift
Normal file
61
Mac/MainWindow/NNW3/NNW3Entry.swift
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
//
|
||||||
|
// NNW3Entry.swift
|
||||||
|
// NetNewsWire
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 10/14/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import RSCore
|
||||||
|
|
||||||
|
class NNW3Entry {
|
||||||
|
|
||||||
|
var title: String?
|
||||||
|
var entries = [NNW3Entry]()
|
||||||
|
|
||||||
|
weak var parent: NNW3Entry?
|
||||||
|
|
||||||
|
var isFolder: Bool {
|
||||||
|
return type(of: self) == NNW3Entry.self
|
||||||
|
}
|
||||||
|
|
||||||
|
init(title: String?, parent: NNW3Entry? = nil) {
|
||||||
|
self.title = title
|
||||||
|
self.parent = parent
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init(plist: [String: Any], parent: NNW3Entry? = nil) {
|
||||||
|
let title = plist["name"] as? String
|
||||||
|
self.init(title: title, parent: parent)
|
||||||
|
|
||||||
|
guard let childrenArray = plist["childrenArray"] as? [[String: AnyObject]] else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for child in childrenArray {
|
||||||
|
if child["isContainer"] as? Bool ?? false {
|
||||||
|
entries.append(NNW3Entry(plist: child, parent: self))
|
||||||
|
} else {
|
||||||
|
entries.append(NNW3Feed(plist: child, parent: self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeXML(indentLevel: Int) -> String {
|
||||||
|
|
||||||
|
let t = title?.rs_stringByEscapingSpecialXMLCharacters() ?? ""
|
||||||
|
var s = "<outline text=\"\(t)\" title=\"\(t)\">\n".rs_string(byPrependingNumberOfTabs: indentLevel)
|
||||||
|
|
||||||
|
for entry in entries {
|
||||||
|
s += entry.makeXML(indentLevel: indentLevel + 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
s += "</outline>\n".rs_string(byPrependingNumberOfTabs: indentLevel)
|
||||||
|
|
||||||
|
return s
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
48
Mac/MainWindow/NNW3/NNW3Feed.swift
Normal file
48
Mac/MainWindow/NNW3/NNW3Feed.swift
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
//
|
||||||
|
// NNW3Feed.swift
|
||||||
|
// NetNewsWire
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 10/14/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import RSCore
|
||||||
|
|
||||||
|
class NNW3Feed: NNW3Entry {
|
||||||
|
|
||||||
|
var pageURL: String?
|
||||||
|
var feedURL: String?
|
||||||
|
|
||||||
|
init(feedURL: String) {
|
||||||
|
super.init(title: nil)
|
||||||
|
self.feedURL = feedURL
|
||||||
|
}
|
||||||
|
|
||||||
|
init(title: String?, pageURL: String?, feedURL: String?, parent: NNW3Entry? = nil) {
|
||||||
|
super.init(title: title, parent: parent)
|
||||||
|
self.pageURL = pageURL
|
||||||
|
self.feedURL = feedURL
|
||||||
|
}
|
||||||
|
|
||||||
|
convenience init(plist: [String: Any], parent: NNW3Entry? = nil) {
|
||||||
|
let title = plist["name"] as? String
|
||||||
|
let pageURL = plist["home"] as? String
|
||||||
|
let feedURL = plist["rss"] as? String
|
||||||
|
self.init(title: title, pageURL: pageURL, feedURL: feedURL, parent: parent)
|
||||||
|
}
|
||||||
|
|
||||||
|
override func makeXML(indentLevel: Int) -> String {
|
||||||
|
|
||||||
|
let t = title?.rs_stringByEscapingSpecialXMLCharacters() ?? ""
|
||||||
|
let p = pageURL?.rs_stringByEscapingSpecialXMLCharacters() ?? ""
|
||||||
|
let f = feedURL?.rs_stringByEscapingSpecialXMLCharacters() ?? ""
|
||||||
|
|
||||||
|
var s = "<outline text=\"\(t)\" title=\"\(t)\" description=\"\" type=\"rss\" version=\"RSS\" htmlUrl=\"\(p)\" xmlUrl=\"\(f)\"/>\n"
|
||||||
|
s = s.rs_string(byPrependingNumberOfTabs: indentLevel)
|
||||||
|
|
||||||
|
return s
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
50
Mac/MainWindow/NNW3/NNW3FeedsImporter.swift
Normal file
50
Mac/MainWindow/NNW3/NNW3FeedsImporter.swift
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
//
|
||||||
|
// NNW3FeedsImporter.swift
|
||||||
|
// NetNewsWire
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 10/14/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Account
|
||||||
|
import RSCore
|
||||||
|
|
||||||
|
struct NNW3FeedsImporter {
|
||||||
|
|
||||||
|
static func importIfNeeded(_ isFirstRun: Bool, account: Account) {
|
||||||
|
guard shouldImportDefaultFeeds(isFirstRun) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !FileManager.default.fileExists(atPath: NNW3PlistConverter.defaultFilePath) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
appDelegate.logDebugMessage("Importing NNW3 feeds.")
|
||||||
|
|
||||||
|
let url = URL(fileURLWithPath: NNW3PlistConverter.defaultFilePath)
|
||||||
|
guard let opmlURL = NNW3PlistConverter.convertToOPML(url: url) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
account.importOPML(opmlURL) { result in
|
||||||
|
try? FileManager.default.removeItem(at: opmlURL)
|
||||||
|
switch result {
|
||||||
|
case .success:
|
||||||
|
appDelegate.logDebugMessage("Importing NNW3 feeds succeeded.")
|
||||||
|
case .failure(let error):
|
||||||
|
appDelegate.logDebugMessage("Importing NNW3 feeds failed. \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static func shouldImportDefaultFeeds(_ isFirstRun: Bool) -> Bool {
|
||||||
|
if !isFirstRun || AccountManager.shared.anyAccountHasAtLeastOneFeed() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
39
Mac/MainWindow/NNW3/NNW3PlistConverter.swift
Normal file
39
Mac/MainWindow/NNW3/NNW3PlistConverter.swift
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
//
|
||||||
|
// NNW3Importer.swift
|
||||||
|
// NetNewsWire
|
||||||
|
//
|
||||||
|
// Created by Maurice Parker on 10/14/19.
|
||||||
|
// Copyright © 2019 Ranchero Software. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
class NNW3PlistConverter {
|
||||||
|
|
||||||
|
static var defaultFilePath: String {
|
||||||
|
return ("~/Library/Application Support/NetNewsWire/Subscriptions.plist" as NSString).expandingTildeInPath
|
||||||
|
}
|
||||||
|
|
||||||
|
static func convertToOPML(url: URL) -> URL? {
|
||||||
|
guard let data = try? Data(contentsOf: url) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let nnw3plist = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String: AnyObject]] else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
let opmlURL = FileManager.default.temporaryDirectory.appendingPathComponent("NNW3.opml")
|
||||||
|
let doc = NNW3Document(plist: nnw3plist)
|
||||||
|
let opml = doc.makeXML(indentLevel: 0)
|
||||||
|
do {
|
||||||
|
try opml.write(to: opmlURL, atomically: true, encoding: .utf8)
|
||||||
|
} catch let error as NSError {
|
||||||
|
NSApplication.shared.presentError(error)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return opmlURL
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -35,6 +35,8 @@
|
|||||||
51554C25228B71910055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
51554C25228B71910055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
51554C30228B71A10055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; };
|
51554C30228B71A10055115A /* SyncDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; };
|
||||||
51554C31228B71A10055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
51554C31228B71A10055115A /* SyncDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51554C01228B6EB50055115A /* SyncDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
|
516CAC4C235521070038D354 /* ImportNNW3Sheet.xib in Resources */ = {isa = PBXBuildFile; fileRef = 516CAC42235521070038D354 /* ImportNNW3Sheet.xib */; };
|
||||||
|
516CAC4D235521070038D354 /* ImportNNW3WindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516CAC4B235521070038D354 /* ImportNNW3WindowController.swift */; };
|
||||||
5183CCD0226E1E880010922C /* NonIntrinsicLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */; };
|
5183CCD0226E1E880010922C /* NonIntrinsicLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */; };
|
||||||
5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */; };
|
5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */; };
|
||||||
5183CCDD226F1F5C0010922C /* NavigationProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */; };
|
5183CCDD226F1F5C0010922C /* NavigationProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */; };
|
||||||
@ -46,6 +48,11 @@
|
|||||||
5183CCE9226F68D90010922C /* AccountRefreshTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE7226F68D90010922C /* AccountRefreshTimer.swift */; };
|
5183CCE9226F68D90010922C /* AccountRefreshTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCE7226F68D90010922C /* AccountRefreshTimer.swift */; };
|
||||||
5183CCED22711DCE0010922C /* Settings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5183CCEC22711DCE0010922C /* Settings.storyboard */; };
|
5183CCED22711DCE0010922C /* Settings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5183CCEC22711DCE0010922C /* Settings.storyboard */; };
|
||||||
5183CCEF227125970010922C /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCEE227125970010922C /* SettingsViewController.swift */; };
|
5183CCEF227125970010922C /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5183CCEE227125970010922C /* SettingsViewController.swift */; };
|
||||||
|
5186515223552E610078E021 /* NNW3PlistConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5186515123552E610078E021 /* NNW3PlistConverter.swift */; };
|
||||||
|
5186515E23552F040078E021 /* NNW3Feed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5186515B23552F040078E021 /* NNW3Feed.swift */; };
|
||||||
|
5186515F23552F040078E021 /* NNW3Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5186515C23552F040078E021 /* NNW3Document.swift */; };
|
||||||
|
5186516023552F040078E021 /* NNW3Entry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5186515D23552F040078E021 /* NNW3Entry.swift */; };
|
||||||
|
51865167235556240078E021 /* NNW3FeedsImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51865166235556240078E021 /* NNW3FeedsImporter.swift */; };
|
||||||
519B8D332143397200FA689C /* SharingServiceDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 519B8D322143397200FA689C /* SharingServiceDelegate.swift */; };
|
519B8D332143397200FA689C /* SharingServiceDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 519B8D322143397200FA689C /* SharingServiceDelegate.swift */; };
|
||||||
51C451A9226377C200C03939 /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; };
|
51C451A9226377C200C03939 /* ArticlesDatabase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; };
|
||||||
51C451AA226377C200C03939 /* ArticlesDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
51C451AA226377C200C03939 /* ArticlesDatabase.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8407167F2262A61100344432 /* ArticlesDatabase.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
@ -690,6 +697,8 @@
|
|||||||
515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddLocalAccountViewController.swift; sourceTree = "<group>"; };
|
515436872291D75D005E1CDF /* AddLocalAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddLocalAccountViewController.swift; sourceTree = "<group>"; };
|
||||||
515436892291FED9005E1CDF /* FeedbinAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountViewController.swift; sourceTree = "<group>"; };
|
515436892291FED9005E1CDF /* FeedbinAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountViewController.swift; sourceTree = "<group>"; };
|
||||||
51554BFC228B6EB50055115A /* SyncDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SyncDatabase.xcodeproj; path = Frameworks/SyncDatabase/SyncDatabase.xcodeproj; sourceTree = SOURCE_ROOT; };
|
51554BFC228B6EB50055115A /* SyncDatabase.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SyncDatabase.xcodeproj; path = Frameworks/SyncDatabase/SyncDatabase.xcodeproj; sourceTree = SOURCE_ROOT; };
|
||||||
|
516CAC42235521070038D354 /* ImportNNW3Sheet.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ImportNNW3Sheet.xib; sourceTree = "<group>"; };
|
||||||
|
516CAC4B235521070038D354 /* ImportNNW3WindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportNNW3WindowController.swift; sourceTree = "<group>"; };
|
||||||
5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = "<group>"; };
|
5183CCCF226E1E880010922C /* NonIntrinsicLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicLabel.swift; sourceTree = "<group>"; };
|
||||||
5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = "<group>"; };
|
5183CCD9226E31A50010922C /* NonIntrinsicImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicImageView.swift; sourceTree = "<group>"; };
|
||||||
5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationProgressView.swift; sourceTree = "<group>"; };
|
5183CCDC226F1F5C0010922C /* NavigationProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationProgressView.swift; sourceTree = "<group>"; };
|
||||||
@ -699,6 +708,11 @@
|
|||||||
5183CCE7226F68D90010922C /* AccountRefreshTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountRefreshTimer.swift; sourceTree = "<group>"; };
|
5183CCE7226F68D90010922C /* AccountRefreshTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountRefreshTimer.swift; sourceTree = "<group>"; };
|
||||||
5183CCEC22711DCE0010922C /* Settings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Settings.storyboard; sourceTree = "<group>"; };
|
5183CCEC22711DCE0010922C /* Settings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Settings.storyboard; sourceTree = "<group>"; };
|
||||||
5183CCEE227125970010922C /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
|
5183CCEE227125970010922C /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = "<group>"; };
|
||||||
|
5186515123552E610078E021 /* NNW3PlistConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NNW3PlistConverter.swift; sourceTree = "<group>"; };
|
||||||
|
5186515B23552F040078E021 /* NNW3Feed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NNW3Feed.swift; sourceTree = "<group>"; };
|
||||||
|
5186515C23552F040078E021 /* NNW3Document.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NNW3Document.swift; sourceTree = "<group>"; };
|
||||||
|
5186515D23552F040078E021 /* NNW3Entry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NNW3Entry.swift; sourceTree = "<group>"; };
|
||||||
|
51865166235556240078E021 /* NNW3FeedsImporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NNW3FeedsImporter.swift; sourceTree = "<group>"; };
|
||||||
519B8D322143397200FA689C /* SharingServiceDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharingServiceDelegate.swift; sourceTree = "<group>"; };
|
519B8D322143397200FA689C /* SharingServiceDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SharingServiceDelegate.swift; sourceTree = "<group>"; };
|
||||||
51C4524E226506F400C03939 /* UIStoryboard-Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStoryboard-Extensions.swift"; sourceTree = "<group>"; };
|
51C4524E226506F400C03939 /* UIStoryboard-Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStoryboard-Extensions.swift"; sourceTree = "<group>"; };
|
||||||
51C45250226506F400C03939 /* String-Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String-Extensions.swift"; sourceTree = "<group>"; };
|
51C45250226506F400C03939 /* String-Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "String-Extensions.swift"; sourceTree = "<group>"; };
|
||||||
@ -1041,6 +1055,20 @@
|
|||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
516CAC53235529180038D354 /* NNW3 */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
516CAC42235521070038D354 /* ImportNNW3Sheet.xib */,
|
||||||
|
516CAC4B235521070038D354 /* ImportNNW3WindowController.swift */,
|
||||||
|
51865166235556240078E021 /* NNW3FeedsImporter.swift */,
|
||||||
|
5186515123552E610078E021 /* NNW3PlistConverter.swift */,
|
||||||
|
5186515C23552F040078E021 /* NNW3Document.swift */,
|
||||||
|
5186515D23552F040078E021 /* NNW3Entry.swift */,
|
||||||
|
5186515B23552F040078E021 /* NNW3Feed.swift */,
|
||||||
|
);
|
||||||
|
path = NNW3;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
5183CCDB226F1EEB0010922C /* Progress */ = {
|
5183CCDB226F1EEB0010922C /* Progress */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -1256,6 +1284,7 @@
|
|||||||
849A97551ED9EAC3007D329B /* Add Feed */,
|
849A97551ED9EAC3007D329B /* Add Feed */,
|
||||||
849A97411ED9EAA9007D329B /* Add Folder */,
|
849A97411ED9EAA9007D329B /* Add Folder */,
|
||||||
5144EA39227A377700D19003 /* OPML */,
|
5144EA39227A377700D19003 /* OPML */,
|
||||||
|
516CAC53235529180038D354 /* NNW3 */,
|
||||||
);
|
);
|
||||||
path = MainWindow;
|
path = MainWindow;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -1969,12 +1998,12 @@
|
|||||||
ORGANIZATIONNAME = "Ranchero Software";
|
ORGANIZATIONNAME = "Ranchero Software";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
6581C73220CED60000F4AD34 = {
|
6581C73220CED60000F4AD34 = {
|
||||||
DevelopmentTeam = M8L2WTLA8W;
|
DevelopmentTeam = SHJK2V3AJG;
|
||||||
ProvisioningStyle = Manual;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
840D617B2029031C009BC708 = {
|
840D617B2029031C009BC708 = {
|
||||||
CreatedOnToolsVersion = 9.3;
|
CreatedOnToolsVersion = 9.3;
|
||||||
DevelopmentTeam = M8L2WTLA8W;
|
DevelopmentTeam = SHJK2V3AJG;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
SystemCapabilities = {
|
SystemCapabilities = {
|
||||||
com.apple.BackgroundModes = {
|
com.apple.BackgroundModes = {
|
||||||
@ -1990,8 +2019,8 @@
|
|||||||
};
|
};
|
||||||
849C645F1ED37A5D003D8FC0 = {
|
849C645F1ED37A5D003D8FC0 = {
|
||||||
CreatedOnToolsVersion = 8.2.1;
|
CreatedOnToolsVersion = 8.2.1;
|
||||||
DevelopmentTeam = M8L2WTLA8W;
|
DevelopmentTeam = SHJK2V3AJG;
|
||||||
ProvisioningStyle = Manual;
|
ProvisioningStyle = Automatic;
|
||||||
SystemCapabilities = {
|
SystemCapabilities = {
|
||||||
com.apple.HardenedRuntime = {
|
com.apple.HardenedRuntime = {
|
||||||
enabled = 1;
|
enabled = 1;
|
||||||
@ -2000,7 +2029,7 @@
|
|||||||
};
|
};
|
||||||
849C64701ED37A5D003D8FC0 = {
|
849C64701ED37A5D003D8FC0 = {
|
||||||
CreatedOnToolsVersion = 8.2.1;
|
CreatedOnToolsVersion = 8.2.1;
|
||||||
DevelopmentTeam = 9C84TZ7Q6Z;
|
DevelopmentTeam = SHJK2V3AJG;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
TestTargetID = 849C645F1ED37A5D003D8FC0;
|
TestTargetID = 849C645F1ED37A5D003D8FC0;
|
||||||
};
|
};
|
||||||
@ -2255,6 +2284,7 @@
|
|||||||
files = (
|
files = (
|
||||||
844B5B651FEA11F200C7C76A /* GlobalKeyboardShortcuts.plist in Resources */,
|
844B5B651FEA11F200C7C76A /* GlobalKeyboardShortcuts.plist in Resources */,
|
||||||
5127B23A222B4849006D641D /* DetailKeyboardShortcuts.plist in Resources */,
|
5127B23A222B4849006D641D /* DetailKeyboardShortcuts.plist in Resources */,
|
||||||
|
516CAC4C235521070038D354 /* ImportNNW3Sheet.xib in Resources */,
|
||||||
845479881FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist in Resources */,
|
845479881FEB77C000AD8B59 /* TimelineKeyboardShortcuts.plist in Resources */,
|
||||||
848362FF2262A30E00DA1D35 /* template.html in Resources */,
|
848362FF2262A30E00DA1D35 /* template.html in Resources */,
|
||||||
848363082262A3DD00DA1D35 /* Main.storyboard in Resources */,
|
848363082262A3DD00DA1D35 /* Main.storyboard in Resources */,
|
||||||
@ -2462,9 +2492,11 @@
|
|||||||
D5A2678C20130ECF00A8D3C0 /* Author+Scriptability.swift in Sources */,
|
D5A2678C20130ECF00A8D3C0 /* Author+Scriptability.swift in Sources */,
|
||||||
84F2D5371FC22FCC00998D64 /* PseudoFeed.swift in Sources */,
|
84F2D5371FC22FCC00998D64 /* PseudoFeed.swift in Sources */,
|
||||||
51EF0F902279C9500050506E /* AccountsAddViewController.swift in Sources */,
|
51EF0F902279C9500050506E /* AccountsAddViewController.swift in Sources */,
|
||||||
|
5186515223552E610078E021 /* NNW3PlistConverter.swift in Sources */,
|
||||||
D57BE6E0204CD35F00D11AAC /* NSScriptCommand+NetNewsWire.swift in Sources */,
|
D57BE6E0204CD35F00D11AAC /* NSScriptCommand+NetNewsWire.swift in Sources */,
|
||||||
D553738B20186C20006D8857 /* Article+Scriptability.swift in Sources */,
|
D553738B20186C20006D8857 /* Article+Scriptability.swift in Sources */,
|
||||||
845EE7C11FC2488C00854A1F /* SmartFeed.swift in Sources */,
|
845EE7C11FC2488C00854A1F /* SmartFeed.swift in Sources */,
|
||||||
|
51865167235556240078E021 /* NNW3FeedsImporter.swift in Sources */,
|
||||||
84702AA41FA27AC0006B8943 /* MarkStatusCommand.swift in Sources */,
|
84702AA41FA27AC0006B8943 /* MarkStatusCommand.swift in Sources */,
|
||||||
D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */,
|
D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */,
|
||||||
8405DD9C22153BD7008CE1BF /* NSView-Extensions.swift in Sources */,
|
8405DD9C22153BD7008CE1BF /* NSView-Extensions.swift in Sources */,
|
||||||
@ -2503,6 +2535,7 @@
|
|||||||
5144EA51227B8E4500D19003 /* AccountsFeedbinWindowController.swift in Sources */,
|
5144EA51227B8E4500D19003 /* AccountsFeedbinWindowController.swift in Sources */,
|
||||||
84AD1EBC2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift in Sources */,
|
84AD1EBC2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift in Sources */,
|
||||||
845A29241FC9255E007B49E3 /* SidebarCellAppearance.swift in Sources */,
|
845A29241FC9255E007B49E3 /* SidebarCellAppearance.swift in Sources */,
|
||||||
|
5186515E23552F040078E021 /* NNW3Feed.swift in Sources */,
|
||||||
845EE7B11FC2366500854A1F /* StarredFeedDelegate.swift in Sources */,
|
845EE7B11FC2366500854A1F /* StarredFeedDelegate.swift in Sources */,
|
||||||
848F6AE51FC29CFB002D422E /* FaviconDownloader.swift in Sources */,
|
848F6AE51FC29CFB002D422E /* FaviconDownloader.swift in Sources */,
|
||||||
84C9FC7722629E1200D921D6 /* AdvancedPreferencesViewController.swift in Sources */,
|
84C9FC7722629E1200D921D6 /* AdvancedPreferencesViewController.swift in Sources */,
|
||||||
@ -2517,12 +2550,14 @@
|
|||||||
84DEE56522C32CA4005FC42C /* SmartFeedDelegate.swift in Sources */,
|
84DEE56522C32CA4005FC42C /* SmartFeedDelegate.swift in Sources */,
|
||||||
845213231FCA5B11003B6E93 /* ImageDownloader.swift in Sources */,
|
845213231FCA5B11003B6E93 /* ImageDownloader.swift in Sources */,
|
||||||
51EF0F922279CA620050506E /* AccountsAddTableCellView.swift in Sources */,
|
51EF0F922279CA620050506E /* AccountsAddTableCellView.swift in Sources */,
|
||||||
|
5186515F23552F040078E021 /* NNW3Document.swift in Sources */,
|
||||||
849A97431ED9EAA9007D329B /* AddFolderWindowController.swift in Sources */,
|
849A97431ED9EAA9007D329B /* AddFolderWindowController.swift in Sources */,
|
||||||
8405DDA522168C62008CE1BF /* TimelineContainerViewController.swift in Sources */,
|
8405DDA522168C62008CE1BF /* TimelineContainerViewController.swift in Sources */,
|
||||||
844B5B671FEA18E300C7C76A /* MainWIndowKeyboardHandler.swift in Sources */,
|
844B5B671FEA18E300C7C76A /* MainWIndowKeyboardHandler.swift in Sources */,
|
||||||
848D578E21543519005FFAD5 /* PasteboardFeed.swift in Sources */,
|
848D578E21543519005FFAD5 /* PasteboardFeed.swift in Sources */,
|
||||||
5144EA2F2279FAB600D19003 /* AccountsDetailViewController.swift in Sources */,
|
5144EA2F2279FAB600D19003 /* AccountsDetailViewController.swift in Sources */,
|
||||||
849A97801ED9EC42007D329B /* DetailViewController.swift in Sources */,
|
849A97801ED9EC42007D329B /* DetailViewController.swift in Sources */,
|
||||||
|
5186516023552F040078E021 /* NNW3Entry.swift in Sources */,
|
||||||
84C9FC6722629B9000D921D6 /* AppDelegate.swift in Sources */,
|
84C9FC6722629B9000D921D6 /* AppDelegate.swift in Sources */,
|
||||||
84C9FC7A22629E1200D921D6 /* AccountsTableViewBackgroundView.swift in Sources */,
|
84C9FC7A22629E1200D921D6 /* AccountsTableViewBackgroundView.swift in Sources */,
|
||||||
84CAFCAF22BC8C35007694F0 /* FetchRequestOperation.swift in Sources */,
|
84CAFCAF22BC8C35007694F0 /* FetchRequestOperation.swift in Sources */,
|
||||||
@ -2544,6 +2579,7 @@
|
|||||||
5144EA40227A37EC00D19003 /* ImportOPMLWindowController.swift in Sources */,
|
5144EA40227A37EC00D19003 /* ImportOPMLWindowController.swift in Sources */,
|
||||||
849A976D1ED9EBC8007D329B /* TimelineTableView.swift in Sources */,
|
849A976D1ED9EBC8007D329B /* TimelineTableView.swift in Sources */,
|
||||||
84D52E951FE588BB00D14F5B /* DetailStatusBarView.swift in Sources */,
|
84D52E951FE588BB00D14F5B /* DetailStatusBarView.swift in Sources */,
|
||||||
|
516CAC4D235521070038D354 /* ImportNNW3WindowController.swift in Sources */,
|
||||||
D5E4CC64202C1AC1009B4FFC /* MainWindowController+Scriptability.swift in Sources */,
|
D5E4CC64202C1AC1009B4FFC /* MainWindowController+Scriptability.swift in Sources */,
|
||||||
84C9FC7922629E1200D921D6 /* PreferencesWindowController.swift in Sources */,
|
84C9FC7922629E1200D921D6 /* PreferencesWindowController.swift in Sources */,
|
||||||
84411E711FE5FBFA004B527F /* SmallIconProvider.swift in Sources */,
|
84411E711FE5FBFA004B527F /* SmallIconProvider.swift in Sources */,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user