464 lines
12 KiB
JavaScript
464 lines
12 KiB
JavaScript
{
|
|
"translatorID": "881f60f2-0802-411a-9228-ce5f47b64c7d",
|
|
"label": "Refer/BibIX",
|
|
"creator": "Simon Kornblith",
|
|
"target": "txt",
|
|
"minVersion": "2.1",
|
|
"maxVersion": "",
|
|
"priority": 100,
|
|
"displayOptions": {
|
|
"exportCharset": "UTF-8"
|
|
},
|
|
"inRepository": true,
|
|
"translatorType": 3,
|
|
"lastUpdated": "2023-10-27 09:03:42"
|
|
}
|
|
|
|
function detectImport() {
|
|
var lineRe = /%[A-Z0-9*$] .+/;
|
|
var line;
|
|
var matched = 0;
|
|
while ((line = Zotero.read()) !== false) {
|
|
line = line.replace(/^\s+/, "");
|
|
if (line != "") {
|
|
if (lineRe.test(line)) {
|
|
matched++;
|
|
if (matched == 2) {
|
|
// threshold is two lines
|
|
return true;
|
|
}
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
var fieldMap = {
|
|
T: "title",
|
|
S: "series",
|
|
V: "volume",
|
|
N: "issue",
|
|
C: "place",
|
|
I: "publisher",
|
|
R: "type",
|
|
P: "pages",
|
|
W: "archiveLocation",
|
|
"*": "rights",
|
|
"@": "ISBN",
|
|
L: "callNumber",
|
|
M: "accessionNumber",
|
|
U: "url",
|
|
7: "edition",
|
|
X: "abstractNote",
|
|
G: "language"
|
|
};
|
|
|
|
var inputFieldMap = {
|
|
J: "publicationTitle",
|
|
B: "publicationTitle",
|
|
9: "type"
|
|
};
|
|
|
|
// TODO: figure out if these are the best types for personal communication
|
|
var typeMap = {
|
|
book: "Book",
|
|
bookSection: "Book Section",
|
|
journalArticle: "Journal Article",
|
|
magazineArticle: "Magazine Article",
|
|
newspaperArticle: "Newspaper Article",
|
|
thesis: "Thesis",
|
|
letter: "Personal Communication",
|
|
manuscript: "Unpublished Work",
|
|
interview: "Personal Communication",
|
|
film: "Film or Broadcast",
|
|
artwork: "Artwork",
|
|
webpage: "Web Page",
|
|
report: "Report",
|
|
bill: "Bill",
|
|
case: "Case",
|
|
hearing: "Hearing",
|
|
patent: "Patent",
|
|
statute: "Statute",
|
|
email: "Personal Communication",
|
|
map: "Map",
|
|
blogPost: "Web Page",
|
|
instantMessage: "Personal Communication",
|
|
forumPost: "Web Page",
|
|
audioRecording: "Audiovisual Material",
|
|
presentation: "Report",
|
|
videoRecording: "Audiovisual Material",
|
|
tvBroadcast: "Film or Broadcast",
|
|
radioBroadcast: "Film or Broadcast",
|
|
podcast: "Audiovisual Material",
|
|
computerProgram: "Computer Program",
|
|
conferencePaper: "Conference Paper",
|
|
document: "Generic",
|
|
encyclopediaArticle: "Encyclopedia",
|
|
dictionaryEntry: "Dictionary"
|
|
};
|
|
|
|
// supplements outputTypeMap for importing
|
|
// TODO: BILL, CASE, COMP, CONF, DATA, HEAR, MUSIC, PAT, SOUND, STAT
|
|
var inputTypeMap = {
|
|
"Ancient Text": "book",
|
|
Audio: "audioRecording",
|
|
"Audiovisual Material": "videoRecording",
|
|
Generic: "book",
|
|
"Chart or Table": "artwork",
|
|
"Classical Work": "book",
|
|
"Conference Proceedings": "conferencePaper",
|
|
"Conference Paper": "conferencePaper",
|
|
"Edited Book": "book",
|
|
"Electronic Article": "journalArticle",
|
|
"Electronic Book": "book",
|
|
Equation: "artwork",
|
|
Figure: "artwork",
|
|
"Government Document": "document",
|
|
Grant: "document",
|
|
"Legal Rule or Regulation": "statute",
|
|
"Online Database": "webpage",
|
|
"Online Multimedia": "webpage",
|
|
"Electronic Source": "webpage"
|
|
};
|
|
|
|
function processTag(item, tag, value) {
|
|
value = Zotero.Utilities.trim(value);
|
|
if (fieldMap[tag]) {
|
|
if (item[fieldMap[tag]]) {
|
|
item[fieldMap[tag]] += ", " + value;
|
|
}
|
|
else {
|
|
item[fieldMap[tag]] = value;
|
|
}
|
|
}
|
|
else if (inputFieldMap[tag]) {
|
|
item[inputFieldMap[tag]] = value;
|
|
}
|
|
else if (tag == "0") {
|
|
if (inputTypeMap[value]) { // first check inputTypeMap
|
|
item.itemType = inputTypeMap[value];
|
|
}
|
|
else { // then check typeMap
|
|
for (var i in typeMap) {
|
|
if (value == typeMap[i]) {
|
|
item.itemType = i;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (tag == "A" || tag == "E" || tag == "Y") {
|
|
var type;
|
|
if (tag == "A") {
|
|
type = "author";
|
|
}
|
|
else if (tag == "E") {
|
|
type = "editor";
|
|
}
|
|
else if (tag == "Y") {
|
|
type = "translator";
|
|
}
|
|
|
|
item.creators.push(Zotero.Utilities.cleanAuthor(value, type, value.includes(",")));
|
|
}
|
|
else if (tag == "Q") {
|
|
item.creators.push({ creatorType: "author", lastName: value, fieldMode: true });
|
|
}
|
|
else if (tag == "H" || tag == "O") {
|
|
if (!item.extra) item.extra = '';
|
|
else item.extra += "\n";
|
|
item.extra += value;
|
|
}
|
|
else if (tag == "Z") {
|
|
item.notes.push({ note: value });
|
|
}
|
|
else if (tag == "D") {
|
|
if (item.date) {
|
|
if (!item.date.includes(value)) {
|
|
item.date += " " + value;
|
|
}
|
|
}
|
|
else {
|
|
item.date = value;
|
|
}
|
|
}
|
|
else if (tag == "8") {
|
|
if (item.date) {
|
|
if (!value.includes(item.date)) {
|
|
item.date += " " + value;
|
|
}
|
|
}
|
|
else {
|
|
item.date = value;
|
|
}
|
|
}
|
|
else if (tag == "K") {
|
|
if (!item.tags || item.tags.length == 0) {
|
|
item.tags = [];
|
|
}
|
|
item.tags.push(...value.split("\n"));
|
|
}
|
|
}
|
|
|
|
function doImport() {
|
|
var line = true;
|
|
var tag = data = false;
|
|
do { // first valid line is type
|
|
if (line !== true) Zotero.debug("ignoring " + line);
|
|
line = Zotero.read();
|
|
line = line.replace(/^\s+/, "");
|
|
} while (line !== false && line[0] != "%");
|
|
|
|
// default to creating a book if no %0 tag is eventually found
|
|
var item = new Zotero.Item(inputTypeMap.Generic);
|
|
|
|
tag = line[1];
|
|
var data = line.substr(3);
|
|
while ((line = Zotero.read()) !== false) { // until EOF
|
|
line = line.replace(/^\s+/, "");
|
|
if (!line) {
|
|
if (tag) {
|
|
processTag(item, tag, data);
|
|
// unset info
|
|
tag = data = false;
|
|
// new item
|
|
item.complete();
|
|
item = new Zotero.Item(inputTypeMap.Generic);
|
|
}
|
|
}
|
|
else if (line[0] == "%" && line[2] == " ") {
|
|
// if this line is a tag, take a look at the previous line to map
|
|
// its tag
|
|
if (tag) {
|
|
processTag(item, tag, data);
|
|
}
|
|
|
|
// then fetch the tag and data from this line
|
|
tag = line[1];
|
|
data = line.substr(3);
|
|
}
|
|
else if (tag) {
|
|
// otherwise, assume this is data from the previous line continued
|
|
data += "\n" + line;
|
|
}
|
|
}
|
|
|
|
if (tag) { // save any unprocessed tags
|
|
processTag(item, tag, data);
|
|
item.complete();
|
|
}
|
|
}
|
|
|
|
function addTag(tag, value) {
|
|
if (value) {
|
|
Zotero.write("%" + tag + " " + value + "\r\n");
|
|
}
|
|
}
|
|
|
|
function doExport() {
|
|
var item;
|
|
while (item = Zotero.nextItem()) { // eslint-disable-line no-cond-assign
|
|
// can't store independent notes in RIS
|
|
if (item.itemType == "note" || item.itemType == "attachment") {
|
|
continue;
|
|
}
|
|
|
|
// type
|
|
addTag("0", typeMap[item.itemType] ? typeMap[item.itemType] : "Generic");
|
|
|
|
// use field map
|
|
for (let j in fieldMap) {
|
|
if (item[fieldMap[j]]) addTag(j, item[fieldMap[j]]);
|
|
}
|
|
|
|
// handle J & B tags correctly
|
|
if (item.publicationTitle) {
|
|
if (item.itemType == "journalArticle") {
|
|
addTag("J", item.publicationTitle);
|
|
}
|
|
else {
|
|
addTag("B", item.publicationTitle);
|
|
}
|
|
}
|
|
|
|
// creators
|
|
for (let j in item.creators) {
|
|
var referTag = "A";
|
|
if (item.creators[j].creatorType == "editor") {
|
|
referTag = "E";
|
|
}
|
|
else if (item.creators[j].creatorType == "translator") {
|
|
referTag = "?";
|
|
}
|
|
|
|
addTag(referTag, item.creators[j].lastName + (item.creators[j].firstName ? ", " + item.creators[j].firstName : ""));
|
|
}
|
|
|
|
// date
|
|
addTag("D", item.date);
|
|
|
|
// tags
|
|
if (item.tags) {
|
|
var keywordTag = "";
|
|
for (var i = 0; i < item.tags.length; i++) {
|
|
keywordTag += "\r\n" + item.tags[i].tag;
|
|
}
|
|
addTag("K", keywordTag.substr(2));
|
|
}
|
|
Zotero.write("\r\n");
|
|
}
|
|
}/** BEGIN TEST CASES **/
|
|
var testCases = [
|
|
{
|
|
"type": "import",
|
|
"input": "%0 Journal Article\n%A 余敏\n%A 朱江\n%A 丁照蕾\n%H Yu Min\n%H Zhu Jiang\n%H Ding Zhaolei\n%+ 中科院国家科学图书馆成都分馆,四川,成都,610041;中国科学院研究生院,北京,100049\n%+ 中科院国家科学图书馆成都分馆,四川,成都,610041\n%+ 四川大学公共管理学院,四川,成都,610064\n%T 参考文献管理工具研究\n%J 现代情报\n%J JOURNAL OF MODERN INFORMATION\n%@ 1008-0821\n%G chi\n%D 2009\n%N 2\n%V 29\n%P 94-98,93\n%K 参考文献管理 文献管理软件 学术书签网站 Zotero\n%X 介绍了参考文献管理的基本方法,对参考文献管理工具的主要功能进行了对比,最后分析了参考文献管理的趋势.\n%U http://d.wanfangdata.com.cn/Periodical_xdqb200902027.aspx\n%R 10.3969/j.issn.1008-0821.2009.02.027\n%W 北京万方数据股份有限公司",
|
|
"items": [
|
|
{
|
|
"itemType": "journalArticle",
|
|
"title": "参考文献管理工具研究",
|
|
"creators": [
|
|
{
|
|
"firstName": "",
|
|
"lastName": "余敏",
|
|
"creatorType": "author"
|
|
},
|
|
{
|
|
"firstName": "",
|
|
"lastName": "朱江",
|
|
"creatorType": "author"
|
|
},
|
|
{
|
|
"firstName": "",
|
|
"lastName": "丁照蕾",
|
|
"creatorType": "author"
|
|
}
|
|
],
|
|
"date": "2009",
|
|
"abstractNote": "介绍了参考文献管理的基本方法,对参考文献管理工具的主要功能进行了对比,最后分析了参考文献管理的趋势.",
|
|
"archiveLocation": "北京万方数据股份有限公司",
|
|
"extra": "Yu Min\nZhu Jiang\nDing Zhaolei",
|
|
"issue": "2",
|
|
"language": "chi",
|
|
"pages": "94-98,93",
|
|
"publicationTitle": "JOURNAL OF MODERN INFORMATION",
|
|
"url": "http://d.wanfangdata.com.cn/Periodical_xdqb200902027.aspx",
|
|
"volume": "29",
|
|
"attachments": [],
|
|
"tags": [
|
|
"参考文献管理 文献管理软件 学术书签网站 Zotero"
|
|
],
|
|
"notes": [],
|
|
"seeAlso": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "import",
|
|
"input": "%0 Book\n%R oai:nb.bibsys.no:998320569524702202\n%R URN:NBN:no-nb_digibok_2016062048105\n%U https://urn.nb.no/URN:NBN:no-nb_digibok_2016062048105\n%T Usynlige byer\n%A Calvino, Italo\n%Y Aardal, Jorunn\n%E Stender Clausen, Jørgen\n%D 1982\n%G Flerspråklig\n%G Norsk (Bokmål)\n%G Italiensk\n%G Dansk\n%Z Elektronisk reproduksjon [Norge] Nasjonalbiblioteket Digital 2016-11-03\n%I Aschehoug\n%C Oslo\n%@ 8203107354\n%K Italiensk litteratur\n%K Idealbyer\n%K kjernelitteratur\n%P 173 s.",
|
|
"items": [
|
|
{
|
|
"itemType": "book",
|
|
"title": "Usynlige byer",
|
|
"creators": [
|
|
{
|
|
"firstName": "Italo",
|
|
"lastName": "Calvino",
|
|
"creatorType": "author"
|
|
},
|
|
{
|
|
"firstName": "Jorunn",
|
|
"lastName": "Aardal",
|
|
"creatorType": "translator"
|
|
},
|
|
{
|
|
"firstName": "Jørgen",
|
|
"lastName": "Stender Clausen",
|
|
"creatorType": "editor"
|
|
}
|
|
],
|
|
"date": "1982",
|
|
"ISBN": "8203107354",
|
|
"language": "Flerspråklig, Norsk (Bokmål), Italiensk, Dansk",
|
|
"place": "Oslo",
|
|
"publisher": "Aschehoug",
|
|
"url": "https://urn.nb.no/URN:NBN:no-nb_digibok_2016062048105",
|
|
"attachments": [],
|
|
"tags": [
|
|
{
|
|
"tag": "Idealbyer"
|
|
},
|
|
{
|
|
"tag": "Italiensk litteratur"
|
|
},
|
|
{
|
|
"tag": "kjernelitteratur"
|
|
}
|
|
],
|
|
"notes": [
|
|
{
|
|
"note": "Elektronisk reproduksjon [Norge] Nasjonalbiblioteket Digital 2016-11-03"
|
|
}
|
|
],
|
|
"seeAlso": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "import",
|
|
"input": "%T Corn\n%A Newman, W. H.\n%I Uniontown, Ala. : Canebrake Agricultural Experiment Station\n%D 1891\n%K Corn -- Yields\n%K Corn -- Varieties\n%K Corn -- Field experiments\n\n",
|
|
"items": [
|
|
{
|
|
"itemType": "book",
|
|
"title": "Corn",
|
|
"creators": [
|
|
{
|
|
"firstName": "W. H.",
|
|
"lastName": "Newman",
|
|
"creatorType": "author"
|
|
}
|
|
],
|
|
"date": "1891",
|
|
"publisher": "Uniontown, Ala. : Canebrake Agricultural Experiment Station",
|
|
"attachments": [],
|
|
"tags": [
|
|
{
|
|
"tag": "Corn -- Field experiments"
|
|
},
|
|
{
|
|
"tag": "Corn -- Varieties"
|
|
},
|
|
{
|
|
"tag": "Corn -- Yields"
|
|
}
|
|
],
|
|
"notes": [],
|
|
"seeAlso": []
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"type": "import",
|
|
"input": "%0 Serial\n%0 Audio\n%I Studio Omega, Verein für Christliche Radioarbeit\n%D 2021\n%C Wien\n%G German\n%T Diesseits von Eden: der Podcast der katholischen Fakultäten Österreichs & Südtirols\n%U https://diesseits.theopodcast.at/home",
|
|
"items": [
|
|
{
|
|
"itemType": "audioRecording",
|
|
"title": "Diesseits von Eden: der Podcast der katholischen Fakultäten Österreichs & Südtirols",
|
|
"creators": [],
|
|
"date": "2021",
|
|
"label": "Studio Omega, Verein für Christliche Radioarbeit",
|
|
"language": "German",
|
|
"place": "Wien",
|
|
"url": "https://diesseits.theopodcast.at/home",
|
|
"attachments": [],
|
|
"tags": [],
|
|
"notes": [],
|
|
"seeAlso": []
|
|
}
|
|
]
|
|
}
|
|
]
|
|
/** END TEST CASES **/
|