Ticket #1220: Library Catalog (VTLS).js

File Library Catalog (VTLS).js, 5.1 KB (added by ajlyon, 6 years ago)

Extensible approach to internationalizing, adding variants for Title

Line 
1{
2        "translatorID":"63a0a351-3131-18f4-21aa-f46b9ac51d87",
3        "translatorType":4,
4        "label":"Library Catalog (VTLS)",
5        "creator":"Simon Kornblith",
6        "target":"/chameleon(?:\\?|$)",
7        "minVersion":"1.0.0b3.r1",
8        "maxVersion":"",
9        "priority":100,
10        "inRepository":true,
11        "lastUpdated":"2010-06-14 20:40:00"
12}
13
14function detectWeb(doc, url) {
15        var node = doc.evaluate('//tr[@class="intrRow"]/td/table/tbody/tr[th]', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
16        if(node) {
17                return "multiple";
18        }
19        var node = doc.evaluate('//a[text()="marc"]', doc, null, XPathResult.ANY_TYPE, null).iterateNext();
20        if(node) {
21                return "book";
22        }
23}
24
25/* Returns true if "word" is in the array for key "set" */
26function inI18NSetFor(word, set) {
27        var variants = {
28                "Title" : 
29                ["Title", "Tytuł"]
30        };
31        if (word == set) return true;
32        else if (variants[set] && variants[set].indexOf(word) !== -1) return true;
33        else return false;
34       
35}
36
37function doWeb(doc, url) {
38        var namespace = doc.documentElement.namespaceURI;
39        var nsResolver = namespace ? function(prefix) {
40                if (prefix == 'x') return namespace; else return null;
41        } : null;
42       
43        var uri = doc.location.href;
44        var newUris = new Array();
45       
46        var marcs = doc.evaluate('//a[text()="marc"]', doc, nsResolver,
47                                 XPathResult.ANY_TYPE, null);
48        var record = marcs.iterateNext();
49       
50        if(record && !marcs.iterateNext()) {
51                newUris.push(record.href);
52        } else {
53                // Require link to match this
54                var tagRegexp = new RegExp();
55                tagRegexp.compile("/chameleon\?.*function=CARDSCR");
56               
57                var items = new Array();
58               
59                var tableRows = doc.evaluate('//tr[@class="intrRow"]', doc, nsResolver,
60                                             XPathResult.ANY_TYPE, null);
61                var tableRow;
62                // Go through table rows
63                while(tableRow = tableRows.iterateNext()) {
64                        var links = tableRow.getElementsByTagName("a");
65                        // Go through links
66                        var url;
67                        for(var j=0; j<links.length; j++) {
68                                if(tagRegexp.test(links[j].href)) {
69                                        url = links[j].href;
70                                        break;
71                                }
72                        }
73                        if(url) {
74                                // Collect title information
75                                var fields = doc.evaluate('./td/table/tbody/tr[th]', tableRow,
76                                                          nsResolver, XPathResult.ANY_TYPE, null);
77                                var field;
78                                while(field = fields.iterateNext()) {
79                                        var header = doc.evaluate('./th/text()', field, nsResolver,
80                                                                  XPathResult.ANY_TYPE, null).iterateNext();
81                                        if(inI18NSetFor(header.nodeValue,"Title")) {
82                                                var value = doc.evaluate('./td', field, nsResolver,
83                                                                  XPathResult.ANY_TYPE, null).iterateNext();
84                                                if(value) {
85                                                        items[url] = Zotero.Utilities.cleanString(value.textContent);
86                                                }
87                                        }
88                                }
89                        }
90                }
91               
92                items = Zotero.selectItems(items);
93               
94                if(!items) {
95                        return true;
96                }
97               
98                for(var i in items) {
99                        Zotero.debug(i.replace(/function=[A-Z]{7}/, "function=MARCSCR"));
100                        newUris.push(i.replace(/function=[A-Z]{7}/, "function=MARCSCR"));
101                }
102        }
103       
104        var translator = Zotero.loadTranslator("import");
105        translator.setTranslator("a6ee60df-1ddc-4aae-bb25-45e0537be973");
106        var marc = translator.getTranslatorObject();
107       
108        Zotero.Utilities.processDocuments(newUris, function(newDoc) {
109                var uri = newDoc.location.href
110               
111                var namespace = newDoc.documentElement.namespaceURI;
112                var nsResolver = namespace ? function(prefix) {
113                  if (prefix == 'x') return namespace; else return null;
114                } : null;
115               
116                var record = new marc.record();
117               
118//              var xpath = '//table[@class="outertable"]/tbody/tr[td[4]]'; //old xpath
119//              xpaths from virginia college of osteopathic medicine
120//              /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"]
121//              /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[2]
122//              /html/body/table[@class="header2"]/tbody/tr/td[2]/table/tbody/tr/td/table/tbody/tr/td/table[@class="marctable"]/tbody/tr/td[3]
123//              /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"]
124                var xpath = '//table[@class="marctable"]/tbody/tr[td[4]]';
125                var elmts = newDoc.evaluate(xpath, newDoc, nsResolver,
126                                            XPathResult.ANY_TYPE, null);
127               
128                while(elmt = elmts.iterateNext()) {
129                        var field = newDoc.evaluate('./TD[1]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
130                        var ind1 = newDoc.evaluate('./TD[2]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
131                        var ind2 = newDoc.evaluate('./TD[3]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
132                        var value = newDoc.evaluate('./TD[4]/text()[1]', elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext().nodeValue;
133                        value = value.replace(/\\([a-z]) /g, marc.subfieldDelimiter+"$1");
134                       
135                        record.addField(field, ind1+ind2, value);
136                }
137               
138                var newItem = new Zotero.Item();
139                record.translate(newItem);
140               
141                var domain = url.match(/https?:\/\/([^/]+)/);
142                newItem.repository = domain[1]+" Library Catalog";
143               
144                newItem.complete();
145        }, function(){ Zotero.done(); }, null);
146       
147        Zotero.wait();
148}