-
Notifications
You must be signed in to change notification settings - Fork 767
/
EBSCOhost.js
152 lines (134 loc) · 6.41 KB
/
EBSCOhost.js
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
{
"translatorID":"d0b1914a-11f1-4dd7-8557-b32fe8a3dd47",
"translatorType":4,
"label":"EBSCOhost",
"creator":"Simon Kornblith and Michael Berkowitz",
"target":"https?://[^/]+/(?:bsi|ehost)/(?:results|detail|folder)",
"minVersion":"1.0.0b3.r1",
"maxVersion":"",
"priority":100,
"inRepository":true,
"lastUpdated":"2008-08-06 17:00:00"
}
function detectWeb(doc, url) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
} : null;
// See if this is a search results or folder results page
var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver,
XPathResult.ANY_TYPE, null).iterateNext();
if(searchResult) {
return "multiple";
}
/*
var xpath = '//div[@class="citation-wrapping-div"]/dl[@class="citation-fields"]/dt[starts-with(text(), "Persistent link to this record")'
+' or starts-with(text(), "Vínculo persistente a este informe")'
+' or starts-with(text(), "Lien permanent à cette donnée")'
+' or starts-with(text(), "Permanenter Link zu diesem Datensatz")'
+' or starts-with(text(), "Link permanente al record")'
+' or starts-with(text(), "Link permanente para este registro")'
+' or starts-with(text(), "本記錄固定連結")'
+' or starts-with(text(), "此记录的永久链接")'
+' or starts-with(text(), "このレコードへのパーシスタント リンク")'
+' or starts-with(text(), "레코드 링크 URL")'
+' or starts-with(text(), "Постоянная ссылка на эту запись")'
+' or starts-with(text(), "Bu kayda sürekli bağlantı")'
+' or starts-with(text(), "Μόνιμος σύνδεσμος σε αυτό το αρχείο")]';
*/
var xpath = '//input[@id="ctl00_ctl00_MainContentArea_MainContentArea_topDeliveryControl_deliveryButtonControl_lnkExportImage"]';
var persistentLink = doc.evaluate(xpath, doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
if(persistentLink) {
return "journalArticle";
}
}
var customViewStateMatch = /<input type="hidden" name="__CUSTOMVIEWSTATE" id="__CUSTOMVIEWSTATE" value="([^"]+)" \/>/
var host;
function fullEscape(text) {
return escape(text).replace(/\//g, "%2F").replace(/\+/g, "%2B");
}
function generateDeliverString(nsResolver, doc){
var hiddenInputs = doc.evaluate('//input[@type="hidden" and not(contains(@name, "folderHas"))]', doc, nsResolver, XPathResult.ANY_TYPE, null);
var hiddenInput;
var deliverString ="";
while(hiddenInput = hiddenInputs.iterateNext()) {
deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+encodeURIComponent(hiddenInput.value) + "&";
}
var otherHiddenInputs = doc.evaluate('//input[@type="hidden" and contains(@name, "folderHas")]', doc, nsResolver, XPathResult.ANY_TYPE, null);
while(hiddenInput = otherHiddenInputs.iterateNext()) {
deliverString = deliverString+hiddenInput.name.replace(/\$/g, "%24")+"="+escape(hiddenInput.value).replace(/\//g, "%2F").replace(/%20/g, "+") + "&";
}
deliverString = deliverString
+"&ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExportImage.x=5"
+"&ctl00%24ctl00%24MainContentArea%24MainContentArea%24topDeliveryControl%24deliveryButtonControl%24lnkExportImage.y=14";
return deliverString;
}
/*
* given the text of the delivery page, downloads an item
*/
function downloadFunction(text) {
var postLocation = /<form name="aspnetForm" method="post" action="([^"]+)"/
var m = postLocation.exec(text);
var deliveryURL = m[1].replace(/&/g, "&");
m = customViewStateMatch.exec(text);
var downloadString = "__EVENTTARGET=&__EVENTARGUMENT=&__CUSTOMVIEWSTATE="+fullEscape(m[1])+"&__VIEWSTATE=&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24btnSubmit=Save&ctl00%24ctl00%24MainContentArea%24MainContentArea%24ctl00%24BibFormat=1&ajax=enabled";
Zotero.Utilities.HTTP.doPost(host+"/ehost/"+deliveryURL,
downloadString, function(text) { // get marked records as RIS
// load translator for RIS
var test = text.match(/UR\s+\-(.*)/g);
if (test[0].match("@")) text = text.replace(/UR\s+\-(.*)/, "");
if (text.match(/AB\s\s\-/)) text = text.replace(/AB\s\s\-/, "N2 -");
var translator = Zotero.loadTranslator("import");
translator.setTranslator("32d59d2d-b65a-4da4-b0a3-bdd3cfb979e7");
translator.setString(text);
translator.setHandler("itemDone", function(obj, item) {
if (text.match("L3")) {
item.DOI = text.match(/L3\s+\-\s*(.*)/)[1];
}
item.itemType = "journalArticle";
item.complete();
});
translator.translate();
Zotero.done();
});
}
function doWeb(doc, url) {
var namespace = doc.documentElement.namespaceURI;
var nsResolver = namespace ? function(prefix) {
if (prefix == 'x') return namespace; else return null;
} : null;
var hostRe = new RegExp("^(https?://[^/]+)/");
var m = hostRe.exec(url);
host = m[1];
var searchResult = doc.evaluate('//ul[@class="result-list" or @class="folder-list"]/li/div[@class="result-list-record" or @class="folder-item"]', doc, nsResolver,
XPathResult.ANY_TYPE, null).iterateNext();
if(searchResult) {
var titlex = '//div[@class="result-list-record" or @class="folder-item-detail"]/span/a';
var titles = doc.evaluate(titlex, doc, nsResolver, XPathResult.ANY_TYPE, null);
var items = new Object();
var title;
while (title = titles.iterateNext()) {
items[title.href] = title.textContent;
}
var items = Zotero.selectItems(items);
if(!items) {
return true;
}
var uris = new Array();
for(var i in items) {
uris.push(i);
}
Zotero.Utilities.processDocuments(uris, function(newDoc){
var postURL = newDoc.evaluate('//form[@name="aspnetForm"]/@action', newDoc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
postURL = host+"/ehost/"+postURL.nodeValue;
var deliverString = generateDeliverString(nsResolver, newDoc);
Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction);
});
} else {
var postURL = doc.evaluate('//form[@name="aspnetForm"]/@action', doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
postURL = host+"/ehost/"+postURL.nodeValue;
var deliverString = generateDeliverString(nsResolver, doc);
Zotero.Utilities.HTTP.doPost(postURL, deliverString, downloadFunction);
}
Zotero.wait();
}