Skip to content

Instantly share code, notes, and snippets.

Created August 31, 2011 20:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/1184649 to your computer and use it in GitHub Desktop.
Save anonymous/1184649 to your computer and use it in GitHub Desktop.
Index: chrome/content/zotero/xpcom/search.js
===================================================================
--- chrome/content/zotero/xpcom/search.js (revision 10348)
+++ chrome/content/zotero/xpcom/search.js (working copy)
@@ -400,6 +400,7 @@
this.load();
}
+
if (!Zotero.SearchConditions.hasOperator(condition, operator)){
throw ("Invalid operator '" + operator + "' for condition " + condition);
}
Index: chrome/content/zotero/xpcom/collectionTreeView.js
===================================================================
--- chrome/content/zotero/xpcom/collectionTreeView.js (revision 10348)
+++ chrome/content/zotero/xpcom/collectionTreeView.js (working copy)
@@ -53,6 +53,7 @@
*/
Zotero.CollectionTreeView.prototype.setTree = function(treebox)
{
+
if (this._treebox || !treebox) {
return;
}
@@ -137,15 +138,17 @@
this._duplicateLibraries = ['0'];
}
}
-
- try {
- this._unfiledLibraries = Zotero.Prefs.get('unfiledLibraries').split(',');
+
+ if (this.hideSources.indexOf('unfiled') == -1) {
+ try {
+ this._unfiledLibraries = Zotero.Prefs.get('unfiledLibraries').split(',');
+ }
+ catch (e) {
+ // Add to personal library by default
+ Zotero.Prefs.set('unfiledLibraries', '0');
+ this._unfiledLibraries = ['0'];
+ }
}
- catch (e) {
- // Add to personal library by default
- Zotero.Prefs.set('unfiledLibraries', '0');
- this._unfiledLibraries = ['0'];
- }
var self = this;
var library = {
@@ -482,8 +485,17 @@
Zotero.CollectionTreeView.prototype.isContainerEmpty = function(row)
{
var itemGroup = this._getItemAtRow(row);
+
if (itemGroup.isLibrary()) {
- return false;
+ //TODO: implement hasSearches and hasCollections for library, maybe?
+ var hasSearches = Zotero.Searches.getAll(0).length >0;
+ var hasCollections = Zotero.getCollections(0).length >0;
+
+ return !hasCollections
+ && (!hasSearches || this.hideSources.indexOf('search') != -1)
+ && this._duplicateLibraries.indexOf(0) == -1
+ && this._unfiledLibraries.indexOf(0) == -1
+ && this.hideSources.indexOf('trash') != -1;
}
if (itemGroup.isHeader()) {
return false;
@@ -491,12 +503,12 @@
if (itemGroup.isBucket()) {
return true;
}
- if (itemGroup.isGroup()) {
+ if (itemGroup.isGroup() ) {
var libraryID = itemGroup.ref.libraryID;
libraryID = (libraryID ? libraryID : 0) + '';
return !itemGroup.ref.hasCollections()
- && !itemGroup.ref.hasSearches()
+ && (!itemGroup.ref.hasSearches() || this.hideSources.indexOf('search') != -1)
&& this._duplicateLibraries.indexOf(libraryID) == -1
&& this._unfiledLibraries.indexOf(libraryID) == -1
&& this.hideSources.indexOf('trash') != -1;
@@ -829,7 +841,13 @@
var collections = Zotero.getCollections(itemGroup.ref.id);
}
- var savedSearches = Zotero.Searches.getAll(libraryID);
+ if(this.hideSources.indexOf('search') == -1){
+ var savedSearches = Zotero.Searches.getAll(libraryID);
+ }
+ else{
+ var savedSearches = [];
+ }
+
var showDuplicates = this.hideSources.indexOf('duplicates') == -1
&& this._duplicateLibraries.indexOf(intLibraryID + '') != -1;
var showUnfiled = this._unfiledLibraries.indexOf(intLibraryID + '') != -1;
Index: chrome/content/zotero/xpcom/integration.js
===================================================================
--- chrome/content/zotero/xpcom/integration.js (revision 10348)
+++ chrome/content/zotero/xpcom/integration.js (working copy)
@@ -1162,6 +1162,46 @@
Zotero.Integration.Session.prototype.setData = function(data) {
var oldStyleID = (this.data && this.data.style.styleID ? this.data.style.styleID : false);
this.data = data;
+
+ Zotero.debug(this.data.prefs);
+
+ this.usePreferredLibrary=this.data.prefs.usePreferredLibrary
+
+ if(this.usePreferredLibrary){
+ //Resolve library and collection IDs based on the preferredLibraryID.
+
+ var matches = this.data.prefs.preferredLibraryOrCollection.match(/^([LGC])([0-9]+)?$/);
+
+
+ if (matches) {
+ if(matches[1]=="L"){
+ //My library is null
+ this.preferredLibraryID = null;
+ this.preferredCollectionID = null;
+ }
+ else if(matches[1]=="G"){
+
+ //TODO: There is probably a much better way to resolve the libraryID from groupID
+ var sql = "SELECT libraryID FROM groups WHERE groupID = " + matches[2];
+ var result = Zotero.DB.query(sql);
+ this.preferredLibraryID=result[0].libraryID;
+ this.preferredCollectionID = null;
+ }
+ else if(matches[1]=="C"){
+
+ this.preferredCollectionID = parseInt(matches[2]);
+
+ // TODO: If there is already a function in the data layer for this, then the code below should be refactored
+
+ var sql = "SELECT libraryID FROM collections WHERE collectionID = " + this.preferredCollectionID;
+ this.preferredLibraryID=Zotero.DB.query(sql)[0].libraryID;
+ }
+ }
+ else{
+ this.usePreferredLibrary = false;
+ }
+ }
+
if(data.style.styleID && oldStyleID != data.style.styleID) {
this.styleID = data.style.styleID;
try {
@@ -1218,6 +1258,8 @@
io.primaryFieldType = primaryFieldType;
io.secondaryFieldType = secondaryFieldType;
io.storeReferences = this.data.prefs.storeReferences;
+ io.usePreferredLibrary = this.data.prefs.usePreferredLibrary;
+ io.preferredLibraryOrCollection = this.data.prefs.preferredLibraryOrCollection;
}
this._displayDialog('chrome://zotero/content/integration/integrationDocPrefs.xul', '', io);
@@ -1230,6 +1272,9 @@
data.style.styleID = io.style;
data.prefs.fieldType = io.fieldType;
data.prefs.storeReferences = io.storeReferences;
+ data.prefs.preferredLibraryOrCollection = io.preferredLibraryOrCollection;
+ data.prefs.usePreferredLibrary = io.usePreferredLibrary;
+
this.setData(data);
// need to do this after setting the data so that we know if it's a note style
this.data.prefs.noteType = this.style && this.styleClass == "note" ? io.useEndnotes+1 : 0;
@@ -1349,6 +1394,137 @@
l:"line"
};
+// TODO: This function is defined originally in collectionTreeView in the
+// scope of another function. Since this probably has a wider use,
+// the function should de relocated.
+
+Zotero.Integration.Session.prototype.copyItem = function(item, targetLibraryID) {
+
+ // Check if there's already a copy of this item in the library
+ var linkedItem = item.getLinkedItem(targetLibraryID);
+ if (linkedItem) {
+ return linkedItem.id;
+
+ /*
+ // TODO: support tags, related, attachments, etc.
+
+ // Overlay source item fields on unsaved clone of linked item
+ var newItem = item.clone(false, linkedItem.clone(true));
+ newItem.setField('dateAdded', item.dateAdded);
+ newItem.setField('dateModified', item.dateModified);
+
+ var diff = newItem.diff(linkedItem, false, ["dateAdded", "dateModified"]);
+ if (!diff) {
+ // Check if creators changed
+ var creatorsChanged = false;
+
+ var creators = item.getCreators();
+ var linkedCreators = linkedItem.getCreators();
+ if (creators.length != linkedCreators.length) {
+ Zotero.debug('Creators have changed');
+ creatorsChanged = true;
+ }
+ else {
+ for (var i=0; i<creators.length; i++) {
+ if (!creators[i].ref.equals(linkedCreators[i].ref)) {
+ Zotero.debug('changed');
+ creatorsChanged = true;
+ break;
+ }
+ }
+ }
+ if (!creatorsChanged) {
+ Zotero.debug("Linked item hasn't changed -- skipping conflict resolution");
+ continue;
+ }
+ }
+ toReconcile.push([newItem, linkedItem]);
+ continue;
+ */
+ }
+
+ // Standalone attachment
+ if (item.isAttachment()) {
+ return Zotero.Attachments.copyAttachmentToLibrary(item, targetLibraryID);
+ }
+
+ // Create new unsaved clone item in target library
+ var newItem = new Zotero.Item(item.itemTypeID);
+ newItem.libraryID = targetLibraryID;
+ // DEBUG: save here because clone() doesn't currently work on unsaved tagged items
+ var id = newItem.save();
+ newItem = Zotero.Items.get(id);
+ item.clone(false, newItem);
+ newItem.save();
+ //var id = newItem.save();
+ //var newItem = Zotero.Items.get(id);
+
+ // Record link
+ item.addLinkedItem(newItem);
+ var newID = id;
+
+ if (item.isNote()) {
+ return newID;
+ }
+
+ // For regular items, add child items if prefs and permissions allow
+
+ // Child notes
+ if (Zotero.Prefs.get('groups.copyChildNotes')) {
+ var noteIDs = item.getNotes();
+ var notes = Zotero.Items.get(noteIDs);
+ for each(var note in notes) {
+ var newNote = new Zotero.Item('note');
+ newNote.libraryID = targetLibraryID;
+ // DEBUG: save here because clone() doesn't currently work on unsaved tagged items
+ var id = newNote.save();
+ newNote = Zotero.Items.get(id);
+ note.clone(false, newNote);
+ newNote.setSource(newItem.id);
+ newNote.save();
+
+ note.addLinkedItem(newNote);
+ }
+ }
+
+ // Child attachments
+ var copyChildLinks = Zotero.Prefs.get('groups.copyChildLinks');
+ var copyChildFileAttachments = Zotero.Prefs.get('groups.copyChildFileAttachments');
+ if (copyChildLinks || copyChildFileAttachments) {
+ var attachmentIDs = item.getAttachments();
+ var attachments = Zotero.Items.get(attachmentIDs);
+ for each(var attachment in attachments) {
+ var linkMode = attachment.attachmentLinkMode;
+
+ // Skip linked files
+ if (linkMode == Zotero.Attachments.LINK_MODE_LINKED_FILE) {
+ continue;
+ }
+
+ // Skip imported files if we don't have pref and permissions
+ if (linkMode == Zotero.Attachments.LINK_MODE_LINKED_URL) {
+ if (!copyChildLinks) {
+ Zotero.debug("Skipping child link attachment on drag");
+ continue;
+ }
+ }
+ else {
+ // TODO: The following if statement used to be. itemGroup referred to parent scope in collectionTreeView.js
+ // if (!copyChildFileAttachments || !itemGroup.filesEditable) {
+
+ if (!copyChildFileAttachments) {
+ Zotero.debug("Skipping child file attachment on drag");
+ continue;
+ }
+ }
+
+ Zotero.Attachments.copyAttachmentToLibrary(attachment, targetLibraryID, newItem.id);
+ }
+ }
+
+ return newID;
+}
+
/**
* Adds a citation to the arrays representing the document
*/
@@ -1444,6 +1620,45 @@
}
if(zoteroItem) {
+ // If a preferred library and collection are in use copy the item to the preferred library
+ // and assign to a the preferred collection if not already there. Then update the
+ // zoteroItem to point to the correct item.
+
+
+ if(this.usePreferredLibrary){
+
+
+ Zotero.debug("Integration: Comparing preferred library ("+this.preferredLibraryID+") to item library ("+ zoteroItem.libraryID+")");
+
+ if(zoteroItem.libraryID!==this.preferredLibraryID){
+
+ Zotero.debug("Integration: Item library did not match preferred library. Copying the item to the preferred library");
+
+ newID = this.copyItem(zoteroItem,this.preferredLibraryID);
+
+ //Replace the old Zotero item with this new copy so that the citation will
+ //point to the new copy.
+
+ zoteroItem = Zotero.Items.get(newID);
+
+ }
+
+ Zotero.debug("Integration: Comparing preferred collection ("+this.preferredCollectionID+") to item collections ("+ zoteroItem.getCollections()+")");
+
+ //If there is a preferred collection ID and the
+
+ if(this.preferredCollectionID != null && zoteroItem.getCollections().indexOf(this.preferredCollectionID) == -1){
+ Zotero.debug("Integration: Item collections did not include preferred collection. Updating the item collections.");
+ var collection = Zotero.Collections.get(this.preferredCollectionID);
+ Zotero.DB.beginTransaction();
+ collection.addItems([zoteroItem.id]);
+ Zotero.DB.commitTransaction();
+ Zotero.debug("Integration: New collections "+ zoteroItem.getCollections());
+
+ }
+
+
+ }
citationItem.id = zoteroItem.id;
}
}
@@ -1986,6 +2201,12 @@
// citeproc-js style object for use of third-party extension
io.style = this.style;
+ // Preferred library
+
+ io.usePreferredLibrary = this.usePreferredLibrary;
+ io.preferredLibraryID = this.preferredLibraryID;
+ io.preferredCollectionID = this.preferredCollectionID;
+
if(Zotero.Prefs.get("integration.useClassicAddCitationDialog")) {
this._displayDialog('chrome://zotero/content/integration/addCitationDialog.xul', 'resizable', io);
} else {
Index: chrome/content/zotero/integration/integrationDocPrefs.xul
===================================================================
--- chrome/content/zotero/integration/integrationDocPrefs.xul (revision 10348)
+++ chrome/content/zotero/integration/integrationDocPrefs.xul (working copy)
@@ -42,32 +42,66 @@
<script src="../include.js"/>
<script src="../bibliography.js"/>
- <groupbox>
- <caption label="&zotero.bibliography.style.label;"/>
- <listbox id="style-listbox" onselect="Zotero_File_Interface_Bibliography.styleChanged()"/>
- </groupbox>
-
- <groupbox>
- <caption label="&zotero.integration.prefs.displayAs.label;"/>
- <radiogroup id="displayAs" orient="horizontal">
- <radio id="footnotes" label="&zotero.integration.prefs.footnotes.label;" selected="true"/>
- <radio id="endnotes" label="&zotero.integration.prefs.endnotes.label;"/>
- </radiogroup>
- </groupbox>
-
- <groupbox>
- <caption label="&zotero.integration.prefs.formatUsing.label;"/>
+ <tabbox id="tabs-root-element">
+ <tabs>
+ <tab label="Citation style"/>
+ <tab label="Format using"/>
+ <tab label="Preferred collection"/>
+ </tabs>
+ <tabpanels>
+ <tabpanel orient="vertical">
+ <groupbox>
+ <caption label="&zotero.bibliography.style.label;"/>
+ <listbox id="style-listbox" onselect="Zotero_File_Interface_Bibliography.styleChanged()"/>
+ </groupbox>
+
+ <groupbox>
+ <caption label="&zotero.integration.prefs.displayAs.label;"/>
+ <radiogroup id="displayAs" orient="horizontal">
+ <radio id="footnotes" label="&zotero.integration.prefs.footnotes.label;" selected="true"/>
+ <radio id="endnotes" label="&zotero.integration.prefs.endnotes.label;"/>
+ </radiogroup>
+ </groupbox>
- <radiogroup id="formatUsing" orient="vertical">
- <radio id="fields" selected="true"/>
- <label class="radioDescription" id="fields-caption"/>
- <label class="radioDescription" id="fields-file-format-notice"/>
- <radio id="bookmarks" label="&zotero.integration.prefs.bookmarks.label;"/>
- <description class="radioDescription" id="bookmarks-caption" style="white-space: pre;">&zotero.integration.prefs.bookmarks.caption;</description>
- <description class="radioDescription" id="bookmarks-file-format-notice"/>
- </radiogroup>
-
- <checkbox id="storeReferences" label="&zotero.integration.prefs.storeReferences.label;"/>
- <description class="radioDescription">&zotero.integration.prefs.storeReferences.caption;</description>
- </groupbox>
+ </tabpanel>
+ <tabpanel orient="vertical">
+
+ <groupbox>
+ <caption label="&zotero.integration.prefs.formatUsing.label;"/>
+
+ <radiogroup id="formatUsing" orient="vertical">
+ <radio id="fields" selected="true"/>
+ <label class="radioDescription" id="fields-caption"/>
+ <label class="radioDescription" id="fields-file-format-notice"/>
+ <radio id="bookmarks" label="&zotero.integration.prefs.bookmarks.label;"/>
+ <description class="radioDescription" id="bookmarks-caption" style="white-space: pre;">&zotero.integration.prefs.bookmarks.caption;</description>
+ <description class="radioDescription" id="bookmarks-file-format-notice"/>
+ </radiogroup>
+
+ <checkbox id="storeReferences" label="&zotero.integration.prefs.storeReferences.label;"/>
+ <description class="radioDescription">&zotero.integration.prefs.storeReferences.caption;</description>
+ </groupbox>
+ </tabpanel>
+ <tabpanel orient="vertical">
+
+ <groupbox>
+ <caption label="Use preferred collection"/>
+ <checkbox id="usePreferredLibrary" label="Use preferred collection"/>
+ <description class="radioDescription">If preferred collection is used, only items in this collection will appear in the insert citation bar. All items will continue to be available through the classic view and will be automatically assigned to the preferred collection.</description>
+ <tree id="zotero-collections-tree"
+ style="height: 200px;" hidecolumnpicker="true" seltype="single"
+ onselect="onCollectionSelected();">
+ <treecols>
+ <treecol
+ id="zotero-collections-name-column"
+ flex="1"
+ primary="true"
+ hideheader="true"/>
+ </treecols>
+ <treechildren/>
+ </tree>
+ </groupbox>
+ </tabpanel>
+ </tabpanels>
+ </tabbox>
</dialog>
\ No newline at end of file
Index: chrome/content/zotero/integration/quickFormat.js
===================================================================
--- chrome/content/zotero/integration/quickFormat.js (revision 10348)
+++ chrome/content/zotero/integration/quickFormat.js (working copy)
@@ -27,6 +27,9 @@
var io, qfs, qfi, qfiWindow, qfiDocument, qfe, qfb, qfbHeight, keepSorted, showEditor,
referencePanel, referenceBox, referenceHeight, dragX, dragY, curLocator, curLocatorLabel,
curIDs = [], curResizer, dragging;
+
+ var usePreferredLibrary, preferredCollectionID, preferredLibraryID;
+
const SHOWN_REFERENCES = 7;
/**
@@ -76,6 +79,11 @@
}
}
+ //Load preferences about the preferred library
+ this.usePreferredLibrary = io.usePreferredLibrary;
+ this.preferredLibraryID = io.preferredLibraryID;
+ this.preferredCollectionID = io.preferredCollectionID;
+
window.sizeToContent();
}
@@ -237,6 +245,17 @@
s.addCondition("date", "isBefore", (year)+"-12-31 23:59:59");
haveConditions = true;
}
+
+ //If there is a preferred collection or a preferred library, add these conditions.
+
+ if(this.usePreferredLibrary){
+ Zotero.debug("QuickFormat: Adding extra conditions based on preferred library and collection");
+ s.addCondition("libraryID", "is", this.preferredLibraryID);
+ if(this.preferredCollectionID){
+ s.addCondition("collectionID", "is", this.preferredCollectionID);
+ }
+ }
+
}
var ids = (haveConditions ? s.search() : []);
Index: chrome/content/zotero/integration/quickFormat.xul
===================================================================
--- chrome/content/zotero/integration/quickFormat.xul (revision 10348)
+++ chrome/content/zotero/integration/quickFormat.xul (working copy)
@@ -40,7 +40,7 @@
onkeypress="Zotero_QuickFormat.onKeyPress(event)">
<script src="../include.js"/>
- <script src="quickFormat.js"/>
+ <script src="quickFormat.js"/>
<hbox id="quick-format-entry" ondragstart="Zotero_QuickFormat.onDragStart(this, event)">
<hbox id="quick-format-search" flex="1" align="start">
Index: chrome/content/zotero/bibliography.js
===================================================================
--- chrome/content/zotero/bibliography.js (revision 10348)
+++ chrome/content/zotero/bibliography.js (working copy)
@@ -37,6 +37,7 @@
this.init = init;
this.styleChanged = styleChanged;
this.acceptSelection = acceptSelection;
+ this.collectionsView = null;
/*
* Initialize some variables and prepare event listeners for when chrome is done
@@ -45,7 +46,13 @@
function init() {
// Set font size from pref
// Affects bibliography.xul and integrationDocPrefs.xul
- Zotero.setFontSize(document.documentElement);
+
+ if(document.getElementById("tabs-root-element")){
+ Zotero.setFontSize(document.getElementById("tabs-root-element"));
+ }
+ else{
+ Zotero.setFontSize(document.documentElement);
+ }
if(window.arguments && window.arguments.length) {
_io = window.arguments[0];
@@ -54,6 +61,7 @@
_io = {};
}
+
var listbox = document.getElementById("style-listbox");
var styles = Zotero.Styles.getVisible();
@@ -115,7 +123,89 @@
document.getElementById("storeReferences").checked = true;
}
}
-
+ if(document.getElementById("zotero-collections-tree")){
+
+ if(_io.usePreferredLibrary) {
+ document.getElementById("usePreferredLibrary").checked = true;
+ }
+
+ this.collectionsView = new Zotero.CollectionTreeView();
+ this.collectionsView.hideSources = ['duplicates', 'trash', 'commons','unfiled','search'];
+
+
+ document.getElementById("zotero-collections-tree").view = this.collectionsView;
+
+ if(_io.preferredLibraryOrCollection){
+
+ // TODO: Refactor this and Zotero.CollectionTreeView.prototype.getLastViewedRow into a single function
+ var matches = _io.preferredLibraryOrCollection.match(/^([A-Z])([G0-9]+)?$/);
+ var select = 0;
+ if (matches) {
+ if (matches[1] == 'C') {
+ if (this.collectionsView._collectionRowMap[matches[2]]) {
+ select = this.collectionsView._collectionRowMap[matches[2]];
+ }
+ // Search recursively
+ else {
+ var path = [];
+ var failsafe = 10; // Only go up ten levels
+ var lastCol = matches[2];
+ do {
+ failsafe--;
+ var col = Zotero.Collections.get(lastCol);
+ if (!col) {
+ var msg = "Last-viewed collection not found";
+ Zotero.debug(msg);
+ path = [];
+ break;
+ }
+ var par = col.getParent();
+ if (!par) {
+ var msg = "Parent collection not found in "
+ + "Zotero.CollectionTreeView.setTree()";
+ Zotero.debug(msg, 1);
+ Components.utils.reportError(msg);
+ path = [];
+ break;
+ }
+ lastCol = par;
+ path.push(lastCol);
+ }
+ while (!this.collectionsView._collectionRowMap[lastCol] && failsafe > 0)
+ if (path.length) {
+ for (var i=path.length-1; i>=0; i--) {
+ var id = path[i];
+ var row = this.collectionsView._collectionRowMap[id];
+ if (!row) {
+ var msg = "Collection not found in tree in "
+ + "Zotero.CollectionTreeView.setTree()";
+ Zotero.debug(msg, 1);
+ Components.utils.reportError(msg);
+ break;
+ }
+ if (!this.collectionsView.isContainerOpen(row)) {
+ this.collectionsView.toggleOpenState(row);
+ if (this.collectionsView._collectionRowMap[matches[2]]) {
+ select = this.collectionsView._collectionRowMap[matches[2]];
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+ else {
+ var id = matches[1] + (matches[2] ? matches[2] : "");
+ if (this.collectionsView._rowMap[id]) {
+ select = this.collectionsView._rowMap[id];
+ }
+ }
+ }
+
+ this.collectionsView.selection.select(select);
+ }
+
+ }
// set style to false, in case this is cancelled
_io.style = false;
}
@@ -164,6 +254,15 @@
_io.fieldType = (document.getElementById("formatUsing").selectedIndex == 0 ? _io.primaryFieldType : _io.secondaryFieldType);
_io.storeReferences = document.getElementById("storeReferences").checked;
}
+ // ONLY FOR integrationDocPrefs.xul: collect preferred Library
+ if(document.getElementById("usePreferredLibrary")) {
+ _io.usePreferredLibrary = document.getElementById("usePreferredLibrary").checked;
+ var itemGroup = this.collectionsView._getItemAtRow(this.collectionsView.selection.currentIndex);
+
+ if(itemGroup.isLibrary() || itemGroup.isCollection() || itemGroup.isGroup()){
+ _io.preferredLibraryOrCollection = itemGroup.id;
+ }
+ }
// save style (this happens only for "Export Bibliography," or Word
// integration when no bibliography style was previously selected)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment