154 lines
3.3 KiB
Swift
154 lines
3.3 KiB
Swift
//
|
|
// Article+Scriptability.swift
|
|
// NetNewsWire
|
|
//
|
|
// Created by Olof Hellman on 1/23/18.
|
|
// Copyright © 2018 Olof Hellman. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Account
|
|
import Articles
|
|
|
|
@objc(ScriptableArticle)
|
|
class ScriptableArticle: NSObject, UniqueIdScriptingObject, ScriptingObjectContainer {
|
|
|
|
let article: Article
|
|
let container: ScriptingObjectContainer
|
|
|
|
init (_ article: Article, container: ScriptingObjectContainer) {
|
|
self.article = article
|
|
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 "articles"
|
|
}
|
|
|
|
// MARK: --- UniqueIdScriptingObject protocol ---
|
|
|
|
// articles have id in the NetNewsWire database and id in the feed
|
|
// article.uniqueID here is the feed unique id
|
|
|
|
@objc(uniqueId)
|
|
var scriptingUniqueId: Any {
|
|
return article.uniqueID
|
|
}
|
|
|
|
// MARK: --- ScriptingObjectContainer protocol ---
|
|
|
|
var scriptingClassDescription: NSScriptClassDescription {
|
|
return self.classDescription as! NSScriptClassDescription
|
|
}
|
|
|
|
func deleteElement(_ element: ScriptingObject) {
|
|
print("delete event not handled")
|
|
}
|
|
|
|
// MARK: --- Scriptable properties ---
|
|
|
|
@objc(url)
|
|
var url: String? {
|
|
return article.preferredLink
|
|
}
|
|
|
|
@objc(permalink)
|
|
var permalink: String? {
|
|
return article.link
|
|
}
|
|
|
|
@objc(externalUrl)
|
|
var externalUrl: String? {
|
|
return article.externalLink
|
|
}
|
|
|
|
@objc(title)
|
|
var title: String {
|
|
return article.title ?? ""
|
|
}
|
|
|
|
@objc(contents)
|
|
var contents: String {
|
|
return article.contentText ?? ""
|
|
}
|
|
|
|
@objc(html)
|
|
var html: String {
|
|
return article.contentHTML ?? ""
|
|
}
|
|
|
|
@objc(summary)
|
|
var summary: String {
|
|
return article.summary ?? ""
|
|
}
|
|
|
|
@objc(datePublished)
|
|
var datePublished: Date? {
|
|
return article.datePublished
|
|
}
|
|
|
|
@objc(dateModified)
|
|
var dateModified: Date? {
|
|
return article.dateModified
|
|
}
|
|
|
|
@objc(dateArrived)
|
|
var dateArrived: Date {
|
|
return article.status.dateArrived
|
|
}
|
|
|
|
@objc(read)
|
|
var read: Bool {
|
|
get {
|
|
return article.status.boolStatus(forKey: .read)
|
|
}
|
|
set {
|
|
markArticles([self.article], statusKey: .read, flag: newValue)
|
|
}
|
|
}
|
|
|
|
@objc(starred)
|
|
var starred: Bool {
|
|
get {
|
|
return article.status.boolStatus(forKey: .starred)
|
|
}
|
|
set {
|
|
markArticles([self.article], statusKey: .starred, flag: newValue)
|
|
}
|
|
}
|
|
|
|
@objc(deleted)
|
|
var deleted: Bool {
|
|
return false
|
|
}
|
|
|
|
@objc(imageURL)
|
|
var imageURL: String {
|
|
return article.imageLink ?? ""
|
|
}
|
|
|
|
@objc(authors)
|
|
var authors: NSArray {
|
|
let articleAuthors = article.authors ?? []
|
|
return articleAuthors.map { ScriptableAuthor($0, container: self) } as NSArray
|
|
}
|
|
|
|
@objc(feed)
|
|
var feed: ScriptableFeed? {
|
|
guard let parentFeed = self.article.feed,
|
|
let account = parentFeed.account
|
|
else { return nil }
|
|
|
|
return ScriptableFeed(parentFeed, container: ScriptableAccount(account))
|
|
}
|
|
|
|
}
|