summaryrefslogtreecommitdiff
path: root/Library Catalog (VTLS).js
blob: 1da99724198f872aad3bbf1c448393c94691a827 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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 **/