diff --git a/chrome/content/zotero/xpcom/data/feedItem.js b/chrome/content/zotero/xpcom/data/feedItem.js index 7cdc131ae1..4ba8051312 100644 --- a/chrome/content/zotero/xpcom/data/feedItem.js +++ b/chrome/content/zotero/xpcom/data/feedItem.js @@ -33,9 +33,9 @@ Zotero.FeedItem = function(itemTypeOrID, params = {}) { this._feedItemReadTime = null; Zotero.Utilities.assignProps(this, params, ['guid']); -} +}; -Zotero.extendClass(Zotero.Item, Zotero.FeedItem) +Zotero.extendClass(Zotero.Item, Zotero.FeedItem); Zotero.FeedItem.prototype._objectType = 'feedItem'; Zotero.FeedItem.prototype._containerObject = 'feed'; @@ -69,6 +69,22 @@ Zotero.defineProperty(Zotero.FeedItem.prototype, 'isRead', { } } }); +// +//Zotero.defineProperty(Zotero.FeedItem.prototype, 'isTranslated', { +// get: function() { +// return !!this._feedItemTranslationTime; +// }, +// set: function(state) { +// if (state != !!this._feedItemTranslationTime) { +// if (state) { +// this._feedItemTranslationTime = Zotero.Date.dateToSQL(new Date(), true); +// } else { +// this._feedItemTranslationTime = null; +// } +// this._changed.feedItemData = true; +// } +// } +//}); Zotero.FeedItem.prototype.loadPrimaryData = Zotero.Promise.coroutine(function* (reload, failOnMissing) { if (this.guid && !this.id) { @@ -183,4 +199,61 @@ Zotero.FeedItem.prototype.forceEraseTx = function(options) { Object.assign(newOptions, options || {}); newOptions.skipEditCheck = true; return this.eraseTx(newOptions); -} +}; + +/** + * Uses the item url to translate an existing feed item. + * If libraryID empty, overwrites feed item, otherwise saves + * in the library + * @param libraryID {int} save item in library + * @param collectionID {int} add item to collection + * @return {Promise} translated feed item + */ +Zotero.FeedItem.prototype.translate = Zotero.Promise.coroutine(function* (libaryID, collectionID) { + let deferred = Zotero.Promise.defer(); + let error = function(e) { Zotero.debug(e, 1); deferred.reject(e); }; + + // Load document + let hiddenBrowser = Zotero.HTTP.processDocuments( + this.getField('url'), + (item) => deferred.resolve(item), + ()=>{}, error, true + ); + let doc = yield deferred.promise; + + // Set translate document + let translate = new Zotero.Translate.Web(); + translate.setDocument(doc); + + // Load translators + deferred = Zotero.Promise.defer(); + translate.setHandler('translators', (me, translators) => deferred.resolve(translators)); + translate.getTranslators(); + let translators = yield deferred.promise; + if (! translators || !translators.length) { + Zotero.debug("No translators detected for FeedItem " + this.id + " with url " + this.getField('url'), 2); + throw new Zotero.Error("No translators detected for FeedItem " + this.id + " with url " + this.getField('url')) + } + translate.setTranslator(translators[0]); + + deferred = Zotero.Promise.defer(); + // Clear these to prevent saving + translate.clearHandlers('itemDone'); + translate.clearHandlers('itemsDone'); + translate.setHandler('error', error); + translate.setHandler('itemDone', (_, items) => deferred.resolve(items)); + + translate.translate({libraryID: false, saveAttachments: false}); + + let itemData = yield deferred.promise; + Zotero.Browser.deleteHiddenBrowser(hiddenBrowser); + + // clean itemData + const deleteFields = ['attachments', 'notes', 'id', 'itemID', 'path', 'seeAlso', 'version', 'dateAdded', 'dateModified']; + for (let field of deleteFields) { + delete itemData[field]; + } + // set new translated data for item + this.fromJSON(itemData); + this.forceSaveTx(); +}); diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js index e1d89db6dd..cae07e0fa2 100644 --- a/chrome/content/zotero/xpcom/translation/translate.js +++ b/chrome/content/zotero/xpcom/translation/translate.js @@ -1212,7 +1212,7 @@ Zotero.Translate.Base.prototype = { if(!translators.length) { me.complete(false, "Could not find an appropriate translator"); } else { - me.setTranslator(translators); + me.setTranslator(translators[0]); deferred.resolve(Zotero.Translate.Base.prototype.translate.call(me, options)); } }); diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js index f19cf670d5..d7cf32ae5a 100644 --- a/chrome/content/zotero/zoteroPane.js +++ b/chrome/content/zotero/zoteroPane.js @@ -1376,7 +1376,8 @@ var ZoteroPane = new function() } if (item.isFeedItem) { - this.startItemReadTimeout(item.id); + item.translate(); + this.startItemReadTimeout.bind(this, item.id); } } }