mirror of
https://github.com/Ranchero-Software/NetNewsWire.git
synced 2024-12-27 10:02:37 +01:00
31bd9d918c
Also, added support for accessing feeds directly from the top level container, essentially skipping account as a hierarchy level. With this change, a script like tell app “Evergreen” title of every article of feed "Six Colors" where read is true end tell produces the expected result.
105 lines
2.6 KiB
Swift
105 lines
2.6 KiB
Swift
//
|
|
// Feed+Scriptability.swift
|
|
// Evergreen
|
|
//
|
|
// Created by Olof Hellman on 1/10/18.
|
|
// Copyright © 2018 Olof Hellman. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Account
|
|
import Data
|
|
|
|
@objc(ScriptableFeed)
|
|
class ScriptableFeed: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer{
|
|
|
|
let feed:Feed
|
|
let container:ScriptingObjectContainer
|
|
|
|
init (_ feed:Feed, container:ScriptingObjectContainer) {
|
|
self.feed = feed
|
|
self.container = container
|
|
}
|
|
|
|
@objc(objectSpecifier)
|
|
override var objectSpecifier: NSScriptObjectSpecifier? {
|
|
let scriptObjectSpecifier = self.container.makeFormUniqueIDScriptObjectSpecifier(forObject:self)
|
|
return (scriptObjectSpecifier)
|
|
}
|
|
|
|
// MARK: --- ScriptingObject protocol ---
|
|
|
|
var scriptingKey: String {
|
|
return "feeds"
|
|
}
|
|
|
|
// MARK: --- UniqueIdScriptingObject protocol ---
|
|
|
|
// I am not sure if account should prefer to be specified by name or by ID
|
|
// but in either case it seems like the accountID would be used as the keydata, so I chose ID
|
|
|
|
var scriptingUniqueId:Any {
|
|
return feed.feedID
|
|
}
|
|
|
|
// MARK: --- ScriptingObjectContainer protocol ---
|
|
|
|
var scriptingClassDescription: NSScriptClassDescription {
|
|
return self.classDescription as! NSScriptClassDescription
|
|
}
|
|
|
|
// MARK: --- Scriptable properties ---
|
|
|
|
@objc(url)
|
|
var url:String {
|
|
return self.feed.url
|
|
}
|
|
|
|
@objc(uniqueId)
|
|
var uniqueId:String {
|
|
return self.feed.feedID
|
|
}
|
|
|
|
@objc(name)
|
|
var name:String {
|
|
return self.feed.name ?? ""
|
|
}
|
|
|
|
@objc(homePageURL)
|
|
var homePageURL:String {
|
|
return self.feed.homePageURL ?? ""
|
|
}
|
|
|
|
@objc(iconURL)
|
|
var iconURL:String {
|
|
return self.feed.iconURL ?? ""
|
|
}
|
|
|
|
@objc(faviconURL)
|
|
var faviconURL:String {
|
|
return self.feed.faviconURL ?? ""
|
|
}
|
|
|
|
@objc(opmlRepresentation)
|
|
var opmlRepresentation:String {
|
|
return self.feed.OPMLString(indentLevel:0)
|
|
}
|
|
|
|
@objc(authors)
|
|
var authors:NSArray {
|
|
let feedAuthors = feed.authors ?? []
|
|
return feedAuthors.map { ScriptableAuthor($0, container:self) } as NSArray
|
|
}
|
|
|
|
@objc(articles)
|
|
var articles:NSArray {
|
|
let feedArticles = feed.fetchArticles()
|
|
// the articles are a set, use the sorting algorithm from the viewer
|
|
let sortedArticles = feedArticles.sorted(by:{
|
|
return $0.logicalDatePublished > $1.logicalDatePublished
|
|
})
|
|
return sortedArticles.map { ScriptableArticle($0, container:self) } as NSArray
|
|
}
|
|
|
|
}
|