northword / zotero-format-metadata

Linter for Zotero. A plugin for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item languages, etc; detect duplicate items.
GNU Affero General Public License v3.0
390 stars 6 forks source link

[Feature Request] 改进“Duplicates found”的功能 #195

Closed Geo123abc closed 1 month ago

Geo123abc commented 2 months ago

Describe the feature

一直困于zotero添加了重复条目如何处理,现在Linter插件给了很好的解决方案。

但是“Duplicates found”的功能可以改进一下

一般情况下我们添加新条目是因为在目前collection中看不到这个条目,所以推荐以下几个选项

  1. 操作1:添加已有的条目到当前 collection,并删除新添加的条目
  2. 操作2:添加已有的条目到当前 collection
  3. 操作3:定位Locate
  4. 操作4:go to merge
  5. 操作5:.......

可以参考一下这个插件的逻辑

第91期 插件教程 zotero批量管理重复条目【插件】

Additional context

No response

northword commented 2 months ago

我个人其实更倾向于检测到重复条目后仅提醒,进入“重复条目”窗格,手动逐个检查新旧条目的字段(尤其是“年期卷页”,)然后手动合并。

对于你说的,你可以更详细解释一下吗:

对于操作 1、2 ,似乎合并条目就已经实现了:合并后的条目会同时存在于新旧两个条目所在的分类。

我不太理解这两个操作的区别,操作 2 是指“保留两者”吗? —— 如果是的话,这与 Linter 的理念相悖,因为 Linter 不允许存在重复条目 —— 重复条目给创建参考文献表造成了很大的干扰。

对于操作 3,我不是很清楚你所说的 Locate 是什么,是指年期卷页这类定位符?还是指 Zotero 检索(Locate / Lookup)引擎? 以及这个的作用是什么?


另外,这个功能做出来后不久 zoplicate 就发布了,并且比 Linter 的要完善不少。考虑到不要重复造轮子,Linter 的重复条目检测在更多操作(如自动保留新/旧等)这里就没有做更多改进,只保留了基本的检测提醒。因此你可以关闭 Linter 的重复条目检测,然后启用 Zoplicate 来实现重复条目的高级处理。

CC @ChenglongMa 也许你对这位同学的想法感兴趣吗?

ChenglongMa commented 2 months ago

感谢反馈,有些功能zoplicate已经实现了,不过我很愿意继续改进它。 谢谢!

Geo123abc commented 2 months ago

我有注意到zoplicate这个插件,第91期 插件教程 zotero批量管理重复条目,这个链接就是zoplicate插件使用效果,但是我zotero安装了太多的插件,感觉系统有点吃不消,后来发现linter有这个功能,并且还可以。之前也在徘徊要把这个改进发到 zoplicate issue 还是 linter issue,在这大家都可以讨论一下。

下面这些仅仅是我个人观点,

一般情况下我们添加新条目是因为在当前collection中看不到这个条目(就是不知道zotero中有这个条目),所以才添加了这个重复条目,如果我们知道已经有了这个条目,并且已经定位到了,大概率应该不会再添加这个条目了。曾经一度我还想着在浏览器页面端显示当前文献是否已经存在在zotero中,但是后来被否了(性能消耗太大,记不清在哪提的了),所以:

  1. 操作2是为了在当前collection中能直接看到旧版本的条目,下一步用户可以在当前collection中手动合并两个重复的条目,或者直接删除新加的重复条目;
  2. 操作1是既能达到操作2的目的,也能省去到“重复条目”窗格合并的操作,减少用户跳转到其他窗格,保持注意力。另外,如果zotero库中条目太多,在“重复条目”窗格需要一点时间加载,并且合并重复项会导致条目的元信息增多(见附注)
  3. 操作3是直接跳转到库中已有的条目,和直接打开zotero://select/items/1_R9GF3EQR这个链接的效果比较像,不过更推荐下面代码:
var item = await Zotero.Items.getByLibraryAndKeyAsync(Zotero.Libraries.userLibraryID,"R9GF3EQR");
Zotero.getActiveZoteroPane().selectItem(item.id); //如果当前collection中有`R9GF3EQR`,则直接定位到这个条目,否则在“zotero-my library”中定位这个条目

附注:“重复条目”窗格合并重复项会导致旧条目的元信息增多

var zoteroPane = Zotero.getActiveZoteroPane();
var items = zoteroPane.getSelectedItems();
for (let item of items) {
   return item;
}

一个条目在和另一个条目合并前、合并后,分别执行上述代码,查看“relations”字段,可以发现是有变化的,而我们添加一个条目,很多时候是看不到我们的zotero库已经存在这个条目,如果往“relations”字段添加了信息之后,然后删除新添加的重复条目,长此以往,会造成zotero微弱的、不必要的膨胀。

