EditorInstance.createNoteFromAnnotations(): Handle multiple attachments
This commit is contained in:
parent
ef0811bd4c
commit
6646be66d0
2 changed files with 127 additions and 3 deletions
|
@ -1258,8 +1258,57 @@ class EditorInstance {
|
||||||
html += '\n';
|
html += '\n';
|
||||||
|
|
||||||
await editorInstance.importImages(jsonAnnotations);
|
await editorInstance.importImages(jsonAnnotations);
|
||||||
let { html: serializedHTML, citationItems } = Zotero.EditorInstanceUtilities.serializeAnnotations(jsonAnnotations, true);
|
|
||||||
html += serializedHTML;
|
let multipleParentParent = false;
|
||||||
|
let lastParentParentID;
|
||||||
|
let lastParentID;
|
||||||
|
// Group annotations per attachment
|
||||||
|
let groups = [];
|
||||||
|
for (let i = 0; i < annotations.length; i++) {
|
||||||
|
let annotation = annotations[i];
|
||||||
|
let jsonAnnotation = jsonAnnotations[i];
|
||||||
|
let parentParentID = annotation.parentItem.parentID;
|
||||||
|
let parentID = annotation.parentID;
|
||||||
|
if (groups.length) {
|
||||||
|
if (parentParentID !== lastParentParentID) {
|
||||||
|
// Multiple top level regular items detected, allow including their titles
|
||||||
|
multipleParentParent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!groups.length || parentID !== lastParentID) {
|
||||||
|
groups.push({
|
||||||
|
parentTitle: annotation.parentItem.getDisplayTitle(),
|
||||||
|
parentParentID,
|
||||||
|
parentParentTitle: annotation.parentItem.parentItem && annotation.parentItem.parentItem.getDisplayTitle(),
|
||||||
|
jsonAnnotations: [jsonAnnotation]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let group = groups[groups.length - 1];
|
||||||
|
group.jsonAnnotations.push(jsonAnnotation);
|
||||||
|
}
|
||||||
|
lastParentParentID = parentParentID;
|
||||||
|
lastParentID = parentID;
|
||||||
|
}
|
||||||
|
let citationItems = [];
|
||||||
|
lastParentParentID = null;
|
||||||
|
for (let group of groups) {
|
||||||
|
if (multipleParentParent && group.parentParentTitle && lastParentParentID !== group.parentParentID) {
|
||||||
|
html += `<h2>${group.parentParentTitle}</h2>\n`;
|
||||||
|
}
|
||||||
|
lastParentParentID = group.parentParentID;
|
||||||
|
// If attachment doesn't have a parent or there are more attachments with the same parent, show attachment title
|
||||||
|
if (!group.parentParentID || groups.filter(x => x.parentParentID === group.parentParentID).length > 1) {
|
||||||
|
html += `<h3>${group.parentTitle}</h3>\n`;
|
||||||
|
}
|
||||||
|
let { html: _html, citationItems: _citationItems } = Zotero.EditorInstanceUtilities.serializeAnnotations(group.jsonAnnotations, true);
|
||||||
|
html += _html + '\n';
|
||||||
|
for (let _citationItem of _citationItems) {
|
||||||
|
if (!citationItems.find(item => item.uris.some(uri => _citationItem.uris.includes(uri)))) {
|
||||||
|
citationItems.push(_citationItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
citationItems = encodeURIComponent(JSON.stringify(citationItems));
|
citationItems = encodeURIComponent(JSON.stringify(citationItems));
|
||||||
// Note: Update schema version only if using new features
|
// Note: Update schema version only if using new features
|
||||||
let schemaVersion = 8;
|
let schemaVersion = 8;
|
||||||
|
|
|
@ -403,4 +403,79 @@ describe("Zotero.Annotations", function() {
|
||||||
await Zotero.Items.erase(splitAnnotations.map(x => x.id));
|
await Zotero.Items.erase(splitAnnotations.map(x => x.id));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
})
|
});
|
||||||
|
|
||||||
|
describe("Create a note from annotations from multiple items and attachments", function () {
|
||||||
|
it("should create a note from single PDF file containing multiple annotations", async function () {
|
||||||
|
let annotations = [];
|
||||||
|
let attachment = await importPDFAttachment();
|
||||||
|
let annotation1 = await createAnnotation('highlight', attachment);
|
||||||
|
annotations.push(annotation1);
|
||||||
|
let annotation2 = await createAnnotation('highlight', attachment);
|
||||||
|
annotations.push(annotation2);
|
||||||
|
let note = await Zotero.EditorInstance.createNoteFromAnnotations(annotations, null);
|
||||||
|
assert.equal(note.note.split('test.pdf').length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation1.annotationText).length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation2.annotationText).length - 1, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should create a note from multiple PDF files containing single annotation", async function () {
|
||||||
|
let annotations = [];
|
||||||
|
let item = await createDataObject('item', { setTitle: true });
|
||||||
|
let attachment1 = await importPDFAttachment(item);
|
||||||
|
let attachment2 = await importPDFAttachment(item);
|
||||||
|
let annotation1 = await createAnnotation('highlight', attachment1);
|
||||||
|
annotations.push(annotation1);
|
||||||
|
let annotation2 = await createAnnotation('highlight', attachment2);
|
||||||
|
annotations.push(annotation2);
|
||||||
|
let note = await Zotero.EditorInstance.createNoteFromAnnotations(annotations, null);
|
||||||
|
assert.equal(note.note.split('test.pdf').length - 1, 2);
|
||||||
|
assert.equal(note.note.split('>' + item.getField('title') + '<').length - 1, 0);
|
||||||
|
assert.equal(note.note.split(annotation1.annotationText).length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation2.annotationText).length - 1, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should create a note from multiple parent items containing single PDF file with single annotation", async function () {
|
||||||
|
let annotations = [];
|
||||||
|
let item1 = await createDataObject('item', { setTitle: true });
|
||||||
|
let item2 = await createDataObject('item', { setTitle: true });
|
||||||
|
let attachment1 = await importPDFAttachment(item1);
|
||||||
|
let attachment2 = await importPDFAttachment(item2);
|
||||||
|
let annotation1 = await createAnnotation('highlight', attachment1);
|
||||||
|
annotations.push(annotation1);
|
||||||
|
let annotation2 = await createAnnotation('highlight', attachment2);
|
||||||
|
annotations.push(annotation2);
|
||||||
|
let note = await Zotero.EditorInstance.createNoteFromAnnotations(annotations, null);
|
||||||
|
assert.equal(note.note.split('test.pdf').length - 1, 0);
|
||||||
|
assert.equal(note.note.split('>' + item1.getField('title') + '<').length - 1, 1);
|
||||||
|
assert.equal(note.note.split('>' + item2.getField('title') + '<').length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation1.annotationText).length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation2.annotationText).length - 1, 1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should create a note from multiple parent items containing multiple PDF files with multiple annotations", async function () {
|
||||||
|
let annotations = [];
|
||||||
|
let item1 = await createDataObject('item', { setTitle: true });
|
||||||
|
let item2 = await createDataObject('item', { setTitle: true });
|
||||||
|
let attachment1 = await importPDFAttachment(item1);
|
||||||
|
let attachment2 = await importPDFAttachment(item2);
|
||||||
|
let attachment3 = await importPDFAttachment(item2);
|
||||||
|
let annotation1 = await createAnnotation('highlight', attachment1);
|
||||||
|
annotations.push(annotation1);
|
||||||
|
let annotation2 = await createAnnotation('highlight', attachment2);
|
||||||
|
annotations.push(annotation2);
|
||||||
|
let annotation3 = await createAnnotation('highlight', attachment3);
|
||||||
|
annotations.push(annotation3);
|
||||||
|
let annotation4 = await createAnnotation('highlight', attachment3);
|
||||||
|
annotations.push(annotation4);
|
||||||
|
let note = await Zotero.EditorInstance.createNoteFromAnnotations(annotations, null);
|
||||||
|
Zotero.debug(note.note);
|
||||||
|
assert.equal(note.note.split('test.pdf').length - 1, 2);
|
||||||
|
assert.equal(note.note.split('>' + item1.getField('title') + '<').length - 1, 1);
|
||||||
|
assert.equal(note.note.split('>' + item2.getField('title') + '<').length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation1.annotationText).length - 1, 1);
|
||||||
|
assert.equal(note.note.split(annotation2.annotationText).length - 1, 1);
|
||||||
|
// Check item URIs count
|
||||||
|
assert.equal(note.note.split('zotero.org').length - 1, 16);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
Loading…
Add table
Reference in a new issue