From a5393ca0e525e53acd5e419dff586b8ae3da1379 Mon Sep 17 00:00:00 2001 From: Abe Jellinek Date: Thu, 25 Apr 2024 16:08:45 -0400 Subject: [PATCH] Merge: Keep external annotations on master, don't erase on other PDFWorker only re-imports external annotations when the file changes on disk. Keep annotation items corresponding to external annotations so that they don't disappear after the merge (and then come back when the file is edited). Tweaks behavior introduced in 2aa34a6. https://forums.zotero.org/discussion/113943/zotero-7-beta-merging-pdf-files-leaves-ghost-external-annotations --- chrome/content/zotero/xpcom/data/items.js | 10 ---- .../data/duplicatesMerge_annotated_2.pdf | Bin 26548 -> 31442 bytes .../data/duplicatesMerge_annotated_3.pdf | Bin 0 -> 26548 bytes test/tests/itemTest.js | 2 +- test/tests/itemsTest.js | 51 ++++++++++++++++++ 5 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 test/tests/data/duplicatesMerge_annotated_3.pdf diff --git a/chrome/content/zotero/xpcom/data/items.js b/chrome/content/zotero/xpcom/data/items.js index 98e2007f3f..e1e71ca915 100644 --- a/chrome/content/zotero/xpcom/data/items.js +++ b/chrome/content/zotero/xpcom/data/items.js @@ -959,7 +959,6 @@ Zotero.Items = function() { let annotations = fromItem.getAnnotations(includeTrashed); for (let annotation of annotations) { if (annotation.annotationIsExternal) { - await annotation.erase(); continue; } annotation.parentItemID = toItem.id; @@ -967,15 +966,6 @@ Zotero.Items = function() { } } - if (toItem.isFileAttachment()) { - let annotations = toItem.getAnnotations(includeTrashed); - for (let annotation of annotations) { - if (annotation.annotationIsExternal) { - await annotation.erase(); - } - } - } - // TODO: Other things as necessary }; diff --git a/test/tests/data/duplicatesMerge_annotated_2.pdf b/test/tests/data/duplicatesMerge_annotated_2.pdf index 4bba84e41582917fc93c147dc9ced10a94b43512..fab0d38d61a3d2ead27f3ca33f682fe59512a988 100644 GIT binary patch delta 1645 zcmZuyeM}Q)7*7`+*@-#~gk`w-iV*Ru_uhMVz1||t`Y9-2MTSU+p}^S|ORu(91}3DN z%Ql>1%ua!rXch!imZ^NWNjKb_(Pdf8hM*4q*au`A6LpD7bS`0g@AztfYnyxSckkW% zJip)b{Mz+{=H{5@LYGT+<)4jXv#3D#BEH5A2 zvBiNPfFKtjN<9@3g0D<0DJN7|2{vv7q!~B>)be^r^9Tp(SqW$s@eBou0BI5fWkNt% zrhYJDF#`GRg2XUE+5iK{?V%E>+Ajby!{c&$@lOI|o(dR!J`rE!3Z)W$p3`adJj(#2 z;Mo4M8+h3@n6jHU6#vq|pwPq;mkmIfij<1_LfZ z^httG3W7AVSW$r^Ao_sh7JyUP-YI!R-x`A47IK!^MUS#BDwWBN=cY0{TQt3dn9LuA z6?XDKnz2Lxn+31e;}iDa9POe%xFC>>GWEf=K)1&IR^I!E)RC#m2gRA$OCr1ef`1o#Kh3$A~_gns{>h-2{r|)z*I+g-z;M=a) zR?BdVzy8|&Weal$*RpLdA6~rj#DPne@Jp4hp&uL7_O~0r+g!?*>%Z|zcX!)yR(kIINMX^5D~qx|(DaTS>-{`(p)@2eIG+FRzBdw{c`mlyDegJ- z$K@xNR#SUM2HfMFgE=dtYhPXcJ#nz0f1T3kld?@24K3RpudYCh>Oab;TC1c@+wn*W z>KJbdQrHY+zax>slONSs$^*)%H~^VxHk+J50b3obzGcS6*v>B;4a5edi<&D_Ha3uu zSMvD1)l()kv!}rzZ{EEwtYaBHfXV@UfS_oA2=xl-bR0i(V-izZQVo^Gc*wY^#XOC7 zRu1Kc8X%5VvYCakES{4n%nTvYQ`lRhK?TE>Hy7i$Sr`p@9?FC(-Kw|hDB5gcY(_ma zQx?vOpiO5)(8AdukBlaR;uN_ec3^7akAU3n*(YGL#U2$9DlzpG&&Y>d%VTK@GBlBz JYTarh{s&W93;X~8 delta 9 Qcmccgm2t~?#tmE20UJOC7ytkO diff --git a/test/tests/data/duplicatesMerge_annotated_3.pdf b/test/tests/data/duplicatesMerge_annotated_3.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4bba84e41582917fc93c147dc9ced10a94b43512 GIT binary patch literal 26548 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 NfGH>_7V#ZS`7e%g(?kFO literal 0 HcmV?d00001 diff --git a/test/tests/itemTest.js b/test/tests/itemTest.js index 985d70c331..7dfa4a84f8 100644 --- a/test/tests/itemTest.js +++ b/test/tests/itemTest.js @@ -1626,7 +1626,7 @@ describe("Zotero.Item", function () { }); it("should recognize a strikeout annotation", async function () { - let attachment = await importFileAttachment('duplicatesMerge_annotated_2.pdf'); + let attachment = await importFileAttachment('duplicatesMerge_annotated_3.pdf'); assert.isTrue(await attachment.hasEmbeddedAnnotations()); }); diff --git a/test/tests/itemsTest.js b/test/tests/itemsTest.js index d0ad0e3179..86997289d8 100644 --- a/test/tests/itemsTest.js +++ b/test/tests/itemsTest.js @@ -934,6 +934,16 @@ describe("Zotero.Items", function () { let item2 = item1.clone(); await item2.saveTx(); let attachment2 = await importFileAttachment('duplicatesMerge_annotated_2.pdf', { parentID: item2.id }); + + // Import external annotations non-destructively + await Zotero.PDFWorker.import(attachment1.id, true); + await Zotero.PDFWorker.import(attachment2.id, true); + + assert.lengthOf(attachment1.getAnnotations(), 1); + assert.lengthOf(attachment2.getAnnotations(), 1); + assert.isTrue(attachment1.getAnnotations()[0].annotationIsExternal); + assert.isTrue(attachment2.getAnnotations()[0].annotationIsExternal); + assert.isTrue(await attachment2.hasEmbeddedAnnotations()); // Unsupported attachment remains embedded await Zotero.Items.merge(item1, [item2]); @@ -943,6 +953,47 @@ describe("Zotero.Items", function () { assert.isTrue(item2.deleted); assert.isFalse(attachment2.deleted); assert.equal(attachment2.parentItemID, item1.id); + + assert.lengthOf(attachment1.getAnnotations(), 1); + assert.lengthOf(attachment2.getAnnotations(), 1); + assert.isTrue(attachment1.getAnnotations()[0].annotationIsExternal); + assert.isTrue(attachment2.getAnnotations()[0].annotationIsExternal); + }); + + it("should merge imported annotations into PDF with remaining unimported annotations", async function () { + let item1 = await createDataObject('item', { setTitle: true }); + let attachment1 = await importFileAttachment('duplicatesMerge_annotated_1.pdf', { parentID: item1.id }); + + let item2 = item1.clone(); + await item2.saveTx(); + let attachment2 = await importFileAttachment('duplicatesMerge_annotated_2.pdf', { parentID: item2.id }); + + // Import external annotations non-destructively + await Zotero.PDFWorker.import(attachment1.id, true); + await Zotero.PDFWorker.import(attachment2.id, true); + + assert.isTrue(attachment1.getAnnotations()[0].annotationIsExternal); + assert.isTrue(attachment2.getAnnotations()[0].annotationIsExternal); + + // Import external annotations *destructively* + await Zotero.PDFWorker.import(attachment1.id, true, '', true); + await Zotero.PDFWorker.import(attachment2.id, true, '', true); + + assert.lengthOf(attachment1.getAnnotations(), 1); + assert.lengthOf(attachment2.getAnnotations(), 1); + assert.isFalse(attachment1.getAnnotations()[0].annotationIsExternal); + assert.isFalse(attachment2.getAnnotations()[0].annotationIsExternal); + assert.isTrue(await attachment2.hasEmbeddedAnnotations()); // Unsupported annotation remains embedded + + await Zotero.Items.merge(item1, [item2]); + + assert.isTrue(attachment1.deleted); + assert.isFalse(attachment2.deleted); + + assert.lengthOf(attachment1.getAnnotations(), 0); + assert.lengthOf(attachment2.getAnnotations(), 2); + assert.isFalse(attachment2.getAnnotations()[0].annotationIsExternal); + assert.isFalse(attachment2.getAnnotations()[1].annotationIsExternal); }); it("should merge a non-master PDF without embedded annotations into a master PDF with embedded annotations", async function () {