Permalink
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
translators/ReferBibIX.js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"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, | |
"browserSupport": "gcsibv", | |
"lastUpdated": "2017-06-03 11:41:00" | |
} | |
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; | |
} | |
} | |
} | |
} | |
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", | |
"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" | |
}; | |
var isEndNote = false; | |
function processTag(item, tag, value) { | |
value = Zotero.Utilities.trim(value); | |
if (fieldMap[tag]) { | |
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; | |
} | |
} | |
// fall back to generic | |
if (!item.itemType) item.itemType = inputTypeMap["Generic"]; | |
} | |
} else if (tag == "A" || tag == "E" || tag == "?") { | |
if (tag == "A") { | |
var type = "author"; | |
} else if (tag == "E") { | |
var type = "editor"; | |
} else if (tag == "?") { | |
var type = "translator"; | |
} | |
item.creators.push(Zotero.Utilities.cleanAuthor(value, type, value.indexOf(",") != -1)); | |
} 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.indexOf(value) == -1) { | |
item.date += " "+value; | |
} | |
} else { | |
item.date = value; | |
} | |
} else if (tag == "8") { | |
if (item.date) { | |
if (value.indexOf(item.date) == -1) { | |
item.date += " "+value; | |
} | |
} else { | |
item.date = value; | |
} | |
} else if (tag == "K") { | |
item.tags = value.split("\n"); | |
} | |
} | |
function doImport() { | |
var line = true; | |
var tag = data = false; | |
do { // first valid line is type | |
Zotero.debug("ignoring "+line); | |
line = Zotero.read(); | |
line = line.replace(/^\s+/, ""); | |
} while (line !== false && line[0] != "%"); | |
var item = new Zotero.Item(); | |
var 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 = readRecordEntry = false; | |
// new item | |
item.complete(); | |
item = new Zotero.Item(); | |
} | |
} 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 { | |
// otherwise, assume this is data from the previous line continued | |
if (tag) { | |
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()) { | |
// 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 (var 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 (var 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": [] | |
} | |
] | |
} | |
] | |
/** END TEST CASES **/ |