dc:replaces 是 Dublin Core Metadata Initiative (DCMI) 元数据术语集中的一个元素,它用来指示一个资源取代或替代了另一个资源。在资源的元数据描述中使用 dc:replaces 表示当前的资源是之前资源的新版本或更新形式,或者以某种方式取代了那个资源。

例如,如果有一篇文章的新版本发布了,这个新版本可以在其元数据中使用 dc:replaces 来指出它替代了之前的旧版本。通常,这个元素会包含一个指向被替代资源的标识符,如一个URI(统一资源标识符)。

在实际应用中,dc:replaces 可以帮助用户了解资源之间的版本历史和更新关系,从而更好地管理和访问这些资源。例如:

也就是说合并之后,会在新生成的条目的元信息的“relations”字段写入信息,长久下来,会导致数据库的无关信息增多(我认为保留dc:replaces应该是一种能避免,就避免的操作)

northword commented 2 months ago

曾经一度我还想着在浏览器页面端显示当前文献是否已经存在在zotero中,但是后来被否了(性能消耗太大,记不清在哪提的了)

https://github.com/northword/zotero-format-metadata/issues/74 大约是这里面提到的三个链接。

操作2是为了在当前collection中能直接看到旧版本的条目,下一步用户可以在当前collection中手动合并两个重复的条目,或者直接删除新加的重复条目;

有两个问题想要讨论:

  1. 如果当前添加的条目,文库存在多个与其重复项,如何处理打开 collection 和合并?
  2. 如果文库已有的条目存在于多个 collection,打开哪一个?

另外,跳转到“重复条目”窗格后,按住 Ctrl 并点击某条目,可以高亮其所在行,可以对比字段信息,对比完成后可以选择合并/删除,似乎可以实现你的需求,并且操作步数是接近的:

graph TD;
    弹窗 --> |流程1|定位旧条目;
    定位旧条目 -->|字段不需要修改| 选择操作1或2;
    定位旧条目 -->|字段需要修改| GoToMerge;
    GoToMerge --> 查看新旧条目;
    查看新旧条目 --> 选择合并;
    选择合并 --> 结束;
    选择操作1或2 --> 结束;

    弹窗 --> |流程2|GoToMerge2;
    GoToMerge2 --> 查看新旧条目2;
    查看新旧条目2 --> 合并2;
    查看新旧条目2 --> 删除;
    删除 --> 添加分类;
    合并2 --> 结束;
    添加分类 --> 结束;
Geo123abc commented 2 months ago
  1. 如果当前添加的条目,文库存在多个与其重复项,如何处理打开 collection 和合并?

这个确实是我没有想到的,因为我现在的zotero库已经经历过查重维护了,也就是目前点击“重复条目”窗格,不会有重复的条目。不过,如果“文库存在多个与其重复项”,那就把这些条目到添加到当前collection中。

至于“操作3”,这个定位是在当前collection中定位,如果当前collection中没有这个条目,那么会自动跳转到my library 中,不涉及到选择其它的collection问题,但是具体选择哪个重复的旧条目,我认为可以生成多行,每一行都有三个操作,大致是这样子

重复条目1(是一个库中已有的旧条目) 操作1 操作2 操作3 重复条目2(是一个库中已有的旧条目) 操作1 操作2 操作3 重复条目3(是一个库中已有的旧条目) 操作1 操作2 操作3 ......

问题2 也是如上,在定位、跳转collection的时候,只涉及当前collectionmy library这两个collection的问题,不涉及到其它collection的问题,也就是说操作3的点击事件是:

var itemkey = 重复条目N的itemkey;
var item = await Zotero.Items.getByLibraryAndKeyAsync(Zotero.Libraries.userLibraryID,itemkey);
Zotero.getActiveZoteroPane().selectItem(item.id); //效果是:如果当前collection中有`R9GF3EQR`,则直接定位到这个条目,否则在“zotero-my library”中定位这个条目

你可以再run javascript中运行上述代码,看一下效果

其实提出这个issue的目的是,尽量不跳转到“重复条目”窗格,减少打断当前工作的事件。

northword commented 2 months ago

我觉得这个功能可能加在 zoplicate 里可能更好一些,因为他是一个专门针对重复条目的插件,并且我近期比较忙,没有太多精力去实现插件,希望你可以理解。

@ChenglongMa 不知道你是否有兴趣在 zoplicate 里实现这个功能呢?

ChenglongMa commented 2 months ago

好的,我这两天看一看 😊

ChenglongMa commented 2 months ago

您好,为了不打扰 northword,我在 zoplicate 重新开了一个 Discussion#65,欢迎移步讨论。

谢谢!