closes #505, Bibliography alpha sorting by case

closes #376, Bibliography export order jumbled
closes #482, Tag selector does not refresh on import/delete
closes #499, zotero RDF import of attachments has a flaw
closes #500, Improve COinS handling of other item types

- fixes an issue with importing directory hierarchy
- fixes an issue where the SpringerLink translator could fail to recognize a scrapable resource
- fixes an issue where the Nature translator could fail to retrieve an associated PDF

feel free to push the updates to the SpringerLink and Nature translators to the repository; theoretically, the RDF translator should be backwards-compatible too, but I'd like to test it with b3 before potentially breaking functionality.
This commit is contained in:
Simon Kornblith 2007-01-27 05:00:13 +00:00
parent 7f0c9844ea
commit 7a4b87257c
6 changed files with 445 additions and 410 deletions

View File

@ -20,8 +20,92 @@
***** END LICENSE BLOCK *****
*/
/****Zotero_File_Exporter****
**
* A class to handle exporting of items, collections, or the entire library
**/
/**
* Constructs a new Zotero_File_Exporter with defaults
**/
var Zotero_File_Exporter = function() {
this.name = Zotero.getString("fileInterface.exportedItems");
this.collection = false;
this.items = false;
}
/**
* Performs the actual export operation
**/
Zotero_File_Exporter.prototype.save = function() {
var translation = new Zotero.Translate("export");
var translators = translation.getTranslators();
// present options dialog
var io = {translators:translators}
window.openDialog("chrome://zotero/content/exportOptions.xul",
"_blank", "chrome,modal,centerscreen", io);
if(!io.selectedTranslator) {
return false;
}
const nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(window, Zotero.getString("fileInterface.export"), nsIFilePicker.modeSave);
// set file name and extension
if(io.selectedTranslator.displayOptions.exportFileData) {
// if the result will be a folder, don't append any extension or use
// filters
fp.defaultString = this.name;
} else {
// if the result will be a file, append an extension and use filters
fp.defaultString = this.name+"."+io.selectedTranslator.target;
fp.appendFilter(io.selectedTranslator.label, "*."+io.selectedTranslator.target);
}
var rv = fp.show();
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
if(this.collection) {
translation.setCollection(this.collection);
} else if(this.items) {
translation.setItems(this.items);
}
translation.setLocation(fp.file);
translation.setTranslator(io.selectedTranslator);
translation.setHandler("done", this._exportDone);
Zotero.UnresponsiveScriptIndicator.disable();
Zotero_File_Interface.Progress.show(
Zotero.getString("fileInterface.itemsExported"),
function() {
translation.translate();
});
}
return false;
}
/*
* Closes the items exported indicator
*/
Zotero_File_Exporter.prototype._exportDone = function(obj, worked) {
Zotero_File_Interface.Progress.close();
Zotero.UnresponsiveScriptIndicator.enable();
if(!worked) {
window.alert(Zotero.getString("fileInterface.exportError"));
}
}
/****Zotero_File_Interface****
**
* A singleton to interface with ZoteroPane to provide export/bibliography
* capabilities
**/
var Zotero_File_Interface = new function() {
var _unresponsiveScriptPreference, _importCollection, _notifyItem, _notifyCollection;
var _importCollection, _unlock;
this.exportFile = exportFile;
this.exportCollection = exportCollection;
@ -33,65 +117,36 @@ var Zotero_File_Interface = new function() {
/*
* Creates Zotero.Translate instance and shows file picker for file export
*/
function exportFile(name, items) {
var translation = new Zotero.Translate("export");
var translators = translation.getTranslators();
// present options dialog
var io = {translators:translators}
window.openDialog("chrome://zotero/content/exportOptions.xul",
"_blank", "chrome,modal,centerscreen", io);
if(!io.selectedTranslator) {
return false;
}
const nsIFilePicker = Components.interfaces.nsIFilePicker;
var fp = Components.classes["@mozilla.org/filepicker;1"]
.createInstance(nsIFilePicker);
fp.init(window, Zotero.getString("fileInterface.export"), nsIFilePicker.modeSave);
// set file name and extension
name = (name ? name : Zotero.getString("pane.collections.library"));
if(io.selectedTranslator.displayOptions.exportFileData) {
// if the result will be a folder, don't append any extension or use
// filters
fp.defaultString = name;
} else {
// if the result will be a file, append an extension and use filters
fp.defaultString = name+"."+io.selectedTranslator.target;
fp.appendFilter(io.selectedTranslator.label, "*."+io.selectedTranslator.target);
}
var rv = fp.show();
if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
if(items) {
translation.setItems(items);
}
translation.setLocation(fp.file);
translation.setTranslator(io.selectedTranslator);
translation.setHandler("done", _exportDone);
_disableUnresponsive();
Zotero_File_Interface.Progress.show(
Zotero.getString("fileInterface.itemsExported"),
function() {
translation.translate();
});
}
return false;
function exportFile() {
var exporter = new Zotero_File_Exporter();
exporter.name = Zotero.getString("pane.collections.library");
exporter.save();
}
/*
* exports a collection or saved search
*/
function exportCollection() {
var nameAndItems = _getSortedSelectedCollection();
if(nameAndItems) {
exportFile(nameAndItems[0], nameAndItems[1]);
return;
var exporter = new Zotero_File_Exporter();
var collection = ZoteroPane.getSelectedCollection();
if(collection) {
exporter.name = collection.getName();
exporter.collection = collection;
} else {
// find sorted items
exporter.items = ZoteroPane.getSortedItems();
if(!exporter.items) throw ("No items to save");
// find name
var searchRef = ZoteroPane.getSelectedSavedSearch();
if(searchRef) {
var search = new Zotero.Search();
search.load(searchRef['id']);
exporter.name = search.getName();
}
}
throw ("No collection or saved search currently selected");
exporter.save();
}
@ -99,49 +154,12 @@ var Zotero_File_Interface = new function() {
* exports items
*/
function exportItems() {
var items = ZoteroPane.getSelectedItems();
if(!items || !items.length) throw("no items currently selected");
var exporter = new Zotero_File_Exporter();
exportFile(Zotero.getString("fileInterface.exportedItems"), items);
}
/*
* gets selected collection or saved search sorted
*/
function _getSortedSelectedCollection() {
var name = false;
var items = false;
exporter.items = ZoteroPane.getSelectedItems();
if(!exporter.items || !exporter.items.length) throw("no items currently selected");
var collection = ZoteroPane.getSelectedCollection();
if (collection) {
name = collection.getName();
items = Zotero.getItems(collection.getID());
} else {
var searchRef = ZoteroPane.getSelectedSavedSearch();
if (searchRef) {
var search = new Zotero.Search();
search.load(searchRef['id']);
name = search.getName();
items = Zotero.Items.get(search.search());
}
}
if(items) {
return [name, items];
}
return false;
}
/*
* closes items exported indicator
*/
function _exportDone(obj, worked) {
Zotero_File_Interface.Progress.close();
_restoreUnresponsive();
if(!worked) {
window.alert(Zotero.getString("fileInterface.exportError"));
}
exporter.save();
}
/*
@ -175,15 +193,15 @@ var Zotero_File_Interface = new function() {
translation.setTranslator(translators[0]);
translation.setHandler("collectionDone", _importCollectionDone);
translation.setHandler("done", _importDone);
_disableUnresponsive();
// disable notifier
Zotero.Notifier.disable();
Zotero.UnresponsiveScriptIndicator.disable();
// show progress indicator
Zotero_File_Interface.Progress.show(
Zotero.getString("fileInterface.itemsImported"),
function() {
// disable notifier
_unlock = Zotero.Notifier.begin(true);
// translate
translation.translate();
});
} else {
@ -198,10 +216,7 @@ var Zotero_File_Interface = new function() {
* collections
*/
function _importCollectionDone(obj, collection) {
Zotero.Notifier.enable();
Zotero.Notifier.trigger("add", "collection", collection.getID());
collection.changeParent(_importCollection.getID());
Zotero.Notifier.disable();
}
/*
@ -213,51 +228,43 @@ var Zotero_File_Interface = new function() {
_importCollection.addItem(itemID);
}
// run notify
Zotero.Notifier.enable();
if(obj.newItems.length) {
Zotero.Notifier.trigger("add", "item", obj.newItems);
Zotero.Notifier.trigger("modify", "collection", _importCollection.getID());
}
// notify
Zotero.Notifier.commit(_unlock);
Zotero_File_Interface.Progress.close();
_restoreUnresponsive();
Zotero.UnresponsiveScriptIndicator.enable();
if(!worked) {
window.alert(Zotero.getString("fileInterface.importError"));
}
}
/*
* disables the "unresponsive script" warning; necessary for import and
* export, which can take quite a while to execute
*/
function _disableUnresponsive() {
var prefService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
_unresponsiveScriptPreference = prefService.getIntPref("dom.max_chrome_script_run_time");
prefService.setIntPref("dom.max_chrome_script_run_time", 0);
}
/*
* restores the "unresponsive script" warning
*/
function _restoreUnresponsive() {
var prefService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
prefService.setIntPref("dom.max_chrome_script_run_time", _unresponsiveScriptPreference);
}
/*
* Creates a bibliography from a collection or saved search
*/
function bibliographyFromCollection() {
var nameAndItems = _getSortedSelectedCollection();
if(nameAndItems) {
_doBibliographyOptions(nameAndItems[0], nameAndItems[1]);
return;
// find sorted items
var items = Zotero.Items.get(ZoteroPane.getSortedItems());
if(!items) return;
// find name
var name = false;
var collection = ZoteroPane.getSelectedCollection();
if(collection) {
name = collection.getName();
} else {
var searchRef = ZoteroPane.getSelectedSavedSearch();
if(searchRef) {
var search = new Zotero.Search();
search.load(searchRef['id']);
name = search.getName();
}
}
_doBibliographyOptions(name, items);
return;
throw ("No collection or saved search currently selected");
}

View File

@ -949,8 +949,8 @@ Zotero.CSL.prototype._compareItem = function(a, b, opt) {
this._getFieldValue(sortElement.name, sortElement, b,
formattedStringB, this._bib);
var aValue = formattedStringA.get();
var bValue = formattedStringB.get();
var aValue = formattedStringA.get().toLowerCase();
var bValue = formattedStringB.get().toLowerCase();
if(bValue > aValue) {
return -1;

View File

@ -567,6 +567,8 @@ Zotero.OpenURL = new function() {
item.tags.push(value);
} else if(key == "rft.type") {
if(Zotero.ItemTypes.getID(value)) item.itemType = value;
} else if(key == "rft.source") {
item.publicationTitle = value;
}
}
}

View File

@ -233,12 +233,19 @@ Zotero.Translate.prototype.setSearch = function(search) {
}
/*
* sets the item to be used for export
* sets the items to be used for export
*/
Zotero.Translate.prototype.setItems = function(items) {
this.items = items;
}
/*
* sets the collection to be used for export (overrides setItems)
*/
Zotero.Translate.prototype.setCollection = function(collection) {
this.collection = collection;
}
/*
* sets the location to operate upon (file should be an nsILocalFile object or
* web address)
@ -357,12 +364,6 @@ Zotero.Translate.prototype.setTranslator = function(translator) {
* returns: a numerically indexed array of ids, as extracted from the passed
* string
*
* itemCount
* valid: export
* called: when the export
* passed: the number of items to be processed
* returns: N/A
*
* itemDone
* valid: import, web, search
* called: when an item has been processed; may be called asynchronously
@ -932,17 +933,6 @@ Zotero.Translate.prototype._translationComplete = function(returnValue, error) {
// close open streams
this._closeStreams();
if(Zotero.Notifier.isEnabled()) {
// notify itemTreeView about updates
if(this.newItems.length) {
Zotero.Notifier.trigger("add", "item", this.newItems);
}
// notify collectionTreeView about updates
if(this.newCollections && this.newCollections.length) {
Zotero.Notifier.trigger("add", "collection", this.newCollections);
}
}
if(!returnValue) {
var errorString = this._generateErrorString(error);
this._debug("Translation using "+this.translator[0].label+" failed: \n"+errorString);
@ -1012,9 +1002,11 @@ Zotero.Translate.prototype._closeStreams = function() {
}
try {
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
getService(Components.interfaces.nsIRDFService);
rdfService.UnregisterDataSource(this._rdf.dataSource);
if(this._rdf.dataSource) {
var rdfService = Components.classes["@mozilla.org/rdf/rdf-service;1"].
getService(Components.interfaces.nsIRDFService);
rdfService.UnregisterDataSource(this._rdf.dataSource);
}
} catch(e) {}
delete this._rdf.dataSource;
@ -1094,265 +1086,243 @@ Zotero.Translate.prototype._itemDone = function(item, attachedTo) {
return;
}
if(!attachedTo) {
var notifierStatus = Zotero.Notifier.isEnabled();
if(notifierStatus) {
Zotero.Notifier.disable();
}
}
// Get typeID, defaulting to "webpage"
var type = (item.itemType ? item.itemType : "webpage");
try { // make sure notifier gets turned back on when done
// Get typeID, defaulting to "webpage"
var type = (item.itemType ? item.itemType : "webpage");
if(type == "note") { // handle notes differently
var myID = Zotero.Notes.add(item.note);
// re-retrieve the item
var newItem = Zotero.Items.get(myID);
} else {
if(!item.title && this.type == "web") {
throw("item has no title");
}
if(type == "note") { // handle notes differently
var myID = Zotero.Notes.add(item.note);
// re-retrieve the item
var newItem = Zotero.Items.get(myID);
} else {
if(!item.title && this.type == "web") {
throw("item has no title");
// if item was accessed through a proxy, ensure that the proxy
// address remains in the accessed version
if(this.locationIsProxied && item.url) {
item.url = Zotero.Ingester.ProxyMonitor.properToProxy(item.url);
}
// create new item
if(type == "attachment") {
if(this.type != "import") {
Zotero.debug("discarding standalone attachment");
return;
}
// if item was accessed through a proxy, ensure that the proxy
// address remains in the accessed version
if(this.locationIsProxied && item.url) {
item.url = Zotero.Ingester.ProxyMonitor.properToProxy(item.url);
}
Zotero.debug("adding attachment");
// create new item
if(type == "attachment") {
if(this.type != "import") {
Zotero.debug("discarding standalone attachment");
return;
}
Zotero.debug("adding attachment");
if(!item.path) {
// create from URL
if(item.url) {
var myID = Zotero.Attachments.linkFromURL(item.url, attachedTo,
(item.mimeType ? item.mimeType : undefined),
(item.title ? item.title : undefined));
Zotero.debug("created attachment; id is "+myID);
if(!myID) {
// if we didn't get an ID, don't continue adding
// notes, because we can't without knowing the ID
return;
}
var newItem = Zotero.Items.get(myID);
} else {
Zotero.debug("not adding attachment: no path or url specified");
if(!item.path) {
// create from URL
if(item.url) {
var myID = Zotero.Attachments.linkFromURL(item.url, attachedTo,
(item.mimeType ? item.mimeType : undefined),
(item.title ? item.title : undefined));
Zotero.debug("created attachment; id is "+myID);
if(!myID) {
// if we didn't get an ID, don't continue adding
// notes, because we can't without knowing the ID
return;
}
var newItem = Zotero.Items.get(myID);
} else {
// generate nsIFile
var IOService = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
var uri = IOService.newURI(item.path, "", null);
var file = uri.QueryInterface(Components.interfaces.nsIFileURL).file;
if(item.url) {
// import from nsIFile
var myID = Zotero.Attachments.importSnapshotFromFile(file,
item.url, item.title, item.mimeType,
(item.charset ? item.charset : null), attachedTo);
var newItem = Zotero.Items.get(myID);
Zotero.debug("not adding attachment: no path or url specified");
return;
}
} else {
// generate nsIFile
var IOService = Components.classes["@mozilla.org/network/io-service;1"].
getService(Components.interfaces.nsIIOService);
var uri = IOService.newURI(item.path, "", null);
var file = uri.QueryInterface(Components.interfaces.nsIFileURL).file;
if(item.url) {
// import from nsIFile
var myID = Zotero.Attachments.importSnapshotFromFile(file,
item.url, item.title, item.mimeType,
(item.charset ? item.charset : null), attachedTo);
var newItem = Zotero.Items.get(myID);
} else {
// import from nsIFile
var myID = Zotero.Attachments.importFromFile(file, attachedTo);
// get attachment item
var newItem = Zotero.Items.get(myID);
}
}
var typeID = Zotero.ItemTypes.getID("attachment");
// add note if necessary
if(item.note) {
newItem.updateNote(item.note);
}
} else {
var typeID = Zotero.ItemTypes.getID(type);
var newItem = Zotero.Items.getNewItemByType(typeID);
}
// makes looping through easier
item.itemType = item.complete = undefined;
// automatically set access date if URL is set
if(item.url && !item.accessDate && this.type == "web") {
item.accessDate = "CURRENT_TIMESTAMP";
}
var fieldID, data;
for(var field in item) {
// loop through item fields
data = item[field];
if(data) { // if field has content
if(field == "creators") { // creators are a special case
for(var j in data) {
var creatorType = 1;
// try to assign correct creator type
if(data[j].creatorType) {
try {
var creatorType = Zotero.CreatorTypes.getID(data[j].creatorType);
} catch(e) {
Zotero.debug("invalid creator type "+data[j].creatorType+" for creator index "+j);
}
}
newItem.setCreator(j, data[j].firstName, data[j].lastName, creatorType);
}
} else if(field == "title") { // skip checks for title
newItem.setField(field, data);
} else if(field == "seeAlso") {
newItem.translateSeeAlso = data;
} else if(field != "note" && field != "notes" && field != "itemID" &&
field != "attachments" && field != "tags" &&
(fieldID = Zotero.ItemFields.getID(field))) {
// if field is in db
if(Zotero.ItemFields.isValidForType(fieldID, typeID)) {
// if field is valid for this type
// add field
newItem.setField(field, data);
} else {
// import from nsIFile
var myID = Zotero.Attachments.importFromFile(file, attachedTo);
// get attachment item
var newItem = Zotero.Items.get(myID);
}
}
var typeID = Zotero.ItemTypes.getID("attachment");
// add note if necessary
if(item.note) {
newItem.updateNote(item.note);
}
} else {
var typeID = Zotero.ItemTypes.getID(type);
var newItem = Zotero.Items.getNewItemByType(typeID);
}
// makes looping through easier
item.itemType = item.complete = undefined;
// automatically set access date if URL is set
if(item.url && !item.accessDate && this.type == "web") {
item.accessDate = "CURRENT_TIMESTAMP";
}
var fieldID, field;
for(var i in item) {
// loop through item fields
data = item[i];
if(data) { // if field has content
if(i == "creators") { // creators are a special case
for(var j in data) {
var creatorType = 1;
// try to assign correct creator type
if(data[j].creatorType) {
try {
var creatorType = Zotero.CreatorTypes.getID(data[j].creatorType);
} catch(e) {
Zotero.debug("invalid creator type "+data[j].creatorType+" for creator index "+j);
}
}
newItem.setCreator(j, data[j].firstName, data[j].lastName, creatorType);
}
} else if(i == "title") { // skip checks for title
newItem.setField(i, data);
} else if(i == "seeAlso") {
newItem.translateSeeAlso = data;
} else if(i != "note" && i != "notes" && i != "itemID" &&
i != "attachments" && i != "tags" &&
(fieldID = Zotero.ItemFields.getID(i))) {
// if field is in db
if(Zotero.ItemFields.isValidForType(fieldID, typeID)) {
// if field is valid for this type
// add field
newItem.setField(i, data);
} else {
Zotero.debug("discarded field "+i+" for item: field not valid for type "+type);
}
Zotero.debug("discarded field "+field+" for item: field not valid for type "+type);
}
}
}
// save item
if(myID) {
newItem.save();
} else {
var myID = newItem.save();
if(myID == true || !myID) {
myID = newItem.getID();
}
}
// save item
if(myID) {
newItem.save();
} else {
var myID = newItem.save();
if(myID == true || !myID) {
myID = newItem.getID();
}
// handle notes
if(item.notes) {
for each(var note in item.notes) {
var noteID = Zotero.Notes.add(note.note, myID);
// handle see also
var myNote = Zotero.Items.get(noteID);
this._itemTagsAndSeeAlso(note, myNote);
}
}
// handle notes
if(item.notes) {
for each(var note in item.notes) {
var noteID = Zotero.Notes.add(note.note, myID);
// handle see also
var myNote = Zotero.Items.get(noteID);
this._itemTagsAndSeeAlso(note, myNote);
}
// handle abstract
if(item.abstractNote) {
Zotero.Notes.add(item.abstractNote, myID, true);
}
// handle attachments
if(item.attachments && Zotero.Prefs.get("automaticSnapshots")) {
Zotero.debug("HANDLING ATTACHMENTS");
for each(var attachment in item.attachments) {
if(this.type == "web") {
if(!attachment.url && !attachment.document) {
Zotero.debug("not adding attachment: no URL specified");
} else {
if(attachment.document
|| (attachment.mimeType && attachment.mimeType == "text/html")
|| Zotero.Prefs.get("downloadAssociatedFiles")) {
if(attachment.document) {
Zotero.Attachments.importFromDocument(attachment.document, myID, attachment.title);
} else {
Zotero.debug("GOT ATTACHMENT");
Zotero.debug(attachment);
var mimeType = null;
var title = null;
if(attachment.mimeType) {
// first, try to extract mime type from mimeType attribute
mimeType = attachment.mimeType;
} else if(attachment.document && attachment.document.contentType) {
// if that fails, use document if possible
mimeType = attachment.document.contentType
}
// same procedure for title as mime type
if(attachment.title) {
title = attachment.title;
} else if(attachment.document && attachment.document.title) {
title = attachment.document.title;
}
if(this.locationIsProxied) {
attachment.url = Zotero.Ingester.ProxyMonitor.properToProxy(attachment.url);
}
Zotero.Attachments.importFromURL(attachment.url, myID, title);
}
}
// links no longer exist, so just don't save them
/*if(attachment.document) {
attachmentID = Zotero.Attachments.linkFromURL(attachment.document.location.href, myID,
(attachment.mimeType ? attachment.mimeType : attachment.document.contentType),
(attachment.title ? attachment.title : attachment.document.title));
}
// handle abstract
if(item.abstractNote) {
Zotero.Notes.add(item.abstractNote, myID, true);
}
// handle attachments
if(item.attachments && Zotero.Prefs.get("automaticSnapshots")) {
Zotero.debug("HANDLING ATTACHMENTS");
for each(var attachment in item.attachments) {
if(this.type == "web") {
if(!attachment.url && !attachment.document) {
Zotero.debug("not adding attachment: no URL specified");
} else {
if(attachment.document
|| (attachment.mimeType && attachment.mimeType == "text/html")
|| Zotero.Prefs.get("downloadAssociatedFiles")) {
if(attachment.document) {
Zotero.Attachments.importFromDocument(attachment.document, myID, attachment.title);
} else {
if(!attachment.mimeType || attachment.title) {
Zotero.debug("notice: either mimeType or title is missing; attaching file will be slower");
Zotero.debug("GOT ATTACHMENT");
Zotero.debug(attachment);
var mimeType = null;
var title = null;
if(attachment.mimeType) {
// first, try to extract mime type from mimeType attribute
mimeType = attachment.mimeType;
} else if(attachment.document && attachment.document.contentType) {
// if that fails, use document if possible
mimeType = attachment.document.contentType
}
attachmentID = Zotero.Attachments.linkFromURL(attachment.url, myID,
(attachment.mimeType ? attachment.mimeType : undefined),
(attachment.title ? attachment.title : undefined));
}*/
// same procedure for title as mime type
if(attachment.title) {
title = attachment.title;
} else if(attachment.document && attachment.document.title) {
title = attachment.document.title;
}
if(this.locationIsProxied) {
attachment.url = Zotero.Ingester.ProxyMonitor.properToProxy(attachment.url);
}
Zotero.Attachments.importFromURL(attachment.url, myID, title);
}
}
} else if(this.type == "import") {
// create new attachments attached here
this._itemDone(attachment, myID);
// links no longer exist, so just don't save them
/*if(attachment.document) {
attachmentID = Zotero.Attachments.linkFromURL(attachment.document.location.href, myID,
(attachment.mimeType ? attachment.mimeType : attachment.document.contentType),
(attachment.title ? attachment.title : attachment.document.title));
} else {
if(!attachment.mimeType || attachment.title) {
Zotero.debug("notice: either mimeType or title is missing; attaching file will be slower");
}
attachmentID = Zotero.Attachments.linkFromURL(attachment.url, myID,
(attachment.mimeType ? attachment.mimeType : undefined),
(attachment.title ? attachment.title : undefined));
}*/
}
} else if(this.type == "import") {
// create new attachments attached here
this._itemDone(attachment, myID);
}
}
}
if(item.itemID) {
this._IDMap[item.itemID] = myID;
}
if(!attachedTo) {
this.newItems.push(myID);
}
// handle see also
if(item.seeAlso) {
for each(var seeAlso in item.seeAlso) {
if(this._IDMap[seeAlso]) {
newItem.addSeeAlso(this._IDMap[seeAlso]);
}
}
}
if(item.tags) {
for each(var tag in item.tags) {
newItem.addTag(tag);
}
}
delete item;
} catch(e) {
if(notifierStatus) {
Zotero.Notifier.enable();
}
throw(e);
}
// only re-enable if notifier was enabled at the beginning of scraping
if(!attachedTo) {
if(notifierStatus) {
Zotero.Notifier.enable();
}
this._runHandler("itemDone", newItem);
if(item.itemID) {
this._IDMap[item.itemID] = myID;
}
if(!attachedTo) {
this.newItems.push(myID);
}
// handle see also
if(item.seeAlso) {
for each(var seeAlso in item.seeAlso) {
if(this._IDMap[seeAlso]) {
newItem.addSeeAlso(this._IDMap[seeAlso]);
}
}
}
if(item.tags) {
for each(var tag in item.tags) {
newItem.addTag(tag);
}
}
delete item;
}
/*
@ -1708,19 +1678,32 @@ Zotero.Translate.prototype._importDefuseBOM = function() {
*/
Zotero.Translate.prototype._export = function() {
// get items
if(this.items) {
// if just items, get them and don't worry about collection logic
this._itemsLeft = this.items;
} else if(this.collection) {
Zotero.debug("using collection");
Zotero.debug(this.collection);
// get items in this collection
this._itemsLeft = Zotero.getItems(this.collection.getID());
if(this._configOptions.getCollections) {
// get child collections
this._collectionsLeft = Zotero.getCollections(this.collection.getID(), true);
// get items in child collections
for each(var collection in this._collectionsLeft) {
this._itemsLeft = this._itemsLeft.concat(Zotero.getItems(collection.getID()));
}
}
} else {
// get all items
this._itemsLeft = Zotero.getItems();
}
// run handler for items available
this._runHandler("itemCount", this._itemsLeft.length);
// get collections, if requested
if(this._configOptions.getCollections && !this.items) {
this._collectionsLeft = Zotero.getCollections();
if(this._configOptions.getCollections) {
// get all collections
this._collectionsLeft = Zotero.getCollections();
}
}
Zotero.debug(this._displayOptions);

View File

@ -1252,6 +1252,9 @@ Zotero.Date = new function(){
}
}
/**
* Functions for creating and destroying hidden browser objects
**/
Zotero.Browser = new function() {
this.createHiddenBrowser = createHiddenBrowser;
this.deleteHiddenBrowser = deleteHiddenBrowser;
@ -1279,6 +1282,44 @@ Zotero.Browser = new function() {
}
}
/**
* Functions for disabling and enabling the unresponsive script indicator
**/
Zotero.UnresponsiveScriptIndicator = new function() {
this.disable = disable;
this.enable = enable;
// stores the state of the unresponsive script preference prior to disabling
var _unresponsiveScriptPreference, _isDisabled;
/**
* disables the "unresponsive script" warning; necessary for import and
* export, which can take quite a while to execute
**/
function disable() {
// don't do anything if already disabled
if(_isDisabled) return;
var prefService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
_unresponsiveScriptPreference = prefService.getIntPref("dom.max_chrome_script_run_time");
prefService.setIntPref("dom.max_chrome_script_run_time", 0);
_isDisabled = true;
}
/**
* restores the "unresponsive script" warning
**/
function enable() {
var prefService = Components.classes["@mozilla.org/preferences-service;1"].
getService(Components.interfaces.nsIPrefBranch);
prefService.setIntPref("dom.max_chrome_script_run_time", _unresponsiveScriptPreference);
_isDisabled = false;
}
}
/*
* Implements nsIWebProgressListener

View File

@ -1,4 +1,4 @@
-- 167
-- 168
-- ***** BEGIN LICENSE BLOCK *****
--
@ -22,7 +22,7 @@
-- Set the following timestamp to the most recent scraper update date
REPLACE INTO version VALUES ('repository', STRFTIME('%s', '2007-01-24 01:35:00'));
REPLACE INTO version VALUES ('repository', STRFTIME('%s', '2007-01-26 20:43:00'));
REPLACE INTO translators VALUES ('96b9f483-c44d-5784-cdad-ce21b984fe01', '1.0.0b3.r1', '', '2006-12-15 03:40:00', 1, 100, 4, 'Amazon.com', 'Sean Takats', '^https?://(?:www\.)?amazon',
'function detectWeb(doc, url) {
@ -4798,7 +4798,7 @@ REPLACE INTO translators VALUES ('cb48083-4d9-4ed-ac95-2e93dceea0ec', '1.0.0b3.r
Zotero.wait();
}');
REPLACE INTO translators VALUES ('f8765470-5ace-4a31-b4bd-4327b960ccd', '1.0.0b3.r1', '', '2006-12-16 01:02:00', 1, 100, 4, 'SpringerLink', 'Simon Kornblith', '^http://www\.springerlink\.com/content/',
REPLACE INTO translators VALUES ('f8765470-5ace-4a31-b4bd-4327b960ccd', '1.0.0b3.r1', '', '2007-01-26 20:43:00', 1, 100, 4, 'SpringerLink', 'Simon Kornblith', '^http://www\.springerlink\.com/content/',
'function detectWeb(doc, url) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
@ -4809,7 +4809,7 @@ REPLACE INTO translators VALUES ('f8765470-5ace-4a31-b4bd-4327b960ccd', '1.0.0b3
return "multiple";
} else if(doc.title == "SpringerLink - Book Chapter") {
return "bookSection";
} else if(doc.evaluate(''//a[@id="_ctl0_PageSidebar__ctl1_Sidebarplaceholder1__ctl1_ExportRisLink"]'',
} else if(doc.evaluate(''//a[text() = "RIS"]'',
doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
return "journalArticle";
}
@ -4881,7 +4881,7 @@ REPLACE INTO translators VALUES ('f8765470-5ace-4a31-b4bd-4327b960ccd', '1.0.0b3
Zotero.wait();
}');
REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3.r1', '', '2006-12-16 04:13:00', 1, 100, 4, 'Nature', 'Simon Kornblith', '^http://www\.nature\.com/(?:[^/]+/journal/v[^/]+/n[^/]+/(?:(?:full|abs)/.+\.html|index.html)|search/executeSearch)',
REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3.r1', '', '2007-01-26 20:43:00', 1, 100, 4, 'Nature', 'Simon Kornblith', '^http://www\.nature\.com/(?:[^/]+/journal/v[^/]+/n[^/]+/(?:(?:full|abs)/.+\.html|index.html)|search/executeSearch)',
'function detectWeb(doc, url) {
var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+\.)html/;
@ -4911,7 +4911,7 @@ REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3
if (prefix == ''x'') return namespace; else return null;
} : null;
var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+\.)html/;
var articleRe = /(https?:\/\/[^\/]+\/[^\/]+\/journal\/v[^\/]+\/n[^\/]+\/)(full|abs)(\/.+)\.html/;
var m = articleRe.exec(url);
if(!m) {
@ -4943,7 +4943,10 @@ REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3
for each(var item in urls) {
var m = articleRe.exec(item);
RIS.push(m[1]+"ris"+m[3]+"ris");
if(m[3][m[3].length-2] == "_") {
m[3] = m[3].substr(0, m[3].length-2);
}
RIS.push(m[1]+"ris"+m[3]+".ris");
regexps.push(m);
}
@ -4958,7 +4961,7 @@ REPLACE INTO translators VALUES ('6614a99-479a-4524-8e30-686e4d66663e', '1.0.0b3
var m = regexps.shift();
item.attachments = [
{url:m[0], title:"Nature Snapshot", mimeType:"text/html"},
{url:m[1]+"pdf"+m[3]+"pdf", title:"Nature Full Text PDF", mimeType:"application/pdf"}
{url:m[1]+"pdf"+m[3]+".pdf", title:"Nature Full Text PDF", mimeType:"application/pdf"}
]
item.notes = new Array();
@ -7769,7 +7772,7 @@ REPLACE INTO translators VALUES ('6e372642-ed9d-4934-b5d1-c11ac758ebb7', '1.0.0b
}
}');
REPLACE INTO translators VALUES ('5e3ad958-ac79-463d-812b-a86a9235c28f', '1.0.0b3.r1', '', '2006-12-15 14:39:00', 1, 100, 1, 'RDF', 'Simon Kornblith', 'rdf',
REPLACE INTO translators VALUES ('5e3ad958-ac79-463d-812b-a86a9235c28f', '1.0.0b3.r1', '', '2007-01-26 20:43:00', 1, 100, 1, 'RDF', 'Simon Kornblith', 'rdf',
'Zotero.configure("dataMode", "rdf");
function detectImport() {
@ -8267,7 +8270,7 @@ function importItem(newItem, node, type) {
for each(var relation in relations) {
var type = Zotero.RDF.getTargets(relation, rdf+"type");
if(Zotero.RDF.getResourceURI(type[0]) == n.fs+"Attachment") {
var attachment = new Object();
var attachment = new Zotero.Item();
newItem.attachments.push(attachment);
importItem(attachment, relation, n.fs+"Attachment");
}
@ -8304,7 +8307,6 @@ function doImport() {
// figure out if this is a part of another resource, or a linked
// attachment
if(Zotero.RDF.getSources(node, n.dcterms+"isPartOf") ||
Zotero.RDF.getSources(node, n.dcterms+"hasPart") ||
Zotero.RDF.getSources(node, n.bib+"presentedAt") ||
Zotero.RDF.getSources(node, n.link+"link")) {
continue;
@ -8318,7 +8320,7 @@ function doImport() {
// skip if this is not an independent attachment,
if((type == n.fs+"Attachment" || type == n.bib+"Memo") && isPart(node)) {
continue;
} else if(type == n.bib+"Collection") {
} else if(type == n.bib+"Collection" || type == n.fs+"Collection") {
// skip collections until all the items are done
collections.push(node);
continue;