Merge pull request #1218 from adomasven/feature/JSON-pref-docs
Feature/json pref docs
This commit is contained in:
commit
696e828a02
|
@ -990,7 +990,7 @@ Zotero.Integration.Document.prototype._getSession = Zotero.Promise.coroutine(fun
|
||||||
return this._session.setDocPrefs(this._doc, this._app.primaryFieldType,
|
return this._session.setDocPrefs(this._doc, this._app.primaryFieldType,
|
||||||
this._app.secondaryFieldType).then(function(status) {
|
this._app.secondaryFieldType).then(function(status) {
|
||||||
// save doc prefs in doc
|
// save doc prefs in doc
|
||||||
me._doc.setDocumentData(me._session.data.serializeXML());
|
me._doc.setDocumentData(me._session.data.serialize());
|
||||||
|
|
||||||
if(haveFields) {
|
if(haveFields) {
|
||||||
me._session.reload = true;
|
me._session.reload = true;
|
||||||
|
@ -1007,12 +1007,13 @@ Zotero.Integration.Document.prototype._getSession = Zotero.Promise.coroutine(fun
|
||||||
data.prefs.fieldType = "ReferenceMark";
|
data.prefs.fieldType = "ReferenceMark";
|
||||||
}
|
}
|
||||||
|
|
||||||
var warning = this._doc.displayAlert(Zotero.getString("integration.upgradeWarning"),
|
var warning = this._doc.displayAlert(Zotero.getString("integration.upgradeWarning", Zotero.clientName, '5.0'),
|
||||||
DIALOG_ICON_WARNING, DIALOG_BUTTONS_OK_CANCEL);
|
DIALOG_ICON_WARNING, DIALOG_BUTTONS_OK_CANCEL);
|
||||||
if(!warning) {
|
if(!warning) {
|
||||||
return Zotero.Promise.reject(new Zotero.Exception.UserCancelled("document upgrade"));
|
return Zotero.Promise.reject(new Zotero.Exception.UserCancelled("document upgrade"));
|
||||||
}
|
}
|
||||||
} else if(data.dataVersion > DATA_VERSION) {
|
// Don't throw for version 4(JSON) during the transition from 4.0 to 5.0
|
||||||
|
} else if((data.dataVersion > DATA_VERSION) && data.dataVersion != 4) {
|
||||||
return Zotero.Promise.reject(new Zotero.Exception.Alert("integration.error.newerDocumentVersion",
|
return Zotero.Promise.reject(new Zotero.Exception.Alert("integration.error.newerDocumentVersion",
|
||||||
[data.zoteroVersion, Zotero.version], "integration.error.title"));
|
[data.zoteroVersion, Zotero.version], "integration.error.title"));
|
||||||
}
|
}
|
||||||
|
@ -1046,7 +1047,7 @@ Zotero.Integration.Document.prototype._getSession = Zotero.Promise.coroutine(fun
|
||||||
}
|
}
|
||||||
return this._session.setDocPrefs(this._doc, this._app.primaryFieldType,
|
return this._session.setDocPrefs(this._doc, this._app.primaryFieldType,
|
||||||
this._app.secondaryFieldType).then(function(status) {
|
this._app.secondaryFieldType).then(function(status) {
|
||||||
me._doc.setDocumentData(me._session.data.serializeXML());
|
me._doc.setDocumentData(me._session.data.serialize());
|
||||||
me._session.reload = true;
|
me._session.reload = true;
|
||||||
return me._session;
|
return me._session;
|
||||||
});
|
});
|
||||||
|
@ -1259,7 +1260,7 @@ Zotero.Integration.Document.prototype.setDocPrefs = function() {
|
||||||
oldData = aOldData;
|
oldData = aOldData;
|
||||||
|
|
||||||
// Write document data to document
|
// Write document data to document
|
||||||
me._doc.setDocumentData(me._session.data.serializeXML());
|
me._doc.setDocumentData(me._session.data.serialize());
|
||||||
|
|
||||||
// If oldData is null, then there was no document data, so we don't need to update
|
// If oldData is null, then there was no document data, so we don't need to update
|
||||||
// fields
|
// fields
|
||||||
|
@ -1736,7 +1737,7 @@ Zotero.Integration.Fields.prototype._updateDocument = function* (forceCitations,
|
||||||
|
|
||||||
// set bibliographyStyleHasBeenSet parameter to prevent further changes
|
// set bibliographyStyleHasBeenSet parameter to prevent further changes
|
||||||
this._session.data.style.bibliographyStyleHasBeenSet = true;
|
this._session.data.style.bibliographyStyleHasBeenSet = true;
|
||||||
this._doc.setDocumentData(this._session.data.serializeXML());
|
this._doc.setDocumentData(this._session.data.serialize());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3080,9 +3081,20 @@ Zotero.Integration.DocumentData = function(string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializes document-specific data as XML
|
* Serializes document-specific data as JSON
|
||||||
*/
|
*/
|
||||||
Zotero.Integration.DocumentData.prototype.serializeXML = function() {
|
Zotero.Integration.DocumentData.prototype.serialize = function() {
|
||||||
|
// If we've retrieved data with version 4 (JSON), serialize back to JSON
|
||||||
|
if (this.dataVersion == 4) {
|
||||||
|
return JSON.stringify({
|
||||||
|
style: this.style,
|
||||||
|
prefs: this.prefs,
|
||||||
|
sessionID: this.sessionID,
|
||||||
|
zoteroVersion: Zotero.version,
|
||||||
|
dataVersion: 4
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Otherwise default to XML for now
|
||||||
var prefs = "";
|
var prefs = "";
|
||||||
for(var pref in this.prefs) {
|
for(var pref in this.prefs) {
|
||||||
prefs += `<pref name="${Zotero.Utilities.htmlSpecialChars(pref)}" `+
|
prefs += `<pref name="${Zotero.Utilities.htmlSpecialChars(pref)}" `+
|
||||||
|
@ -3136,7 +3148,14 @@ Zotero.Integration.DocumentData.prototype.unserializeXML = function(xmlData) {
|
||||||
* Unserializes document-specific data, either as XML or as the string form used previously
|
* Unserializes document-specific data, either as XML or as the string form used previously
|
||||||
*/
|
*/
|
||||||
Zotero.Integration.DocumentData.prototype.unserialize = function(input) {
|
Zotero.Integration.DocumentData.prototype.unserialize = function(input) {
|
||||||
if(input[0] == "<") {
|
try {
|
||||||
|
return Object.assign(this, JSON.parse(input))
|
||||||
|
} catch (e) {
|
||||||
|
if (!(e instanceof SyntaxError)) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (input[0] == "<") {
|
||||||
this.unserializeXML(input);
|
this.unserializeXML(input);
|
||||||
} else {
|
} else {
|
||||||
const splitRe = /(^|[^:]):(?!:)/;
|
const splitRe = /(^|[^:]):(?!:)/;
|
||||||
|
|
|
@ -832,7 +832,7 @@ integration.missingItem.single = The highlighted citation no longer exists in
|
||||||
integration.missingItem.multiple = Item %1$S in the highlighted citation no longer exists in your Zotero database. Do you want to select a substitute item?
|
integration.missingItem.multiple = Item %1$S in the highlighted citation no longer exists in your Zotero database. Do you want to select a substitute item?
|
||||||
integration.missingItem.description = Clicking "No" will delete the field codes for citations containing this item, preserving the citation text but deleting it from your bibliography.
|
integration.missingItem.description = Clicking "No" will delete the field codes for citations containing this item, preserving the citation text but deleting it from your bibliography.
|
||||||
integration.removeCodesWarning = Removing field codes will prevent Zotero from updating citations and bibliographies in this document. Are you sure you want to continue?
|
integration.removeCodesWarning = Removing field codes will prevent Zotero from updating citations and bibliographies in this document. Are you sure you want to continue?
|
||||||
integration.upgradeWarning = Your document must be permanently upgraded in order to work with Zotero 2.1 or later. It is recommended that you make a backup before proceeding. Are you sure you want to continue?
|
integration.upgradeWarning = Your document must be permanently upgraded in order to work with %S %S or later. It is recommended that you make a backup before proceeding. Are you sure you want to continue?
|
||||||
integration.error.newerDocumentVersion = Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
|
integration.error.newerDocumentVersion = Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document.
|
||||||
integration.corruptField = The Zotero field code corresponding to this citation, which tells Zotero which item in your library this citation represents, has been corrupted. Would you like to reselect the item?
|
integration.corruptField = The Zotero field code corresponding to this citation, which tells Zotero which item in your library this citation represents, has been corrupted. Would you like to reselect the item?
|
||||||
integration.corruptField.description = Clicking "No" will delete the field codes for citations containing this item, preserving the citation text but potentially deleting it from your bibliography.
|
integration.corruptField.description = Clicking "No" will delete the field codes for citations containing this item, preserving the citation text but potentially deleting it from your bibliography.
|
||||||
|
|
|
@ -255,7 +255,7 @@ describe("Zotero.Integration", function () {
|
||||||
data.style = {styleID, locale: 'en-US', hasBibliography: true, bibliographyStyleHasBeenSet: true};
|
data.style = {styleID, locale: 'en-US', hasBibliography: true, bibliographyStyleHasBeenSet: true};
|
||||||
data.sessionID = Zotero.Utilities.randomString(10);
|
data.sessionID = Zotero.Utilities.randomString(10);
|
||||||
Object.assign(data, options);
|
Object.assign(data, options);
|
||||||
applications[docID].getActiveDocument().setDocumentData(data.serializeXML());
|
applications[docID].getActiveDocument().setDocumentData(data.serialize());
|
||||||
}
|
}
|
||||||
|
|
||||||
function setDefaultIntegrationDocPrefs() {
|
function setDefaultIntegrationDocPrefs() {
|
||||||
|
@ -472,7 +472,7 @@ describe("Zotero.Integration", function () {
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("DocumentData", function() {
|
describe("DocumentData", function() {
|
||||||
it('should properly unserialize document data', function() {
|
it('should properly unserialize old XML document data', function() {
|
||||||
var serializedXMLData = "<data data-version=\"3\" zotero-version=\"5.0.SOURCE\"><session id=\"F0NFmZ32\"/><style id=\"http://www.zotero.org/styles/cell\" hasBibliography=\"1\" bibliographyStyleHasBeenSet=\"1\"/><prefs><pref name=\"fieldType\" value=\"ReferenceMark\"/><pref name=\"storeReferences\" value=\"true\"/><pref name=\"automaticJournalAbbreviations\" value=\"true\"/><pref name=\"noteType\" value=\"0\"/></prefs></data>";
|
var serializedXMLData = "<data data-version=\"3\" zotero-version=\"5.0.SOURCE\"><session id=\"F0NFmZ32\"/><style id=\"http://www.zotero.org/styles/cell\" hasBibliography=\"1\" bibliographyStyleHasBeenSet=\"1\"/><prefs><pref name=\"fieldType\" value=\"ReferenceMark\"/><pref name=\"storeReferences\" value=\"true\"/><pref name=\"automaticJournalAbbreviations\" value=\"true\"/><pref name=\"noteType\" value=\"0\"/></prefs></data>";
|
||||||
var data = new Zotero.Integration.DocumentData(serializedXMLData);
|
var data = new Zotero.Integration.DocumentData(serializedXMLData);
|
||||||
var expectedData = {
|
var expectedData = {
|
||||||
|
@ -496,7 +496,30 @@ describe("Zotero.Integration", function () {
|
||||||
assert.equal(JSON.stringify(data), JSON.stringify(expectedData));
|
assert.equal(JSON.stringify(data), JSON.stringify(expectedData));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should properly serialize document data', function() {
|
it('should properly unserialize JSON document data', function() {
|
||||||
|
var expectedData = JSON.stringify({
|
||||||
|
style: {
|
||||||
|
styleID: 'http://www.zotero.org/styles/cell',
|
||||||
|
locale: 'en-US',
|
||||||
|
hasBibliography: true,
|
||||||
|
bibliographyStyleHasBeenSet: true
|
||||||
|
},
|
||||||
|
prefs: {
|
||||||
|
fieldType: 'ReferenceMark',
|
||||||
|
storeReferences: true,
|
||||||
|
automaticJournalAbbreviations: false,
|
||||||
|
noteType: 0
|
||||||
|
},
|
||||||
|
sessionID: 'owl-sesh',
|
||||||
|
zoteroVersion: '5.0.SOURCE',
|
||||||
|
dataVersion: 4
|
||||||
|
});
|
||||||
|
var data = new Zotero.Integration.DocumentData(expectedData);
|
||||||
|
// Convert to JSON to remove functions from DocumentData object
|
||||||
|
assert.equal(JSON.stringify(data), expectedData);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should properly serialize document data to XML (data ver 3)', function() {
|
||||||
sinon.spy(Zotero, 'debug');
|
sinon.spy(Zotero, 'debug');
|
||||||
var data = new Zotero.Integration.DocumentData();
|
var data = new Zotero.Integration.DocumentData();
|
||||||
data.sessionID = "owl-sesh";
|
data.sessionID = "owl-sesh";
|
||||||
|
@ -515,8 +538,11 @@ describe("Zotero.Integration", function () {
|
||||||
automaticJournalAbbreviations: true
|
automaticJournalAbbreviations: true
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var serializedData = data.serialize();
|
||||||
|
// Make sure we serialized to XML here
|
||||||
|
assert.equal(serializedData[0], '<');
|
||||||
// Serialize and unserialize (above test makes sure unserialize works properly).
|
// Serialize and unserialize (above test makes sure unserialize works properly).
|
||||||
var processedData = new Zotero.Integration.DocumentData(data.serializeXML());
|
var processedData = new Zotero.Integration.DocumentData(serializedData);
|
||||||
|
|
||||||
// This isn't ideal, but currently how it works. Better serialization which properly retains types
|
// This isn't ideal, but currently how it works. Better serialization which properly retains types
|
||||||
// coming with official 5.0 release.
|
// coming with official 5.0 release.
|
||||||
|
@ -530,5 +556,34 @@ describe("Zotero.Integration", function () {
|
||||||
assert.isFalse(Zotero.debug.calledWith(sinon.match.string, 1));
|
assert.isFalse(Zotero.debug.calledWith(sinon.match.string, 1));
|
||||||
Zotero.debug.restore();
|
Zotero.debug.restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should properly serialize document data to JSON (data ver 4)', function() {
|
||||||
|
var data = new Zotero.Integration.DocumentData();
|
||||||
|
// data version 4 triggers serialization to JSON
|
||||||
|
// (e.g. when we've retrieved data from the doc and it was ver 4 already)
|
||||||
|
data.dataVersion = 4;
|
||||||
|
data.sessionID = "owl-sesh";
|
||||||
|
data.style = {
|
||||||
|
styleID: 'http://www.zotero.org/styles/cell',
|
||||||
|
locale: 'en-US',
|
||||||
|
hasBibliography: false,
|
||||||
|
bibliographyStyleHasBeenSet: true
|
||||||
|
};
|
||||||
|
data.prefs = {
|
||||||
|
noteType: 1,
|
||||||
|
fieldType: "Field",
|
||||||
|
storeReferences: true,
|
||||||
|
automaticJournalAbbreviations: true
|
||||||
|
};
|
||||||
|
|
||||||
|
// Serialize and unserialize (above tests makes sure unserialize works properly).
|
||||||
|
var processedData = new Zotero.Integration.DocumentData(data.serialize());
|
||||||
|
|
||||||
|
// Added in serialization routine
|
||||||
|
data.zoteroVersion = Zotero.version;
|
||||||
|
|
||||||
|
// Convert to JSON to remove functions from DocumentData objects
|
||||||
|
assert.deepEqual(JSON.parse(JSON.stringify(processedData)), JSON.parse(JSON.stringify(data)));
|
||||||
|
});
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user