www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | Submodules | README | LICENSE

commit 596c6da3ee59e8109b55f97cacf0d98eda822d02
parent 35b1c168584ea59d2c2a236d94717eca99751ec6
Author: Dan Stillman <dstillman@zotero.org>
Date:   Tue, 15 Jan 2013 03:23:37 -0500

Remove Commons code, which contains E4X

Some items pane code is still in place, since it's a decent example of
dynamic items pane loading.

Diffstat:
Mchrome/content/zotero/xpcom/collectionTreeView.js | 25-------------------------
Dchrome/content/zotero/xpcom/commons.js | 1421-------------------------------------------------------------------------------
Mchrome/content/zotero/xpcom/zotero.js | 16+---------------
Mchrome/content/zotero/zoteroPane.js | 131-------------------------------------------------------------------------------
Mcomponents/zotero-service.js | 1-
Mdefaults/preferences/zotero.js | 5-----
6 files changed, 1 insertion(+), 1598 deletions(-)

diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -182,31 +182,6 @@ Zotero.CollectionTreeView.prototype.refresh = function() } } - if (this.hideSources.indexOf('commons') == -1 && Zotero.Commons.enabled) { - this._showRow(new Zotero.ItemGroup('separator', false)); - var header = { - id: "commons-header", - label: "Commons", // TODO: localize - expand: function (buckets) { - var show = function (buckets) { - for each(var bucket in buckets) { - self._showRow(new Zotero.ItemGroup('bucket', bucket), 1); - } - } - if (buckets) { - show(buckets); - } - else { - Zotero.Commons.getBuckets(show); - } - } - }; - this._showRow(new Zotero.ItemGroup('header', header), null, null, commonsExpand); - if (commonsExpand) { - header.expand(); - } - } - try { this._refreshHashMap(); } diff --git a/chrome/content/zotero/xpcom/commons.js b/chrome/content/zotero/xpcom/commons.js @@ -1,1421 +0,0 @@ -/* - ***** BEGIN LICENSE BLOCK ***** - - Copyright © 2009 Center for History and New Media - George Mason University, Fairfax, Virginia, USA - http://zotero.org - - This file is part of Zotero. - - Zotero is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Zotero is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with Zotero. If not, see <http://www.gnu.org/licenses/>. - - ***** END LICENSE BLOCK ***** -*/ - -//TODO localize -Zotero.Commons = new function() { - this.uri = 'http://www.archive.org/'; - this.apiUrl = 'http://s3.us.archive.org'; - this.postCreateBucketDelay = 2000; - - this.__defineGetter__('enabled', function () { - return Zotero.Prefs.get("commons.enabled"); - }); - - this.__defineSetter__('enabled', function (val) { - return Zotero.Prefs.set("commons.enabled", !!val); - }); - - this.__defineGetter__('userIdentifier', function () { - return Zotero.Prefs.get("commons.accessKey"); - }); - - this.__defineGetter__('accessKey', function () { - return Zotero.Prefs.get("commons.accessKey"); - }); - - this.__defineSetter__('accessKey', function (val) { - return Zotero.Prefs.set("commons.accessKey", val); - }); - - this.__defineGetter__('secretKey', function () { - return Zotero.Prefs.get("commons.secretKey"); - }); - - this.__defineSetter__('secretKey', function (val) { - // TODO: use login manager - return Zotero.Prefs.set("commons.secretKey", val); - }); - - this.__defineGetter__('userNameSlug', function () { - if (!_userNameSlug) { - throw ("Username not set in Zotero.Commons.userNameSlug getter"); - } - return _userNameSlug; - }); - - this.RDF_TRANSLATOR = { - 'label': 'Zotero RDF', - 'target': 'rdf', - 'translatorID': '14763d24-8ba0-45df-8f52-b8d1108e7ac9', - 'displayOptions': { - 'exportFileData': true, - 'exportNotes': true - } - }; - - this.RDF_IMPORT_TRANSLATOR = { - 'translatorID': '5e3ad958-ac79-463d-812b-a86a9235c28f', - } - - this.ERROR_BUCKET_EXISTS = 1; - - this.refreshNeeded = true; - - var _userName; - var _userNameSlug; - var _buckets = {}; - var _bucketsLoading = false; - var _bucketsLoaded = false; - var _requestingItems = false; - - - this.getBuckets = function (callback) { - if (!this.enabled) { - if (callback) { - callback(_buckets); - } - return; - } - - var accessKey = this.accessKey; - var secretKey = this.secretKey; - - if (_bucketsLoaded) { - if (callback) { - callback(_buckets); - } - return; - } - - if (_bucketsLoading) { - Zotero.debug("Already loading buckets"); - if (callback) { - callback(_buckets); - } - return; - } - - _bucketsLoading = true; - - var syncCallback = function (req) { - // Error - if (req.status != 200) { - Zotero.debug(req.status); - Zotero.debug(req.responseText); - - if (req.status == 503) { - alert("Unable to retrieve bucket list from the Internet Archive: server unavailable."); - } - else { - alert("Unable to retrieve bucket list from the Internet Archive: server error " + req.status); - } - - _bucketsLoading = false; - - return; - } - - Zotero.debug(req.responseText); - - _userName = req.responseXML.getElementsByTagName('DisplayName')[0].textContent; - _userNameSlug = Zotero.Commons.slugify(_userName); - - var currentBuckets = []; - var IABuckets = []; - - for (var name in _buckets) { - currentBuckets.push(name); - } - currentBuckets.sort(); - - Zotero.debug('=========='); - Zotero.debug("CURRENT BUCKETS"); - Zotero.debug(currentBuckets); - - - var buckets = req.responseXML.getElementsByTagName("Bucket"); - for (var i=0, len=buckets.length; i<len; i++) { - var bucketName = buckets[i].getElementsByTagName('Name')[0].textContent; - IABuckets.push(bucketName); - } - IABuckets.sort(); - - Zotero.debug("IA BUCKETS"); - Zotero.debug(IABuckets); - - var addBuckets = Zotero.Utilities.arrayDiff(IABuckets, currentBuckets); - var removeBuckets = Zotero.Utilities.arrayDiff(currentBuckets, IABuckets); - - Zotero.debug("ADD"); - Zotero.debug(addBuckets); - Zotero.debug("REMOVE"); - Zotero.debug(removeBuckets); - - for each(var name in removeBuckets) { - delete _buckets[name]; - } - - var ids = []; - var refresh = false; - for each(var name in addBuckets) { - refresh = true; - var bucket = new Zotero.Commons.Bucket(name); - _buckets[name] = bucket; - ids.push(bucket.id); - } - - _bucketsLoading = false; - _bucketsLoaded = true; - - // refresh left pane if local bucket list changed - if (refresh) { - Zotero.Notifier.trigger('add', 'bucket', ids); - } - - if (callback) { - callback(_buckets); - } - }; - - this.createAuthenticatedRequest( - "GET", "/", {}, accessKey, secretKey, syncCallback, null, false, true - ); - }; - - - this.isValidBucketTitle = function (title) { - if (!title) { - return false; - } - if (title.constructor.name != 'String') { - return false; - } - return title.length <= 255; - } - - - this.isValidBucketName = function (name) { - if (!name) { - return false; - } - if (name.constructor.name != 'String') { - return false; - } - - return name.match(/^[a-z0-9_-]{0,32}$/); // TODO: check IA pattern - } - - - this.createBucket = function (name, title, onBucketCreated) { - if (!_userName) { - throw new Exception("Username not set in Zotero.Commons.createBucket()"); - } - name = this.userNameSlug + "-" + name; - - var headers = { - "x-archive-auto-make-bucket":"1", - "x-archive-meta01-collection":"zoterocommons", - "x-archive-meta02-collection":"scholarworkspaces", - "x-archive-meta-sponsor":"Andrew W. Mellon Foundation" - }; - - if (!this.isValidBucketName(name)) { - throw ("Bucket name '" + name + "' must be ASCII in Zotero.Commons.createBucket()"); - } - - if (!title) { - title = name; - } - - if (!this.isValidBucketTitle(title)) { - throw ("Invalid title '" + title + "' in Zotero.Commons.createBucket()"); - } - - headers["x-archive-meta-title"] = title; - headers["x-archive-meta-mediatype"] = "texts"; - - Zotero.Commons.createAuthenticatedRequest( - "PUT", "/" + name, headers, this.accessKey, this.secretKey, - function (req) { - Zotero.debug(req.status); - - if (req.status == 201) { - var bucket = new Zotero.Commons.Bucket(name); - _buckets[name] = bucket; - - Zotero.Notifier.trigger('add', 'bucket', [name]); - - if (onBucketCreated) { - onBucketCreated(); - } - } - else { - Zotero.debug(req.status); - Zotero.debug(req.responseText); - - Zotero.Commons.error("Error creating bucket '" + name + "'"); - } - } - ); - } - - - this.createAuthenticatedRequest = function (method, resource, headers, accessKey, secretKey, callback, data, sendAsBinary, noCache) { - var apiURL = Zotero.Commons.apiUrl; - var url = apiURL + resource; - - Zotero.debug("Commons HTTP " + method + ": " + url); - - var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] - .createInstance(Components.interfaces.nsIXMLHttpRequest); - req.open(method, url, true); - - var d = new Date(); - headers["Date"] = d.toUTCString(); - - var signatureData = method + '\n' + - ((headers['Content-MD5']) ? headers['Content-MD5'] : '') + '\n' + - ((headers['Content-Type']) ? headers['Content-Type'] : '') + '\n' + - ((headers['Date']) ? headers['Date'] : '') + '\n'; - - // add x-amz- headers in alphabetic order - var amz = []; - for(header in headers) { - if(header.indexOf("x-amz-") == 0) { - amz.push(header + ":" + headers[header] + '\n'); - } - } - signatureData += amz.sort().join(''); - - signatureData += req.channel.URI.spec.substr(apiURL.length); - - var signature = Zotero.Commons.SHA1.b64_hmac_sha1(secretKey, signatureData) + '='; - headers["Authorization"] = "AWS " + accessKey + ":" + signature; - //headers["Authorization"] = "LOW " + accessKey + ":" + secretKey; - - for(var header in headers) { - req.setRequestHeader(header, headers[header]); - } - - if (noCache) { - req.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE; - } - - if (data) { - if (sendAsBinary) { - req.sendAsBinary(data); - } - else { - req.send(data); - } - } - else { - req.send(null); - } - - - if (callback) { - req.onreadystatechange = function() { - if (req.readyState == 4) { - callback(req); - } - }; - } - } - - - // Recursively add files and directories to zipWriter - this.zipDirectory = function (rootDir, dir, zipWriter) { - dir = dir.directoryEntries; - while(dir.hasMoreElements()) { - var file = dir.getNext(); - file.QueryInterface(Components.interfaces.nsILocalFile); - - var fileName = file.getRelativeDescriptor(rootDir); - if(fileName.indexOf('.') == 0) { - Zotero.debug('Skipping file ' + fileName); - continue; - } - - // addEntryFile works for both files and directories - zipWriter.addEntryFile( - fileName, - Components.interfaces.nsIZipWriter.COMPRESSION_DEFAULT, - file, - true - ); - - if (file.isDirectory()) { - Zotero.Commons.zipDirectory(rootDir, file, zipWriter); - continue; - } - } - } - - - this.error = function (message) { - Components.utils.reportError(message); - var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] - .getService(Components.interfaces.nsIPromptService); - ps.alert(null, "Zotero Commons Error", message); - } - - - this.slugify = function (input) { - var slug = Zotero.Utilities.trim(input) - .toLowerCase() - .replace(/[^a-z0-9 ._-]/g, "") - //.replace(/ /g, "_"); - .replace(/ /g, "-"); - return slug; - } -} - - -Zotero.Commons.Bucket = function (name) { - this.id = Zotero.ID.getBigInt(); // assign a random ID to the bucket for this session - this.name = name; - this.accessKey = Zotero.Prefs.get("commons.accessKey"); - this.secretKey = Zotero.Prefs.get("commons.secretKey"); - this._items = null; - this._requestingItems = false; - this._needRefresh = false; - - this._items = {}; - this._itemsLoading = false; - this._itemsLoaded = false; - this._lastLoad = null; - - this._metadataLoading = false; - this._itemDataLoaded = false; - this._itemDataLoading = false; -} - - -Zotero.Commons.Bucket.prototype.__defineGetter__('uri', function () { - return 'http://www.archive.org/details/' + this.name; -}); - -Zotero.Commons.Bucket.prototype.__defineGetter__('downloadURI', function () { - return 'http://www.archive.org/download/' + this.name; -}); - -Zotero.Commons.Bucket.prototype.__defineGetter__('metadataURI', function () { - return this.downloadURI + '/' + this.name + '_meta.xml'; -}); - -Zotero.Commons.Bucket.prototype.__defineGetter__('apiPath', function() { - return '/' + this.name; -}); - -Zotero.Commons.Bucket.prototype.__defineGetter__('apiURI', function() { - return Zotero.Commons.apiUrl + this.apiPath; -}); - - -Zotero.Commons.Bucket.prototype.relationPredicate = "owl:sameAs"; -Zotero.Commons.Bucket.prototype.reloadSeconds = 60; - -Zotero.Commons.Bucket.prototype.exists = function (callback, maxTries, tries) { - if (!tries) { - tries = 0; - } - - var self = this; - - Zotero.HTTP.doHead(this.uri, function (xmlhttp) { - switch (xmlhttp.status) { - case 200: - callback(1); - return; - - case 404: - case 503: // IA returns this for missing buckets - tries++; - - if (tries >= maxTries) { - callback(0); - return; - } - - var delay = Zotero.Commons.postCreateBucketDelay * tries; - var seconds = delay / 1000; - Zotero.debug("Bucket " + self.name + " doesn't yet exist -- retrying in " + seconds + " seconds"); - - setTimeout(function () { - self.exists(callback, maxTries, tries); - }, delay); - return; - - default: - Zotero.debug(xmlhttp.status); - Zotero.debug(xmlhttp.responseText); - callback(-1); - return; - } - }); -} - - -Zotero.Commons.Bucket.prototype.getItems = function (callback) { - if (this._itemsLoading || - // Reload if data is too old - (this._itemsLoaded && (!this._lastLoad || (new Date - this._lastLoad) < (this.reloadSeconds * 1000)))) { - Zotero.debug("Using cached items"); - return this._getCachedItems(); - } - - Zotero.debug("Loading items from IA"); - - this._itemsLoading = true; - - var method = "GET"; - var uri = this.downloadURI + "/" + this.name + "_files.xml"; - - var self = this; - var progressWin = null; - var progressWinIcon = 'chrome://zotero/skin/treeitem-attachment-pdf.png'; - - var req = Zotero.HTTP.doGet(uri, function (xmlhttp) { - if (xmlhttp.status != 200) { - Zotero.debug(xmlhttp.status); - Zotero.debug(xmlhttp.responseText); - Zotero.debug("Commons: Error retrieving bucket contents", 2); - self._itemsLoading = false; - return; - } - - Zotero.debug(xmlhttp.responseText); - - try { - // Strip XML declaration and convert to E4X - var xml = new XML(xmlhttp.responseText.replace(/<\?xml.*\?>/, '')); - } - catch (e) { - Zotero.debug("Commons: Invalid response retrieving bucket contents", 2); - this._itemsLoading = false; - return; - } - - try { - var zipsXML = xml.file.(@source == 'original').(typeof format != 'undefined' && format == 'Zotero ZIP Item'); - } - catch (e) { - Zotero.debug("Commons: Invalid XML retrieving bucket contents", 2); - this._itemsLoading = false; - return; - } - - Zotero.debug(zipsXML); - - var zips = []; - - // Parse files XML to get RDF and OCRed PDFs - var ocrOriginals = {}; - var ocrPDFXML = xml.file.(@source == 'derivative').(format == 'Additional Text PDF').@name; - for each(var pdf in ocrPDFXML) { - var fn = pdf.toString().replace(/_text\.pdf$/, '.pdf'); - ocrOriginals[fn] = true; - } - - for each(var zipXML in zipsXML) { - var key = zipXML.@name.toString(); - var title = zipXML.title.toString(); - - var childrenXML = xml.file.(typeof zipsource != 'undefined').(zipsource == key); - var rdf; - var children = []; - for each(var childXML in childrenXML) { - var childKey = childXML.@name.toString(); - - // Pull out RDF filename - if (childXML.format == 'Zotero RDF') { - rdf = childKey; - continue; - } - - children.push({ - key: childKey, - title: childXML.title.toString(), - ocr: ocrOriginals[childKey] ? true : false - }); - } - -/* - // See if we already have this item - if (self._items[key]) { - continue; - } -*/ - zips.push({ - key: key, - title: title, - rdf: rdf, - children: children - }); - } - - self._itemsLoading = false; - self._itemsLoaded = true; - self._lastLoad = new Date; - - Zotero.debug(zips); - - Zotero.Notifier.trigger('refresh', 'bucket', self.id); - - // Get RDF for new items, pulling off a stack - var process = function (zips) { - if (!zips.length) { - Zotero.debug("Commons: No more ZIPs to process"); - - if (callback) { - callback(); - } - - return; - } - - let zip = zips.shift(); - - // See if we already have this item - if (self._items[zip.key]) { - process(zips); - return; - } - - var rdfURI = self.downloadURI + '/' + zip.rdf; - - Zotero.HTTP.doGet(rdfURI, function (xmlhttp) { - // If RDF not available, skip item - if (xmlhttp.status != 200) { - Zotero.debug("RDF not found at " + xmlhttp.channel.originalURI.spec); - process(zips); - return; - } - - if (!xmlhttp.responseText) { - Zotero.debug("RDF file is empty at " + xmlhttp.channel.originalURI.spec); - process(zips); - return; - } - - Zotero.debug(xmlhttp.responseText); - - var translate = new Zotero.Translate("import"); - translate.setString(xmlhttp.responseText); - translate.getTranslators() - translate.setTranslator(Zotero.Commons.RDF_IMPORT_TRANSLATOR.translatorID); - translate.setHandler("itemDone", function (translation, item) { - var typeID = Zotero.ItemTypes.getID(item.itemType); - var newItem = new Zotero.Item(typeID); - newItem.id = Zotero.ID.getBigInt(); - - // Add item data to virtual item - for (var field in item) { - // Skip empty fields - if (!item[field]) { - continue; - } - var fieldID = Zotero.ItemFields.getID(field); - if (!fieldID) { - continue; - } - - try { - newItem.setField(fieldID, item[field]); - } - catch (e) { - Zotero.debug(e); - } - } - - // Add creators to virtual item - for (var i=0; i<item.creators.length; i++) { - try { - var creator = new Zotero.Creator; - creator.setFields(item.creators[i]); - newItem.setCreator(i, creator, item.creators[i].creatorType); - } - catch (e) { - Zotero.debug(e); - } - } - - self._items[zip.key] = newItem; - - Zotero.Notifier.trigger('refresh', 'bucket', self.id); - - // If item exists locally, check for OCRed attachments - var localItem = self.getLocalItem(newItem); - if (localItem) { - for each(var child in zip.children) { - if (!child.ocr) { - continue; - } - - var iaFileName = child.key.replace(/\.pdf$/, '_text.pdf'); - var iaFileURI = self.downloadURI + '/' + iaFileName; - - var rels = Zotero.Relations.getByURIs(null, self.relationPredicate, iaFileURI); - if (rels.length) { - Zotero.debug("Commons: " + iaFileName + " has already been downloaded -- skipping"); - continue; - } - - Zotero.debug("Downloading OCRed PDF " + iaFileName); - - var baseName = child.title.replace(/\.pdf$/, '') - baseName += ' (OCR)'; - var title = baseName + '.pdf'; - - if (!progressWin) { - progressWin = new Zotero.ProgressWindow(); - progressWin.changeHeadline("Downloading OCRed PDFs"); // TODO: localize - } - progressWin.addLines([title], [progressWinIcon]); - progressWin.show(); - progressWin.startCloseTimer(8000); - - var newAttachment = Zotero.Attachments.importFromURL( - iaFileURI, localItem.id, title, baseName, null, 'application/pdf' - ); - if (!(newAttachment instanceof Zotero.Item)) { - throw (newAttachment + " is not a Zotero.Item in Zotero.Commons.Bucket.getItems()"); - } - - // Add a relation linking the new attachment to the IA file - var uri = Zotero.URI.getItemURI(newAttachment); - Zotero.Relations.add(null, uri, self.relationPredicate, iaFileURI); - } - } - - process(zips); - }); - translate.translate(false, false); - }); - } - - process(zips); - }); - - // Browser offline - if (!req) { - this._itemsLoading = false; - } - - // List isn't yet available - return this._getCachedItems(); -} - - -Zotero.Commons.Bucket.prototype.refreshItems = function (callback) { - if (this._itemsLoading) { - Zotero.debug("Items already loading in Zotero.Commons.Bucket.refreshItems()", 2); - if (callback) { - callback() - } - return; - } - - Zotero.debug("Loading items for bucket '" + this.name + "'"); - this._itemsLoaded = false; - this.getItems(callback); -} - - -Zotero.Commons.Bucket.prototype.uploadItems = function (ids) { - var items = Zotero.Items.get(ids); - if (!items) { - Zotero.debug("No items to upload"); - return; - } - - var itemsToUpload = []; - itemLoop: - for (var i=0, len=items.length; i<len; i++) { - if (items[i].isRegularItem()) { - // Item must have a title - if (!items[i].getDisplayTitle()) { - continue; - } - - var attachmentIDs = items[i].getAttachments(); - if (!attachmentIDs) { - continue; - } - // Make sure there's at least one valid attachment - for each(var attachmentID in attachmentIDs) { - var attachment = Zotero.Items.get(attachmentID); - if (attachment && attachment.getFile()) { - itemsToUpload.push(items[i]); - continue itemLoop; - } - } - } - } - - var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] - .getService(Components.interfaces.nsIPromptService); - - var validItemsMessage = "Only titled items with bibliographic metadata and at least one attached file can be added to the Zotero Commons."; - - if (itemsToUpload.length == 0) { - Zotero.debug("No regular items to upload"); - ps.alert(null, "", validItemsMessage); - return; - } - - if (itemsToUpload.length != items.length) { - var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) - + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL); - var index = ps.confirmEx( - null, - "", - "Some of the dragged items will not be uploaded." - + "\n\n" - + validItemsMessage, - buttonFlags, - "Continue", - null, null, null, {} - ); - - // If user chooses 'Cancel', exit - if (index != 0) { - return; - } - } - - var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) - + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL); - var index = ps.confirmEx( - null, - "Zotero Commons Upload", - "By uploading items to Zotero Commons you agree to the terms of use at zotero.org and archive.org. " - + "Please make sure metadata for your items is set properly." - + "\n\n" - + "Note that there may be a delay while the Internet Archive processes " - + "your items before they appear in the Commons collection in Zotero." - + "\n\n" - + "Continue uploading items to Zotero Commons?", - buttonFlags, - "Upload", - null, null, null, {} - ); - - // If user chooses 'Cancel', exit - if (index != 0) { - return; - } - - var progressWin = new Zotero.ProgressWindow(); - var tmpDir = Zotero.getTempDirectory(); - var self = this; - - // Upload items one at a time, pulling items off a stack - var process = function (items) { - if (!items.length) { - Zotero.debug("Commons: No more items to upload"); - return; - } - - let item = items.shift(); - - // TODO: check relations table to see if this item already has a bucket - - // TODO: localize - progressWin.changeHeadline("Uploading Items to IA"); - progressWin.addLines([item.getDisplayTitle()], [item.getImageSrc()]); - progressWin.show(); - - self.uploadItem( - item, - function () { - Zotero.debug(items.length); - if (items.length) { - // Process next item - process(items); - } - else { - progressWin.startCloseTimer(5000); - } - } - ); - } - - process(itemsToUpload); -} - - -/** - * Export item and attachments to RDF and files and upload to IA - */ -Zotero.Commons.Bucket.prototype.uploadItem = function (item, callback) { - var key = item.key; - - var outputDir = Zotero.getTempDirectory(); - outputDir.append(key); - - var bucket = this; - - var translation = new Zotero.Translate("export"); - translation.setItems([item]); - translation.setTranslator(Zotero.Commons.RDF_TRANSLATOR.translatorID); - translation.setDisplayOptions(Zotero.Commons.RDF_TRANSLATOR.displayOptions); - translation.setHandler("done", function (translation, success) { - if (!success) { - alert("Commons: Translation failed for " + translation); - return; - } - - try { - // Rename RDF file - var rdfFile = outputDir.clone(); - rdfFile.append(key + ".rdf"); - rdfFile.moveTo(null, "zotero.rdf"); - - // Then create ZIP file from item - var zipFile = Zotero.getTempDirectory(); - var title = Zotero.File.getValidFileName(item.getDisplayTitle()); - zipFile.append(title + '-' + key + '.zip'); - - var zw = Components.classes["@mozilla.org/zipwriter;1"] - .createInstance(Components.interfaces.nsIZipWriter); - zw.open(zipFile, 0x04 | 0x08 | 0x20); // open rw, create, truncate - - Zotero.Commons.zipDirectory(outputDir, outputDir, zw); - - // Upload file after zipping - var observer = new Zotero.Commons.ZipWriterObserver(zw, function () { - bucket.putFile(zipFile, "application/zip", function (uri) { - // Link item to new bucket - var url1 = Zotero.URI.getItemURI(item); - var predicate = bucket.relationPredicate; - var url2 = bucket.getItemURI(item); - - // TEMP? - if (Zotero.Relations.getByURIs(url1, predicate, url2).length == 0) { - Zotero.Relations.add(null, url1, predicate, url2); - } - - if (callback) { - callback(); - } - }); - }); - zw.processQueue(observer, null); - } - catch (e) { - alert("Zotero Commons upload failed:\n\n" + e); - } - }); - translation.setLocation(outputDir); - translation.translate(); // synchronous -} - - -/** - * Delete selected items from IA - */ -Zotero.Commons.Bucket.prototype.deleteItems = function (ids) { - var ids = Zotero.flattenArguments(ids); - - // Get the ZIP filenames from the ids - var keysToDelete = []; - for each(var id in ids) { - var key = this._getIAKeyByItemID(id); - if (key) { - keysToDelete.push(key); - } - } - - if (!keysToDelete.length) { - Zotero.debug("No items to delete"); - return; - } - - var method = "DELETE"; - // Delete extracted files as well - var headers = { - "x-archive-cascade-delete":"1" - }; - - var resource = '/' + this.name; - var bucket = this; - - for each(let key in keysToDelete) { - let path = resource + '/' + key; - - Zotero.Commons.createAuthenticatedRequest( - method, path, headers, this.accessKey, this.secretKey, function (req) { - if (req.status == 204) { - Zotero.debug('---=---------'); - if (!bucket._items[key]) { - Zotero.debug('NO ITEM!'); - Zotero.debug(key); - Zotero.debug(bucket._items); - } - - - // Delete any relations linked to the IA item - var uri = bucket.getItemURI(bucket._items[key]); - var relations = Zotero.Relations.getByURIs( - null, bucket.relationPredicate, uri - ); - if (relations) { - Zotero.DB.beginTransaction(); - for each(var relation in relations) { - Zotero.Relations.erase(relation.id); - } - Zotero.DB.commitTransaction(); - } - - delete bucket._items[key]; - - Zotero.debug("Commons: " + path + " was deleted successfully."); - Zotero.Notifier.trigger('refresh', 'bucket', bucket.id); - } - else { - Zotero.debug(req.status); - Zotero.debug(req.responseText); - - if (req.status == 403) { - alert("Failed to delete " + path + " at IA: authentication failed."); - } - else if (req.status == 503) { - alert("Failed to delete " + path + " at IA: server unavailable."); - } - else { - alert("Failed to delete " + path + " at IA."); - Zotero.debug("Commons: delete failed with status code: " + req.status); - } - } - }); - } -} - - -// UNUSED -Zotero.Commons.Bucket.prototype.updateMetadata = function(action, item, callback) { - Zotero.debug("Updating bucket metadata"); - - var method = "PUT"; - - var headers = { - "x-archive-ignore-preexisting-bucket":"1", - "x-archive-meta01-collection":"zoterocommons", - "x-archive-meta02-collection":"scholarworkspaces", - "x-archive-meta-mediatype":"texts", - "x-archive-meta-sponsor":"Andrew W. Mellon Foundation" - }; - - var meta = null; - var resource = encodeURI('http://archive.org/download/' + this.name + '/' + this.name + '_meta.xml'); - - var self = this; - - // get previous metadata. multiple language support difficult via IA s3. - Zotero.HTTP.doGet(resource, function (xmlhttp) { - if (xmlhttp.status == 404 || (xmlhttp.status == 200 && !xmlhttp.responseXML)) { - Zotero.Commons.error("Error updating bucket metadata"); - return; - } - - if (itemTitle) { - headers["x-archive-meta-title"] = itemTitle; - } - - // recreate headers of languages already specified in metadata - var languages = xmlhttp.responseXML.getElementsByTagName("metadata")[0].getElementsByTagName("language"); - var itemLanguage = item.getField('language'); - - for (var i = 0, len = languages.length; i < len; i++) { - meta = "x-archive-meta0"+(i+1)+"-language"; - headers[meta] = languages[i].textContent; - } - - Zotero.debug(headers); - resource = "/" + this.name; - - var updateCallback = function (req) { - Zotero.debug('========'); - Zotero.debug("UPDATE"); - Zotero.debug(req.status); - if(req.status < 202) { - Zotero.debug("Commons: " + resource + " metadata updated successfully."); - - if (callback) { - callback(); - } - } - else { - Zotero.debug(req.status); - Zotero.debug(req.responseText); - - if (req.status == 403) { - alert("Failed to change " + key + " metadata: authentication failed."); - } - else if (req.status == 503) { - alert("Failed to change " + key + " metadata: server unavailable."); - } - else { - alert("Failed to change " + key + " metadata. Status code: " + req.status); - } - } - }; - - Zotero.Commons.createAuthenticatedRequest( - method, resource, headers, self.accessKey, self.secretKey, updateCallback - ); - }); -} - - -Zotero.Commons.Bucket.prototype.putFile = function (file, mimeType, callback) { - var fileName = file.leafName; - var fileNameHyphened = fileName.replace(/ /g,'-'); - var method = "PUT"; - var resource = this.apiPath + '/' + fileName; - var content = Zotero.File.getBinaryContents(file); - var headers = {}; - var self = this; - - var putCallback = function (req) { - Zotero.debug(req.responseText); - - // Success - if (req.status == 201) { - Zotero.debug("Commons: " + fileName + " was uploaded successfully."); - - if (callback) { - callback(req.channel.URI.spec); - } - return; - } - - // Error - Zotero.debug(req.status); - Zotero.debug(req.responseText); - - if (req.status == 404) { - alert("Failed to upload " + fileName + " to IA: bucket not found"); - } - else if (req.status == 403) { - alert("Failed to upload " + fileName + " to IA: authentication failed."); - } - else if (req.status == 503) { - alert("Failed to upload " + fileName + " to IA: server unavailable."); - } - else { - alert("Failed to upload " + fileName + " to IA. status is " + req.status); - } - }; - - Zotero.Commons.createAuthenticatedRequest( - method, resource, headers, this.accessKey, this.secretKey, putCallback, content, true - ); -} - - -Zotero.Commons.Bucket.prototype.getItemURI = function (item) { - // TODO: this won't work for non-English systems - return this.uri + '#' + encodeURIComponent(item.getDisplayTitle()); -} - - -Zotero.Commons.Bucket.prototype.getLocalItem = function (item) { - var uri = this.getItemURI(item); - var rels = Zotero.Relations.getByURIs(null, this.relationPredicate, uri); - - if (!rels.length) { - Zotero.debug("No local item linked to remote URI " + uri, 2); - return false; - } - - if (rels.length > 1) { - Zotero.debug("More than one local item linked to remote item " + uri, 2); - return false; - } - - var item = Zotero.URI.getURIItem(rels[0].subject); - if (!item) { - Zotero.debug("Linked local item not found for remote URI " + uri, 2); - return false; - } - - return item; -} - - -Zotero.Commons.Bucket.prototype._getCachedItems = function () { - var items = []; - for each(var item in this._items) { - items.push(item); - } - return items; -} - - -Zotero.Commons.Bucket.prototype._getIAKeyByItemID = function (id) { - for (var key in this._items) { - if (this._items[key].id == id) { - return key; - } - } - return false; -} - - - -// Implements nsIRequestObserver -Zotero.Commons.ZipWriterObserver = function (zipWriter, callback) { - this._zipWriter = zipWriter; - this._callback = callback; -} - -Zotero.Commons.ZipWriterObserver.prototype = { - onStartRequest: function () {}, - - onStopRequest: function(req, context, status) { - this._zipWriter.close(); - this._callback(); - } -} - - - -/* - * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined - * in FIPS PUB 180-1 - * Version 2.1a Copyright Paul Johnston 2000 - 2002. - * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet - * Distributed under the BSD License - * See http://pajhome.org.uk/crypt/md5 for details. - */ -Zotero.Commons.SHA1 = new function() { - - // added by Ben Parr to expose function for Zotero - this.hex_sha1 = hex_sha1; - this.b64_sha1 = b64_sha1; - this.str_sha1 = str_sha1; - this.hex_hmac_sha1 = hex_hmac_sha1; - this.b64_hmac_sha1 = b64_hmac_sha1; - this.str_hmac_sha1 = str_hmac_sha1; - - - /* - * Configurable variables. You may need to tweak these to be compatible with - * the server-side, but the defaults work in most cases. - */ - var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ - var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ - var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ - - /* - * These are the functions you'll usually want to call - * They take string arguments and return either hex or base-64 encoded strings - */ - function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));} - function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));} - function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));} - function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));} - function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));} - function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));} - - /* - * Perform a simple self-test to see if the VM is working - */ - function sha1_vm_test() - { - return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d"; - } - - /* - * Calculate the SHA-1 of an array of big-endian words, and a bit length - */ - function core_sha1(x, len) - { - /* append padding */ - x[len >> 5] |= 0x80 << (24 - len % 32); - x[((len + 64 >> 9) << 4) + 15] = len; - - var w = Array(80); - var a = 1732584193; - var b = -271733879; - var c = -1732584194; - var d = 271733878; - var e = -1009589776; - - for(var i = 0; i < x.length; i += 16) - { - var olda = a; - var oldb = b; - var oldc = c; - var oldd = d; - var olde = e; - - for(var j = 0; j < 80; j++) - { - if(j < 16) w[j] = x[i + j]; - else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); - var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), - safe_add(safe_add(e, w[j]), sha1_kt(j))); - e = d; - d = c; - c = rol(b, 30); - b = a; - a = t; - } - - a = safe_add(a, olda); - b = safe_add(b, oldb); - c = safe_add(c, oldc); - d = safe_add(d, oldd); - e = safe_add(e, olde); - } - return Array(a, b, c, d, e); - - } - - /* - * Perform the appropriate triplet combination function for the current - * iteration - */ - function sha1_ft(t, b, c, d) - { - if(t < 20) return (b & c) | ((~b) & d); - if(t < 40) return b ^ c ^ d; - if(t < 60) return (b & c) | (b & d) | (c & d); - return b ^ c ^ d; - } - - /* - * Determine the appropriate additive constant for the current iteration - */ - function sha1_kt(t) - { - return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : - (t < 60) ? -1894007588 : -899497514; - } - - /* - * Calculate the HMAC-SHA1 of a key and some data - */ - function core_hmac_sha1(key, data) - { - var bkey = str2binb(key); - if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz); - - var ipad = Array(16), opad = Array(16); - for(var i = 0; i < 16; i++) - { - ipad[i] = bkey[i] ^ 0x36363636; - opad[i] = bkey[i] ^ 0x5C5C5C5C; - } - - var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); - return core_sha1(opad.concat(hash), 512 + 160); - } - - /* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ - function safe_add(x, y) - { - var lsw = (x & 0xFFFF) + (y & 0xFFFF); - var msw = (x >> 16) + (y >> 16) + (lsw >> 16); - return (msw << 16) | (lsw & 0xFFFF); - } - - /* - * Bitwise rotate a 32-bit number to the left. - */ - function rol(num, cnt) - { - return (num << cnt) | (num >>> (32 - cnt)); - } - - /* - * Convert an 8-bit or 16-bit string to an array of big-endian words - * In 8-bit function, characters >255 have their hi-byte silently ignored. - */ - function str2binb(str) - { - var bin = Array(); - var mask = (1 << chrsz) - 1; - for(var i = 0; i < str.length * chrsz; i += chrsz) - bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32); - return bin; - } - - /* - * Convert an array of big-endian words to a string - */ - function binb2str(bin) - { - var str = ""; - var mask = (1 << chrsz) - 1; - for(var i = 0; i < bin.length * 32; i += chrsz) - str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask); - return str; - } - - /* - * Convert an array of big-endian words to a hex string. - */ - function binb2hex(binarray) - { - var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; - var str = ""; - for(var i = 0; i < binarray.length * 4; i++) - { - str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + - hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8)) & 0xF); - } - return str; - } - - /* - * Convert an array of big-endian words to a base-64 string - */ - function binb2b64(binarray) - { - var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - var str = ""; - for(var i = 0; i < binarray.length * 4; i += 3) - { - var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16) - | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) - | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF); - for(var j = 0; j < 4; j++) - { - if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; - else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); - } - } - return str; - } -} - diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js @@ -2069,21 +2069,7 @@ Zotero.Prefs = new function(){ return; } - var xml = new XML(str); - - var commonsEnable = xml.setting.(@id == 'commons-enable'); - if (commonsEnable == 'true') { - Zotero.Commons.enabled = true; - Zotero.Commons.accessKey = xml.setting.(@id == 'commons-accessKey').toString(); - Zotero.Commons.secretKey = xml.setting.(@id == 'commons-secretKey').toString(); - } - else if (commonsEnable == 'false') { - Zotero.Commons.enabled = false; - Zotero.Commons.accessKey = ''; - Zotero.Commons.secretKey = ''; - } - // This is kind of a hack - Zotero.Notifier.trigger('refresh', 'collection', []); + // TODO: parse settings XML } diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js @@ -1685,137 +1685,6 @@ var ZoteroPane = new function() } } - this.createCommonsBucket = function () { - var self = this; - - Zotero.Commons.getBuckets(function () { - var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] - .getService(Components.interfaces.nsIPromptService); - - var invalid = false; - - while (true) { - if (invalid) { - // TODO: localize - ps.alert(null, "", "Invalid title. Please try again."); - invalid = false; - } - - var newTitle = {}; - var result = ps.prompt( - null, - "", - // TODO: localize - "Enter a title for this Zotero Commons collection:", - newTitle, - "", {} - ); - - if (!result) { - return; - } - - var title = Zotero.Utilities.trim(newTitle.value); - - if (!title) { - return; - } - - if (!Zotero.Commons.isValidBucketTitle(title)) { - invalid = true; - continue; - } - - break; - } - - invalid = false; - - var origName = title.toLowerCase(); - origName = origName.replace(/[^a-z0-9 ._-]/g, ''); - origName = origName.replace(/ /g, '-'); - origName = origName.substr(0, 32); - - while (true) { - if (invalid) { - // TODO: localize - var msg = "'" + testName + "' is not a valid Zotero Commons collection identifier.\n\n" - + "Collection identifiers can contain basic Latin letters, numbers, " - + "hyphens, and underscores and must be no longer than 32 characters. " - + "Spaces and other characters are not allowed."; - ps.alert(null, "", msg); - invalid = false; - } - - var newName = { value: origName }; - var result = ps.prompt( - null, - "", - // TODO: localize - "Enter an identifier for the collection '" + title + "'.\n\n" - + "The identifier will form the collection's URL on archive.org. " - + "Identifiers can contain basic Latin letters, numbers, hyphens, and underscores " - + "and must be no longer than 32 characters. " - + "Spaces and other characters are not allowed.\n\n" - + '"' + Zotero.Commons.userNameSlug + '-" ' - + "will be automatically prepended to your entry.", - newName, - "", {} - ); - - if (!result) { - return; - } - - var name = Zotero.Utilities.trim(newName.value); - - if (!name) { - return; - } - - var testName = Zotero.Commons.userNameSlug + '-' + name; - if (!Zotero.Commons.isValidBucketName(testName)) { - invalid = true; - continue; - } - - break; - } - - // TODO: localize - var progressWin = new Zotero.ProgressWindow(); - progressWin.changeHeadline("Creating Zotero Commons Collection"); - var icon = self.collectionsView.getImageSrc(self.collectionsView.selection.currentIndex); - progressWin.addLines(title, icon) - progressWin.show(); - - Zotero.Commons.createBucket(name, title, function () { - progressWin.startCloseTimer(); - }); - }); - } - - - this.refreshCommonsBucket = function() { - if (!this.collectionsView - || !this.collectionsView.selection - || this.collectionsView.selection.count != 1 - || this.collectionsView.selection.currentIndex == -1) { - return false; - } - - var itemGroup = this.collectionsView._getItemAtRow(this.collectionsView.selection.currentIndex); - if (itemGroup && itemGroup.isBucket()) { - var self = this; - itemGroup.ref.refreshItems(function () { - self.itemsView.refresh(); - self.itemsView.sort(); - - // On a manual refresh, also check for new OCRed files - //Zotero.Commons.syncFiles(); - }); - } - } function editSelectedCollection() { diff --git a/components/zotero-service.js b/components/zotero-service.js @@ -56,7 +56,6 @@ const xpcomFilesLocal = [ 'annotate', 'attachments', 'cite', - 'commons', 'cookieSandbox', 'data_access', 'data/dataObjects', diff --git a/defaults/preferences/zotero.js b/defaults/preferences/zotero.js @@ -119,11 +119,6 @@ pref("extensions.zotero.httpServer.port", 23119); // ascii "ZO" // Zeroconf pref("extensions.zotero.zeroconf.server.enabled", false); -// Zotero Commons -pref("extensions.zotero.commons.enabled", false); -pref("extensions.zotero.commons.accessKey", ''); -pref("extensions.zotero.commons.secretKey", ''); - // Annotation settings pref("extensions.zotero.annotations.warnOnClose", true);