Files
NetNewsWire/Mac/Scriptability/Article+Scriptability.swift
Duncan Babbage cc855f3832 link and URL vars for Article. Storage as rawLink
link and externalLink fall back to providing the raw stored value if URLs cannot be created even with repair.
2021-09-30 16:51:59 +13:00

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.rawLink ?? article.rawExternalLink
}
@objc(permalink)
var permalink:String? {
return article.rawLink
}
@objc(externalUrl)
var externalUrl:String? {
return article.rawExternalLink
}
@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.rawImageLink ?? ""
}
@objc(authors)
var authors:NSArray {
let articleAuthors = article.authors ?? []
return articleAuthors.map { ScriptableAuthor($0, container:self) } as NSArray
}
@objc(feed)
var feed: ScriptableWebFeed? {
guard let parentFeed = self.article.webFeed,
let account = parentFeed.account
else { return nil }
return ScriptableWebFeed(parentFeed, container: ScriptableAccount(account))
}
}