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/OCLC WorldCat FirstSearch.js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "838d8849-4ffb-9f44-3d0d-aa8a0a079afe", | |
"label": "OCLC WorldCat FirstSearch", | |
"creator": "Simon Kornblith", | |
"target": "^https?://[^/]*firstsearch\\.oclc\\.org[^/]*/WebZ/", | |
"minVersion": "1.0.0b3.r1", | |
"maxVersion": "", | |
"priority": 100, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "g", | |
"lastUpdated": "2017-01-01 15:28:35" | |
} | |
function detectWeb(doc, url) { | |
var detailRe = /FirstSearch: [\w ]+ Detailed Record/; | |
var searchRe = /FirstSearch: [\w ]+ List of Records/; | |
if (detailRe.test(doc.title)) { | |
return "book"; | |
} else if (searchRe.test(doc.title)) { | |
return "multiple"; | |
} | |
} | |
function processURLs(urls, url) { | |
if (!urls.length) { // last url | |
Zotero.done(); | |
return; | |
} | |
var newUrl = urls.shift(); | |
Zotero.Utilities.HTTP.doPost(newUrl, | |
'exportselect=record&exporttype=wc-endnote', function(text) { | |
Z.debug(text) | |
var lineRegexp = new RegExp(); | |
lineRegexp.compile("^([\\w() ]+): *(.*)$"); | |
var newItem = new Zotero.Item("book"); | |
var notes = ""; | |
var lines = text.split('\n'); | |
for (var i=0;i<lines.length;i++) { | |
var testMatch = lineRegexp.exec(lines[i]); | |
if (testMatch) { | |
var match = newMatch; | |
var newMatch = testMatch | |
} else { | |
var match = false; | |
} | |
if (match) { | |
// is a useful match | |
if (match[1] == 'Title') { | |
var title = match[2]; | |
if (!lineRegexp.test(lines[i+1])) { | |
i++; | |
title += ' '+lines[i]; | |
} | |
if (title.substring(title.length-2) == " /") { | |
title = title.substring(0, title.length-2); | |
} | |
newItem.title = Zotero.Utilities.capitalizeTitle(title); | |
} else if (match[1] == "Series") { | |
newItem.series = ZU.trimInternal(match[2]); | |
} else if (match[1] == "Description") { | |
var pageMatch = /([0-9]+) p\.?/; | |
var m = pageMatch.exec(match[2]); | |
if (m) { | |
newItem.numPages = m[1]; | |
} | |
} else if (match[1] == 'Author(s)' || match[1] == "Corp Author(s)") { | |
var yearRegexp = /[0-9]{4}-([0-9]{4})?/; | |
var authors = match[2].split(';'); | |
if (authors) { | |
newItem.creators.push(Zotero.Utilities.cleanAuthor(authors[0], "author", true)); | |
for (var j=1; j<authors.length; j+=2) { | |
if (authors[j-1].substring(0, 1) != '(' && !yearRegexp.test(authors[j])) { | |
// ignore places where there are parentheses | |
newItem.creators.push({lastName:authors[j], creatorType:"author", fieldMode:true}); | |
} | |
} | |
} else { | |
newItem.creators.push(Zotero.Utilities.trimInternal(match[2])); | |
} | |
} else if (match[1] == 'Publication') { | |
match[2] = Zotero.Utilities.trimInternal(match[2]); | |
if (match[2].substring(match[2].length-1) == ',') { | |
match[2] = match[2].substring(0, match[2].length-1); | |
} | |
// most, but not all, WorldCat publisher/places are | |
// colon delimited | |
var parts = match[2].split(/ ?: ?/); | |
if (parts.length == 2) { | |
newItem.place = parts[0]; | |
newItem.publisher = parts[1]; | |
} else { | |
newItem.publisher = match[2]; | |
} | |
} else if (match[1] == 'Institution') { | |
newItem.publisher = match[2]; | |
} else if (match[1] == 'Standard No') { | |
var ISBNRe = /ISBN:\s*([0-9X]+)/; | |
var m = ISBNRe.exec(match[2]); | |
if (m) newItem.ISBN = m[1]; | |
} else if (match[1] == 'Year') { | |
newItem.date = match[2]; | |
} else if (match[1] == "Descriptor") { | |
if (match[2][match[2].length-1] == ".") { | |
match[2] = match[2].substr(0, match[2].length-1); | |
} | |
var tags = match[2].split("--"); | |
for (var j in tags) { | |
newItem.tags.push(Zotero.Utilities.trimInternal(tags[j])); | |
} | |
} | |
else if (match[1] == "Language") { | |
newItem.language = match[2]; | |
} | |
else if (match[1] == "Abstract") { | |
newItem.abstractNote = match[2]; | |
} else if (match[1] == "Accession No" && match[2].indexOf("OCLC") != -1) { | |
newItem.extra = ZU.trimInternal(match[2]); | |
} else if (match[1] == "Degree") { | |
newItem.itemType = "thesis"; | |
newItem.thesisType = match[2]; | |
} else if (match[1] == "DOI") { | |
newItem.DOI = match[2]; | |
} else if (match[1] == "Database") { | |
if (match[2].substr(0, 8) != "WorldCat") { | |
newItem.itemType = "journalArticle"; | |
} | |
} else if (match[1] != "Availability" && | |
match[1] != "Find Items About" && | |
match[1] != "Document Type") { | |
notes += match[1]+": "+match[2]+"\n"; | |
} | |
} else { | |
if (lines[i] != "" && lines[i] != "SUBJECT(S)") { | |
newMatch[2] += " "+lines[i]; | |
} | |
} | |
} | |
if (notes) { | |
newItem.notes.push(notes.substr(0, notes.length-1)); | |
} | |
newItem.complete(); | |
processURLs(urls, url); | |
}); | |
} | |
function doWeb(doc, url) { | |
var sessionRegexp = /(?:\?|\:)sessionid=([^?:]+)(?:\?|\:|$)/; | |
var numberRegexp = /(?:\?|\:)recno=([^?:]+)(?:\?|\:|$)/; | |
var resultsetRegexp = /(?:\?|\:)resultset=([^?:]+)(?:\?|\:|$)/; | |
var hostRegexp = new RegExp("^(https?://[^/]+)/"); | |
var sMatch = sessionRegexp.exec(url); | |
var sessionid = sMatch[1]; | |
var hMatch = hostRegexp.exec(url); | |
var host = hMatch[1]; | |
var newUri, exportselect; | |
var detailRe = /FirstSearch: [\w ]+ Detailed Record/; | |
if (detailRe.test(doc.title)) { | |
var publisherRegexp = /^(.*), (.*?),?$/; | |
var nMatch = numberRegexp.exec(url); | |
if (nMatch) { | |
var number = nMatch[1]; | |
} else { | |
number = 1; | |
} | |
var rMatch = resultsetRegexp.exec(url); | |
if (rMatch) { | |
var resultset = rMatch[1]; | |
} else { | |
// It's in an XPCNativeWrapper, so we have to do this black magic | |
resultset = doc.forms.namedItem('main').elements.namedItem('resultset').value; | |
} | |
urls = [host+'/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset=' + resultset + ':entityexportrecno=' + number + ':sessionid=' + sessionid + ':entitypagenum=35:0']; | |
processURLs(urls, url); | |
} else { | |
var items = Zotero.Utilities.getItemArray(doc, doc, '/WebZ/FSFETCH\\?fetchtype=fullrecord', '^(See more details for locating this item|Detailed Record)$'); | |
var urls = [] | |
Zotero.selectItems(items, function (items) { | |
if (!items) { | |
return true; | |
} | |
for (var i in items) { | |
var nMatch = numberRegexp.exec(i); | |
var rMatch = resultsetRegexp.exec(i); | |
if (rMatch && nMatch) { | |
var number = nMatch[1]; | |
var resultset = rMatch[1]; | |
urls.push(host+'/WebZ/DirectExport?numrecs=10:smartpage=directexport:entityexportnumrecs=10:entityexportresultset=' + resultset + ':entityexportrecno=' + number + ':sessionid=' + sessionid + ':entitypagenum=35:0'); | |
} | |
} | |
processURLs(urls, url); | |
}); | |
} | |
} |