Initial Commit
This commit is contained in:
125
translators/Library Catalog (VTLS).js
Normal file
125
translators/Library Catalog (VTLS).js
Normal file
@@ -0,0 +1,125 @@
|
||||
{
|
||||
"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 **/
|
||||
Reference in New Issue
Block a user