diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 82962698e7..ea3010b5aa 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -39,6 +39,7 @@ var Zotero_QuickFormat = new function () { panel, panelPrefix, panelSuffix, panelSuppressAuthor, panelLocatorLabel, panelLocator, panelLibraryLink, panelInfo, panelRefersToBubble, panelFrameHeight = 0, accepted = false; var locatorLocked = false; + var locatorNode = null; var _searchPromise; const SEARCH_TIMEOUT = 250; @@ -240,15 +241,14 @@ var Zotero_QuickFormat = new function () { if(!locatorLocked && numRe.test(str)) { // add to previous cite var node = _getCurrentEditorTextNode(); - var prevNode = node.previousSibling; - let citationItem = JSON.parse(prevNode && prevNode.dataset.citationItem || "null"); + let citationItem = JSON.parse(locatorNode && locatorNode.dataset.citationItem || "null"); if (citationItem) { if (!("locator" in citationItem)) { citationItem.locator = ""; } citationItem.locator += str; - prevNode.dataset.citationItem = JSON.stringify(citationItem); - prevNode.textContent = _buildBubbleString(citationItem); + locatorNode.dataset.citationItem = JSON.stringify(citationItem); + locatorNode.textContent = _buildBubbleString(citationItem); node.nodeValue = ""; _clearEntryList(); return; @@ -271,6 +271,7 @@ var Zotero_QuickFormat = new function () { node.nodeValue = ""; _clearEntryList(); locatorLocked = false; + locatorNode = prevNode; return; } } @@ -787,7 +788,11 @@ var Zotero_QuickFormat = new function () { // get next node and clear this one var node = _getCurrentEditorTextNode(); node.nodeValue = ""; - var bubble = _insertBubble(citationItem, node); + // We are setting a locator node here, but below 2 calls reset + // the bubble list for sorting, so we do some additional + // handling to maintain the correct locator node in + // _showCitation() + var bubble = locatorNode = _insertBubble(citationItem, node); _clearEntryList(); yield _previewAndSort(); _refocusQfe(); @@ -923,11 +928,17 @@ var Zotero_QuickFormat = new function () { && io.citation.sortedItems && io.citation.sortedItems.length) { for(var i=0, n=io.citation.sortedItems.length; i { right = event.key == "End"; bubble = _getSelectedBubble(right); @@ -1214,6 +1227,7 @@ var Zotero_QuickFormat = new function () { } }) } else if(keyCode === event.DOM_VK_UP && referencePanel.state === "open") { + locatorLocked = true; var selectedItem = referenceBox.selectedItem; var previousSibling; @@ -1236,6 +1250,7 @@ var Zotero_QuickFormat = new function () { }; event.preventDefault(); } else if(keyCode === event.DOM_VK_DOWN) { + locatorLocked = true; if((Zotero.isMac ? event.metaKey : event.ctrlKey)) { // If meta key is held down, show the citation properties panel var bubble = _getSelectedBubble(); @@ -1369,6 +1384,7 @@ var Zotero_QuickFormat = new function () { delete citationItem["suppress-author"]; } locatorLocked = "locator" in citationItem; + locatorNode = panelRefersToBubble; panelRefersToBubble.dataset.citationItem = JSON.stringify(citationItem); panelRefersToBubble.textContent = _buildBubbleString(citationItem); };