closes #630, Implement copyCitationsToClipboard in fileInterface.js

the function is actually called copyCitationToClipboard, because it generates a single citation of multiple items if multiple items are passed to it. if this isn't the desired behavior, it's easy to change.
This commit is contained in:
Simon Kornblith 2007-06-21 06:12:06 +00:00
parent c68dbce961
commit bccef73b0f
2 changed files with 66 additions and 4 deletions

View File

@ -116,6 +116,7 @@ var Zotero_File_Interface = new function() {
this.bibliographyFromCollection = bibliographyFromCollection;
this.bibliographyFromItems = bibliographyFromItems;
this.copyItemsToClipboard = copyItemsToClipboard;
this.copyCitationToClipboard = copyCitationToClipboard;
/*
* Creates Zotero.Translate instance and shows file picker for file export
@ -340,6 +341,41 @@ var Zotero_File_Interface = new function() {
clipboardService.setData(transferable, null, Components.interfaces.nsIClipboard.kGlobalClipboard);
}
/*
* Copies HTML and text citations for passed items in given style
*
* Does not check that items are actual references (and not notes or attachments)
*/
function copyCitationToClipboard(items, style) {
// copy to clipboard
var transferable = Components.classes["@mozilla.org/widget/transferable;1"].
createInstance(Components.interfaces.nsITransferable);
var clipboardService = Components.classes["@mozilla.org/widget/clipboard;1"].
getService(Components.interfaces.nsIClipboard);
var csl = Zotero.Cite.getStyle(style);
csl.preprocessItems(items);
// add HTML
var bibliography = csl.createCitation({citationType:1, items:items}, "HTML");
var str = Components.classes["@mozilla.org/supports-string;1"].
createInstance(Components.interfaces.nsISupportsString);
str.data = bibliography;
transferable.addDataFlavor("text/html");
transferable.setTransferData("text/html", str, bibliography.length*2);
// add text
var bibliography = csl.createCitation({citationType:1, items:items}, "Text");
var str = Components.classes["@mozilla.org/supports-string;1"].
createInstance(Components.interfaces.nsISupportsString);
str.data = bibliography;
transferable.addDataFlavor("text/unicode");
transferable.setTransferData("text/unicode", str, bibliography.length*2);
clipboardService.setData(transferable, null, Components.interfaces.nsIClipboard.kGlobalClipboard);
}
/*
* Shows bibliography options and creates a bibliography
*/
@ -528,4 +564,4 @@ Zotero_File_Interface.Progress = new function() {
window.setTimeout(_callback, 1500);
}
}
}
}

View File

@ -444,6 +444,22 @@ Zotero.CSL._locatorTerms = {
/*
* create a citation (in-text or footnote)
* accepts a citation object containing:
*
* citation.citationType
* 1 = first
* 2 = subsequent
* 3 = ibid
* 4 = ibid + pages
*
* citation.locators
* array of locators
*
* citation.locatorTypes
* array of types for given locators (see above)
*
* citation.items/citation.itemIDs
* array of items/itemIDs to be cited
*/
Zotero.CSL.prototype.createCitation = function(citation, format) {
var string = new Zotero.CSL.FormattedString(this, format);
@ -475,8 +491,10 @@ Zotero.CSL.prototype.createCitation = function(citation, format) {
}
}
} else { // indicates primary or subsequent
var lasti = citation.itemIDs.length-1;
for(var i in citation.itemIDs) {
if(citation.itemIDs) citation.items = citation.itemIDs;
var lasti = citation.items.length-1;
for(var i in citation.items) {
var locatorType = false;
var locator = false;
if(citation.locators) {
@ -485,7 +503,15 @@ Zotero.CSL.prototype.createCitation = function(citation, format) {
}
var position = (citation.citationType[i] == 1 ? "first" : "subsequent");
var citationString = this._getCitation(Zotero.Items.get(citation.itemIDs[i]),
// allow either item objects or ids
if(typeof citation.items[i] == "object") {
item = citation.items[i];
} else {
item = Zotero.Items.get(citation.items[i]);
}
var citationString = this._getCitation(item,
position,
locatorType, locator, format, this._cit);
string.concat(citationString);