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/Library Catalog (Voyager).js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "88915634-1af6-c134-0171-56fd198235ed", | |
"label": "Library Catalog (Voyager)", | |
"creator": "Simon Kornblith", | |
"target": "Pwebrecon\\.cgi", | |
"minVersion": "2.1.9", | |
"maxVersion": "", | |
"priority": 250, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "gcsibv", | |
"lastUpdated": "2014-08-26 04:12:55" | |
} | |
function detectWeb(doc, url) { | |
var export_options = ZU.xpath(doc, '//form[@name="frm"]//*[@name="RD"]|//td/select[@name="RD"]'); | |
if (!export_options.length) return false; | |
export_options = export_options[0]; | |
var i = 0 | |
while (i< export_options.length) { | |
if (export_options[i].text == 'Latin1 MARC' || export_options[i].text == 'Raw MARC' || export_options[i].text == 'MARC 21' || export_options[i].text == 'MARC 8' || export_options[i].text == 'MARC-8' || export_options[i].text == 'UTF-8' || export_options[i].text == 'MARC (Unicode/UTF-8)' || export_options[i].text == 'MARC UTF-8' || export_options[i].text == 'UTF-8 MARC (Unicode)' || export_options[i].text == 'UTF8-Unicode' || export_options[i].text == 'MARC (non-Unicode/MARC-8)' || export_options[i].text == 'MARC communication format' || export_options[i].text == 'MARC Record') { | |
// We have an exportable single record | |
if (ZU.xpath(doc, '//form[@name="frm"]//*[@name="RC"]').length) { | |
return "multiple"; | |
} else { | |
return "book"; | |
} | |
} | |
i++; | |
} | |
} | |
function doWeb(doc, url) { | |
var postString = ''; | |
var form = ZU.xpath(doc, '//form[@name="frm"]'); | |
var newUri = form[0].action; | |
var multiple = false; | |
if (ZU.xpath(form, '//*[@name="RC"]').length) { | |
multiple = true; | |
var availableItems = new Object(); // Technically, associative arrays are objects | |
var namespace = doc.documentElement.namespaceURI; | |
var nsResolver = namespace ? | |
function (prefix) { | |
if (prefix == 'x') return namespace; | |
else return null; | |
} : null; | |
// Require link to match this | |
var tagRegexp = new RegExp(); | |
tagRegexp.compile('Pwebrecon\\.cgi\\?.*v1=[0-9]+\\&.*ti='); | |
// Do not allow text to match this | |
var rejectRegexp = new RegExp(); | |
rejectRegexp.compile('\[ [0-9]+ \]'); | |
var checkboxes = new Array(); | |
var urls = new Array(); | |
var tableRows = doc.evaluate('//form[@name="frm"]//table/tbody/tr[td/input[@type="checkbox" or @type="CHECKBOX"]]', doc, nsResolver, XPathResult.ANY_TYPE, null); | |
// Go through table rows | |
var tableRow; | |
var i = 0; | |
while (tableRow = tableRows.iterateNext()) { | |
i++; | |
// CHK is what we need to get it all as one file | |
var input = doc.evaluate('./td/input[@name="CHK"]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext(); | |
checkboxes[i] = input.value; | |
var links = tableRow.getElementsByTagName("a"); | |
// Go through links | |
for (var j = 0; j < links.length; j++) { | |
if (tagRegexp.test(links[j].href)) { | |
var text = links[j].textContent; | |
if (text) { | |
text = Zotero.Utilities.trimInternal(text); | |
if (!rejectRegexp.test(text)) { | |
if (availableItems[i]) { | |
availableItems[i] += " " + text; | |
} else { | |
availableItems[i] = text; | |
} | |
} | |
} | |
} | |
} | |
// if no title, pull from second td | |
if (!availableItems[i]) { | |
availableItems[i] = Zotero.Utilities.trimInternal(doc.evaluate('./td[2]', tableRow, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().textContent); | |
} | |
} | |
var items = Zotero.selectItems(availableItems); | |
if (!items) { | |
return true; | |
} | |
// add arguments for items we need to grab | |
for (var i in items) { | |
postString += "CHK=" + checkboxes[i] + "&"; | |
} | |
} | |
var raw, unicode, latin1; | |
for (var i = 0; i < form[0].elements.length; i++) { | |
if (form[0].elements[i].type && form[0].elements[i].type.toLowerCase() == 'hidden') { | |
postString += escape(form[0].elements[i].name) + '=' + escape(form[0].elements[i].value) + '&'; | |
} | |
} | |
var export_options = ZU.xpath(form, '//select[@name="RD"]/option'); | |
for (var i = 0; i < export_options.length; i++) { | |
if (export_options[i].text == 'Raw MARC' || export_options[i].text == 'MARC 8' || export_options[i].text == 'MARC-8' || export_options[i].text == 'MARC (non-Unicode/MARC-8)') { | |
raw = i; | |
} | |
if (export_options[i].text == 'Latin1 MARC') { | |
latin1 = i; | |
} else if (export_options[i].text == 'UTF-8' || export_options[i].text == 'UTF-8 MARC (Unicode)' || export_options[i].text == 'UTF8-Unicode' || export_options[i].text == 'MARC UTF-8' || export_options[i].text == 'MARC (Unicode/UTF-8)' || export_options[i].text == 'MARC 21' || export_options[i].text == 'MARC communication format' || export_options[i].text == 'MARC Record') { | |
unicode = i; | |
} | |
} | |
var responseCharset = null; | |
if (unicode) { | |
var rd = unicode; | |
responseCharset = 'UTF-8'; | |
} else if (latin1) { | |
var rd = latin1; | |
responseCharset = 'ISO-8859-1'; | |
} else if (raw) { | |
var rd = raw; | |
} else { | |
return false; | |
} | |
//get permalink for LoC - getting this from MARC is going to be much harder | |
if (url.length > 23 && url.substr(0, 23) == "http://catalog.loc.gov/") { | |
var LoCpermalink = ZU.xpathText(doc, '//tr/td/a[contains(@href, "http://lccn.loc.gov/")]'); | |
} | |
postString += 'RD=' + rd + '&MAILADDY=&SAVE=Press+to+SAVE+or+PRINT'; | |
// No idea why this doesn't work as post | |
Zotero.Utilities.HTTP.doGet(newUri + '?' + postString, function (text) { | |
// load translator for MARC | |
var marc = Zotero.loadTranslator("import"); | |
marc.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); | |
marc.setString(text); | |
//Z.debug(text) | |
// if this is the LOC catalog, specify that in repository field | |
if (url.length > 23 && url.substr(0, 23) == "http://catalog.loc.gov/") { | |
marc.setHandler("itemDone", function (obj, item) { | |
if (LoCpermalink){ | |
item.attachments.push({url: LoCpermalink, title: "Library of Congress Permalink", mimeType: "text/html", snapshot: false}) | |
} | |
item.repository = "Library of Congress Catalog"; | |
item.complete(); | |
}); | |
} else { | |
var domain = url.match(/https?:\/\/([^/]+)/); | |
marc.setHandler("itemDone", function (obj, item) { | |
item.repository = domain[1] + " Library Catalog"; | |
item.complete(); | |
}); | |
} | |
marc.translate(); | |
}, null, responseCharset); | |
} | |
/** BEGIN TEST CASES **/ | |
var testCases = [ | |
{ | |
"type": "web", | |
"url": "https://i-share.carli.illinois.edu/nby/cgi-bin/Pwebrecon.cgi?DB=local&v1=1&BBRecID=790862", | |
"items": [ | |
{ | |
"itemType": "book", | |
"creators": [ | |
{ | |
"firstName": "Francisco", | |
"lastName": "Xarque", | |
"creatorType": "author" | |
} | |
], | |
"notes": [ | |
{ | |
"note": "Brunet and Graesse both mention a map of Paraguay; this copy has a map of Chile with title: Tabula geocraphica [sic] regni Chile / studio et labore P. Procuratoris Chilensis Societatis Jesu In 3 books; the first two are biographies of Jesuits, Simon Mazeta and Francisco Diaz Taño, the 3rd deals with Jesuit missions in Paraguay Head and tail pieces" | |
} | |
], | |
"tags": [ | |
"Masseta, Simon", | |
"Cuellar y Mosquera, Gabriel de", | |
"Missions", | |
"Paraguay" | |
], | |
"seeAlso": [], | |
"attachments": [], | |
"title": "Insignes missioneros de la Compañia de Jesus en la prouincia del Paraguay: estado presente de sus missiones en Tucuman, Paraguay, y Rio de la Plata, que comprehende su distrito", | |
"place": "En Pamplona", | |
"publisher": "Por Juan Micòn, Impressor", | |
"date": "1687", | |
"numPages": "24", | |
"callNumber": "VAULT Ayer 1343 .J515 P211 X2 1687", | |
"libraryCatalog": "i-share.carli.illinois.edu Library Catalog", | |
"shortTitle": "Insignes missioneros de la Compañia de Jesus en la prouincia del Paraguay" | |
} | |
] | |
} | |
] | |
/** END TEST CASES **/ |