| 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 | |
|---|
| 14 | function 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" */ |
|---|
| 26 | function 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 | |
|---|
| 37 | function 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 | } |
|---|