Permalink
Join GitHub today
GitHub is home to over 36 million developers working together to host and review code, manage projects, and build software together.
Sign up
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 **/ |