前言
首先要批判一下谷歌学术,同一个会议/期刊的文章,会议名称都能不统一,直接导入endNote再插入,被老板说了好久,直接舍弃endNote了。
现在使用zotero导入后,发现zotero可以使用js修改,虽然这个软件功能不如endnote多,但是支持了js就很舒服。
虽然js没怎么用过,不过语法大差不差,有错误的话欢迎指正。
修改文献会议大小写的代码
官方api写的其实很详细,自己需要定制化的话请详见组件名称和官方示例
下面这串代码功能主要是对 文献的会议名称进行更改,全部改成首字母大写,一些专有名词保持不变,删除一些缩写
zoteroPane = Zotero.getActiveZoteroPane();
items = zoteroPane.getSelectedItems();
//计数替换条目个数
var cnt = 0;
//缩写,需要全大写
var skip_set_abbreviation = new Set(['IEEE', 'CVF', 'CVPR', 'ECCV', 'IEEE/CVF'])
//副词on,of等
var skip_set_adverb = new Set(['on', 'of', 'and', 'the'])
//统一格式,有些会议会加简称,格式形如“(ECCV),(CVPR)”,删除掉这些简称,统一会议名称
var delete_set = new Set(['(ECCV)'])
var ans = ""
for (var i = 0; i < items.length; i++) {
var item = items[i]
var isProceed = true
//需要修改的,一般是会议或者期刊
var proceed = item.getField("proceedingsTitle");
if (proceed === "") {
isProceed = false
proceed = item.getField("publicationTitle")
}
let words = proceed.split(" ");
//如果是arXiv的话不做修改
if (words[0].toLowerCase() === 'arxiv') {
var logging = item.getField("title") + "因为是arxiv的文章,未做修改\n\n"
// console.log(item.getField("title"))
ans += logging
continue
}
for (let i = 0; i < words.length; i++) {
//遇到不需要改的就跳过
if (skip_set_abbreviation.has(words[i]) || skip_set_adverb.has(words[i])) {
continue
}
//删掉不要的会议缩写
if (delete_set.has(words[i])) {
words[i] = ""
continue
}
words[i] = words[i].replace(words[i][0], words[i][0].toUpperCase())
}
//将修改后的单词拼接起来
let s = words.join(" ");
//去除前后多余的空格
s = s.trim();
ans += s + "\n\n"
// console.log(s)d
//写到文件中
if (isProceed) {
item.setField("proceedingsTitle", s);
} else {
item.setField("publicationTitle", s);
}
cnt++;
await item.saveTx();
}
ans = "修改了" + cnt + "份文献的会议/期刊名称\n" + ans
return ans
编辑后的效果如下,并且已经写到了文件中去
将文献名称修改大小写
其实zotero本身也有首字母大写的功能,不过不能跳过一些缩写,也不能一键操作,下面这串代码主要是对文献标题进行首字母大写
zoteroPane = Zotero.getActiveZoteroPane();
items = zoteroPane.getSelectedItems();
var cnt = 0;
var ans = ""
//需要全部大写的
var up = new Set(['smpl', '3d', '2d'])
//一些奇怪的缩写或者专有名词在这写
var map = new Map([["abcd...", "aBcd..."]])
for (var i = 0; i < items.length; i++) {
var currTitle = items[i].getField("title");
//先统一格式
currTitle = currTitle.toLowerCase()
for (var key of up) {
//zotero的js不支持replaceAll,出此下策
while (true) {
var temp = currTitle.replace(key, key.toUpperCase());
if (temp === currTitle) break
currTitle = temp
}
}
/*
//修改一些特殊的专有名词,需要用的时候将"/ *"和"* /"删除掉
for (var key of map) {
//zotero的js不支持replaceAll,出此下策
while (true) {
var temp = currTitle.replace(key, map.get(key));
if (temp === currTitle) break
currTitle = temp
}
}
*/
//一般题目全都是小写,除了首字母和冒号后的首字母
var split = currTitle.split(":");
for (var j = 0; j < split.length; j++) {
currWord = split[j]
var idx = 0
while (idx < currWord.length && currWord[idx] === ' ') idx++
split[j] = currWord.replace(currWord[idx], currWord[idx].toUpperCase())
}
var res = split.join(":");
ans += res + "\n\n"
items[i].setField("title", res);
cnt++;
await items[i].saveTx();
}
ans = "修改了" + cnt + "份文献的名称\n" + ans
return ans
运行效果如下所示
注意
只对选中的文献进行修改,记得做好备份,万一修改错误不负责的!