- return "Keep Citations Sorted" checkbox

- update to citeproc-js 1.0.22
From Frank's announcement:

- Bypass sorting of citations that have a value for "unsorted"
 in citation.properties.

This permits per-citation override of style-driven citation sorts, as
supported by Zotero and required for some common use cases.
This commit is contained in:
Simon Kornblith 2010-06-06 00:57:47 +00:00
parent 75374af5af
commit 5284da05af
3 changed files with 89 additions and 83 deletions

View file

@ -42,6 +42,7 @@ var Zotero_Citation_Dialog = new function () {
var _autoRegeneratePref;
var _acceptButton;
var _sortCheckbox;
var _citationList;
var _originalHTML;
var io;
@ -71,13 +72,13 @@ var Zotero_Citation_Dialog = new function () {
// find accept button
_acceptButton = document.getElementById("zotero-add-citation-dialog").getButton("accept");
_autoRegeneratePref = Zotero.Prefs.get("integration.autoRegenerate");
_citationList = document.getElementById("citation-list");
// if a style with sortable citations, present checkbox
if(io.citation.sortable) {
if(io.sortable) {
_sortCheckbox = document.getElementById("keepSorted");
_sortCheckbox.hidden = false;
if(io.citation.properties.sort === undefined) io.citation.properties.sort = true;
_sortCheckbox.checked = io.citation.properties.sort;
_sortCheckbox.checked = !io.citation.properties.unsorted;
}
// load locators
@ -217,30 +218,29 @@ var Zotero_Citation_Dialog = new function () {
_updateAccept();
_updatePreview();
}
_configListPosition(document.getElementById("citation-list"), true);
_configListPosition(true);
}
/*
* called when an item in the selected items list is clicked
*/
function listItemSelected() {
var itemList = document.getElementById("citation-list");
var selectedListItem = itemList.getSelectedItem(0);
var selectedListItem = _citationList.getSelectedItem(0);
var itemID = (selectedListItem ? selectedListItem.value : false);
_itemSelected(itemID);
_configListPosition(itemList, !itemID);
_configListPosition(!itemID);
document.getElementById("remove").disabled = !itemID;
}
function _configListPosition(itemList,flag) {
var selectedIndex = itemList.selectedIndex;
function _configListPosition(flag) {
var selectedIndex = _citationList.selectedIndex;
if (selectedIndex > 0) {
document.getElementById("up").disabled = flag;
} else {
document.getElementById("up").disabled = true;
}
if (selectedIndex < (itemList.getRowCount() - 1)) {
if (selectedIndex < (_citationList.getRowCount() - 1)) {
document.getElementById("down").disabled = flag;
} else {
document.getElementById("down").disabled = true;
@ -248,22 +248,27 @@ var Zotero_Citation_Dialog = new function () {
}
function _move(direction) {
// automatically uncheck sorted checkbox if user is rearranging citation
if(_sortCheckbox && _sortCheckbox.checked) {
_sortCheckbox.checked = false;
sortCitation();
}
var insertBeforeItem;
var itemList = document.getElementById("citation-list");
var selectedListItem = itemList.getSelectedItem(0);
var selectedListItem = _citationList.getSelectedItem(0);
var itemID = selectedListItem.value;
var selectedListIndex = itemList.selectedIndex;
var selectedListIndex = _citationList.selectedIndex;
if (direction === -1) {
insertBeforeItem = selectedListItem.previousSibling;
} else {
insertBeforeItem = selectedListItem.nextSibling.nextSibling;
}
var listItem = itemList.removeChild(selectedListItem);
itemList.insertBefore(listItem, insertBeforeItem);
itemList.selectedIndex = (selectedListIndex + direction);
var listItem = _citationList.removeChild(selectedListItem);
_citationList.insertBefore(listItem, insertBeforeItem);
_citationList.selectedIndex = (selectedListIndex + direction);
_itemSelected(itemID);
_updatePreview();
_configListPosition(itemList, false);
_configListPosition(false);
}
function up() {
@ -281,6 +286,8 @@ var Zotero_Citation_Dialog = new function () {
var item = itemsView.getSelectedItems()[0]; // treeview from selectItemsDialog.js
_itemSelected(item.getID());
_addItem(item);
_citationList.selectedIndex = _citationList.getRowCount()-1;
_citationList.focus();
// don't let someone select it again
document.getElementById("add").disabled = true;
@ -295,8 +302,7 @@ var Zotero_Citation_Dialog = new function () {
* Deletes a citation from the multipleSources list
*/
function remove() {
var citationList = document.getElementById("citation-list");
var selectedListItem = citationList.getSelectedItem(0);
var selectedListItem = _citationList.getSelectedItem(0);
var itemID = selectedListItem.value;
// remove from _itemData
@ -312,7 +318,7 @@ var Zotero_Citation_Dialog = new function () {
}
// remove from list
citationList.removeChild(selectedListItem);
_citationList.removeChild(selectedListItem);
_updateAccept();
_updatePreview();
@ -323,22 +329,29 @@ var Zotero_Citation_Dialog = new function () {
* Sorts the list of citations
*/
function sortCitation() {
io.citation.properties.sort = _sortCheckbox && _sortCheckbox.checked;
if(io.citation.properties.sort) {
_getCitation();
// delete all existing items from list
_clearCitationList();
// run preview function to re-sort, if it hasn't already been
// run
io.previewFunction();
// add items back to list
for(var i=0; i<io.citation.citationItems.length; i++) {
var item = Zotero.Items.get(io.citation.citationItems[i].id);
_addItem(item);
}
if(!_sortCheckbox) return;
if(!_sortCheckbox.checked) {
io.citation.properties.unsorted = true;
return;
}
var selectedItemID = (_citationList.selectedItem ? _citationList.selectedItem.value : null);
Zotero.debug("item "+selectedItemID+" selected");
_getCitation();
// delete all existing items from list
_clearCitationList();
// run preview function to re-sort, if it hasn't already been
// run
io.previewFunction();
// add items back to list
for(var i=0; i<io.citation.sortedItems.length; i++) {
var itemID = io.citation.sortedItems[i][0].id;
var item = Zotero.Items.get(itemID);
_addItem(item);
if(itemID == selectedItemID) _citationList.selectedIndex = i;
}
}
@ -463,7 +476,7 @@ var Zotero_Citation_Dialog = new function () {
*/
function _updateAccept(status) {
if(_multipleSourcesOn) {
_acceptButton.disabled = !document.getElementById("citation-list").childNodes.length;
_acceptButton.disabled = !_citationList.getRowCount();
} else {
_acceptButton.disabled = !itemsView.getSelectedItems().length; // treeview from selectItemsDialog.js
}
@ -519,15 +532,12 @@ var Zotero_Citation_Dialog = new function () {
var locatorTypeElements = document.getElementById("label").getElementsByTagName("menuitem");
if(_multipleSourcesOn) {
_itemSelected(); // store locator info
var citationList = document.getElementById("citation-list");
var listLength = citationList.childNodes.length;
var listLength = _citationList.childNodes.length;
var citationItems = new Array();
if(listLength) {
// generate citationItems
for(var i=0; i<listLength; i++) {
var itemID = citationList.childNodes[i].value;
var itemID = _citationList.childNodes[i].value;
var citationItem = _itemData[itemID];
citationItem.id = itemID;
@ -560,24 +570,18 @@ var Zotero_Citation_Dialog = new function () {
*/
function _addItem(item) {
var itemNode = document.createElement("listitem");
var itemList = document.getElementById("citation-list");
itemNode.setAttribute("value", item.getID());
itemNode.setAttribute("label", item.getField("title"));
itemNode.setAttribute("class", "listitem-iconic");
itemNode.setAttribute("image", item.getImageSrc());
itemList.appendChild(itemNode);
itemList.focus();
itemList.selectedIndex = itemList.childNodes.length-1;
_configListPosition(itemList, false);
_citationList.appendChild(itemNode);
_configListPosition(false);
}
/*
* Removes all items from the multiple sources list
*/
function _clearCitationList() {
var citationList = document.getElementById("citation-list");
while(citationList.firstChild) {
citationList.removeChild(citationList.firstChild);
}
while(_citationList.firstChild) _citationList.removeChild(_citationList.firstChild);
}
}

View file

@ -1432,7 +1432,7 @@ CSL.dateParser = function (txt) {
};
CSL.Engine = function (sys, style, lang, xmlmode) {
var attrs, langspec, localexml, locale;
this.processor_version = "1.0.21";
this.processor_version = "1.0.22";
this.csl_version = "1.0";
this.sys = sys;
this.sys.xml = new CSL.System.Xml.Parsing();
@ -2229,7 +2229,9 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
for (pos = 0; pos < len; pos += 1) {
sortedItems[pos][1].sortkeys = CSL.getSortKeys.call(this, sortedItems[pos][0], "citation_sort");
}
sortedItems.sort(this.citation.srt.compareCompositeKeys);
if (!citation.properties.unsorted) {
sortedItems.sort(this.citation.srt.compareCompositeKeys);
}
}
citation.sortedItems = sortedItems;
citationByIndex = [];
@ -2390,7 +2392,9 @@ CSL.Engine.prototype.processCitationCluster = function (citation, citationsPre,
for (pos = 0; pos < len; pos += 1) {
sortedItems[pos][1].sortkeys = CSL.getSortKeys.call(this, sortedItems[pos][0], "citation_sort");
}
sortedItems.sort(this.citation.srt.compareCompositeKeys);
if (!citation.properties.unsorted) {
sortedItems.sort(this.citation.srt.compareCompositeKeys);
}
}
for (key in this.tmp.taintedItemIDs) {
if (this.tmp.taintedItemIDs.hasOwnProperty(key)) {

View file

@ -984,7 +984,7 @@ Zotero.Integration.Session.prototype.reselectItem = function(exception) {
* Generates a field from a citation object
*/
Zotero.Integration.Session._acceptableTypes = ["string", "boolean", "number"];
Zotero.Integration.Session._saveProperties = ["custom", "sort"];
Zotero.Integration.Session._saveProperties = ["custom", "unsorted"];
Zotero.Integration.Session._saveItems = ["locator", "label", "suppress-author", "author-only", "prefix", "suffix"];
Zotero.Integration.Session.prototype.getCitationField = function(citation) {
var type;
@ -1148,36 +1148,31 @@ Zotero.Integration.Session.prototype.addCitation = function(index, noteIndex, ar
*/
Zotero.Integration.Session.prototype.unserializeCitation = function(arg, index) {
if(arg[0] == "{") { // JSON field
// create citation
var citation = {};
var saveCode = true;
// fix for corrupted fields
var lastBracket = arg.lastIndexOf("}");
if(lastBracket+1 != arg.length) {
saveCode = false;
this.updateIndices[index] = true;
arg = arg.substr(0, lastBracket+1);
}
// get JSON
try {
var object = Zotero.JSON.unserialize(arg);
var citation = Zotero.JSON.unserialize(arg);
} catch(e) {
// fix for corrupted fields
try {
var object = Zotero.JSON.unserialize(arg.substr(0, arg.length-1));
var citation = Zotero.JSON.unserialize(arg.substr(0, arg.length-1));
} catch(e) {
throw new Zotero.Integration.CorruptFieldException(arg);
}
}
// fix for uppercase citation codes
if(object.CITATIONITEMS) {
saveCode = false;
if(citation.CITATIONITEMS) {
this.updateIndices[index] = true;
object.citationItems = [];
for (var i=0; i<object.CITATIONITEMS.length; i++) {
for (var j in object.CITATIONITEMS[i]) {
citation.citationItems = [];
for (var i=0; i<citation.CITATIONITEMS.length; i++) {
for (var j in citation.CITATIONITEMS[i]) {
switch (j) {
case 'ITEMID':
var field = 'itemID';
@ -1187,32 +1182,33 @@ Zotero.Integration.Session.prototype.unserializeCitation = function(arg, index)
default:
var field = j.toLowerCase();
}
if (!object.citationItems[i]) {
object.citationItems[i] = {};
if (!citation.citationItems[i]) {
citation.citationItems[i] = {};
}
object.citationItems[i][field] = object.CITATIONITEMS[i][j];
citation.citationItems[i][field] = citation.CITATIONITEMS[i][j];
}
}
}
if(!citation.properties) citation.properties = {};
// copy properties
for(var i in object) {
if(Zotero.Integration.Session._saveProperties.indexOf(i) != -1) {
citation.properties[i] = object[i];
} else if(i == "locatorType") {
citation["label"] = object["locatorType"];
this.updateIndices[index] = true;
} else if(i == "suppressAuthor") {
citation["suppress-author"] = object["suppressAuthor"];
this.updateIndices[index] = true;
} else {
citation[i] = object[i];
// for upgrade from Zotero 2.0 or earlier
for each(var citationItem in citation.citationItems) {
if(citationItem.locatorType) {
citationItem.label = citationItem.locatorType;
delete citationItem.locatorType;
} else if(citationItem.suppressAuthor) {
citationItem["suppress-author"] = citationItem["suppressAuthor"];
delete citationItem.suppressAuthor;
}
}
if(citation.sort) {
citation.properties.unsorted = !citation.sort;
delete citation.sort;
}
if(!citation.citationID) citation.citationID = Zotero.randomString();
if(saveCode) citation.properties.field = arg;
citation.properties.field = arg;
} else { // ye olde style field
var underscoreIndex = arg.indexOf("_");
var itemIDs = arg.substr(0, underscoreIndex).split("|");
@ -1547,6 +1543,8 @@ Zotero.Integration.Session.prototype.editCitation = function(index, noteIndex, c
io.previewFunction = function() {
return me.previewCitation(io.citation);
}
// determine whether citation is sortable in current style
io.sortable = !this.style.citation.opt["citation-number-sort"] && this.style.citation_sort.tokens.length > 0;
var window = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
.getService(Components.interfaces.nsIWindowWatcher)