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 (VTLS).js
Find file
Copy path
Fetching contributors…
Cannot retrieve contributors at this time
{ | |
"translatorID": "63a0a351-3131-18f4-21aa-f46b9ac51d87", | |
"label": "Library Catalog (VTLS)", | |
"creator": "Simon Kornblith", | |
"target": "/chameleon(\\?|$)", | |
"minVersion": "1.0.0b3.r1", | |
"maxVersion": "", | |
"priority": 250, | |
"inRepository": true, | |
"translatorType": 4, | |
"browserSupport": "gcsibv", | |
"lastUpdated": "2014-08-26 04:13:58" | |
} | |
function detectWeb(doc, url) { | |
var node = doc.evaluate('//tr[@class="intrRow"]/td/table/tbody/tr[th]', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
if (node) { | |
return "multiple"; | |
} | |
var node = doc.evaluate('//a[text()="marc" or text()="marc view" or contains(text(), "UNIMARC") or contains(text(), "مارك")]', doc, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
if (node) { | |
return "book"; | |
} | |
} | |
function doWeb(doc, url) { | |
var uri = doc.location.href; | |
var newUris = new Array(); | |
var marcs = doc.evaluate('//a[text()="marc" or text()="marc view" or contains(text(), "UNIMARC") or contains(text(), "مارك")]', doc, null, XPathResult.ANY_TYPE, null); | |
var record = marcs.iterateNext(); | |
if (record && !marcs.iterateNext()) { | |
scrape(doc, record.href); | |
} else { | |
// Require link to match this | |
var tagRegexp = new RegExp(); | |
tagRegexp.compile("/chameleon\?.*function=CARDSCR"); | |
var items = {}; | |
var tableRows = doc.evaluate('//tr[@class="intrRow"]', doc, null, XPathResult.ANY_TYPE, null); | |
var tableRow; | |
// Go through table rows | |
while (tableRow = tableRows.iterateNext()) { | |
var links = tableRow.getElementsByTagName("a"); | |
// Go through links | |
var url; | |
for (var j = 0; j < links.length; j++) { | |
if (tagRegexp.test(links[j].href)) { | |
url = links[j].href; | |
break; | |
} | |
} | |
if (url) { | |
// Collect title information | |
var fields = doc.evaluate('./td/table/tbody/tr[th]', tableRow, null, XPathResult.ANY_TYPE, null); | |
var field; | |
while (field = fields.iterateNext()) { | |
var header = doc.evaluate('./th/text()', field, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
if (header.nodeValue == "Title"|| header.nodeValue == "Tytuł" || header.nodeValue == "Titre" || header.nodeValue == "العنوان") { | |
var value = doc.evaluate('./td', field, null, XPathResult.ANY_TYPE, null).iterateNext(); | |
if (value) { | |
items[url] = Zotero.Utilities.trimInternal(value.textContent); | |
} | |
} | |
} | |
} | |
} | |
Zotero.selectItems(items, function (items) { | |
if (!items) { | |
return true; | |
} | |
for (var i in items) { | |
newUris.push(i.replace(/function=[A-Z]{7}/, "function=MARCSCR")); | |
} | |
//Z.debug(newUris); | |
Zotero.Utilities.processDocuments(newUris, scrape); | |
}); | |
} | |
} | |
function scrape(doc, newUris) { | |
var translator = Zotero.loadTranslator("import"); | |
translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973"); | |
translator.getTranslatorObject(function (marc) { | |
Zotero.Utilities.processDocuments(newUris, function (newDoc) { | |
var uri = newDoc.location.href | |
var record = new marc.record(); | |
// var xpath = '//table[@class="outertable"]/tbody/tr[td[4]]'; //old xpath | |
// xpaths from virginia college of osteopathic medicine | |
// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[1][@class="marcTag"] | |
// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[2] | |
// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[3] | |
// /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[4][@class="marcSubfields"] | |
var xpath = '//table[@class="marctable"]/tbody/tr[td[4]]'; | |
var elmts = newDoc.evaluate(xpath, newDoc, null, XPathResult.ANY_TYPE, null); | |
while (elmt = elmts.iterateNext()) { | |
var field = newDoc.evaluate('./TD[1]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; | |
var ind1 = newDoc.evaluate('./TD[2]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; | |
var ind2 = newDoc.evaluate('./TD[3]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; | |
var value = newDoc.evaluate('./TD[4]/text()[1]', elmt, null, XPathResult.ANY_TYPE, null).iterateNext().nodeValue; | |
//French and English delimiters differ (sigh...) | |
value = value.replace(/\\([a-z0-9])\s?/g, marc.subfieldDelimiter + "$1").replace(/\$ ([a-z0-9]) /g, marc.subfieldDelimiter + "$1"); | |
//Z.debug(field+": " + value) | |
record.addField(field, ind1 + ind2, value); | |
} | |
var newItem = new Zotero.Item(); | |
record.translate(newItem); | |
var domain = uri.match(/https?:\/\/([^/]+)/); | |
newItem.repository = domain[1] + " Library Catalog"; | |
newItem.complete(); | |
}); | |
}); | |
} | |
/** BEGIN TEST CASES **/ | |
var testCases = [] | |
/** END TEST CASES **/ |