Ticket #622: google scholar translator code.txt

File google scholar translator code.txt, 4.2 KB (added by cartesian, 9 years ago)

Edits to translator by cartesian (SR)

Line 
1REPLACE INTO translators VALUES ('57a00950-f0d1-4b41-b6ba-44ff0fc30289', '1.0.0b3.r1', '', '2007-08-30 15:50:40', '1', '100', '4', 'Google Scholar', 'Simon Kornblith', '^http://scholar\.google\.[a-z]+/scholar',
2'function detectWeb(doc, url) {
3        return "multiple";
4}',
5'var haveEndNoteLinks;
6
7function scrape(doc) {
8        var nsResolver = doc.createNSResolver(doc.documentElement);
9       
10        var items = new Array();
11        var itemGrabLinks = new Array();
12        var links = new Array();
13        var types = new Array();
14       
15        var itemTypes = new Array();
16        var attachments = new Array();
17       
18        var elmts = doc.evaluate(''//p[@class="g"]'', doc, nsResolver,
19                                 XPathResult.ANY_TYPE, null);
20        var elmt;
21        var i=0;
22        Zotero.debug("get elms");
23        while(elmt = elmts.iterateNext()) {
24                var isCitation = doc.evaluate("./font[1]/b[1]/text()[1]", elmt, nsResolver,
25                                              XPathResult.ANY_TYPE, null).iterateNext();
26                // use EndNote links if available
27                if(haveEndNoteLinks) {
28                        var itemGrabLink = doc.evaluate(''.//a[text() = "Import into EndNote"]'',
29                                                                                   elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
30                } else {
31                        var itemGrabLink = doc.evaluate(''.//a[text() = "Related Articles"]'',
32                                                                                   elmt, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
33                }
34       
35        var noLinkRe = /^\[[^\]]+\]$/;
36                if(itemGrabLinks) {
37                        itemGrabLinks[i] = itemGrabLink.href;
38                        if(isCitation && noLinkRe.test(isCitation.textContent)) {
39                                // get titles for [BOOK] or [CITATION] entries
40                                items[i] = Zotero.Utilities.getNodeString(doc, elmt, ''./text()|./b/text()'', nsResolver);
41                        } else {
42                                // get titles for articles
43                                var link = doc.evaluate(''.//a'', elmt, nsResolver,
44                                                                                XPathResult.ANY_TYPE, null).iterateNext();
45                                if(link) {
46                                        items[i] = link.textContent;
47                                        links[i] = link.href;
48                                }
49                        }
50                       
51                        if(items[i]) {
52                                i++;
53                        }
54                }
55        }
56       
57        items = Zotero.selectItems(items);
58        if(!items) {
59                if(Zotero.done) Zotero.done(true);
60                return true;
61        }
62       
63        var relatedMatch = /[&?]q=related:([^&]+)/;
64       
65        var urls = new Array();
66        for(var i in items) {
67                // get url
68                if(haveEndNoteLinks) {
69                        urls.push(itemGrabLinks[i]);
70                } else {
71                        var m = relatedMatch.exec(itemGrabLinks[i]);
72                        urls.push("http://scholar.google.com/scholar.ris?hl=en&lr=&q=info:"+m[1]+"&oe=UTF-8&output=citation&oi=citation");
73                }
74               
75                if(links[i]) {
76                        attachments.push([{title:"Google Scholar Linked Page", type:"text/html",
77                                          url:links[i]}]);
78                } else {
79                        attachments.push([]);
80                }
81        }
82       
83        var translator = Zotero.loadTranslator("import");
84        translator.setTranslator("881f60f2-0802-411a-9228-ce5f47b64c7d");
85        translator.setHandler("itemDone", function(obj, item) {
86                item.attachments = attachments.shift();
87                item.complete();
88        });
89       
90        Zotero.Utilities.HTTP.doGet(urls, function(text) {
91                translator.setString(text);
92                translator.translate();
93        }, function() { Zotero.done() });
94}
95
96function doWeb(doc, url) {
97        var prefsurl;
98        var nsResolver = doc.createNSResolver(doc.documentElement);
99       
100        //SR:Will use preference setting url instead of cookie to get EndNote links (works with ezproxy, doesn''t overwrite other prefs)
101        //doc.cookie = "GSP=ID=deadbeefdeadbeef:IN=ebe89f7e83a8fe75+7e6cc990821af63:CF=3; domain=.scholar.google.com";
102       
103        // determine if we need to reload the page
104       
105        // first check for EndNote links
106        Zotero.debug("get links");
107        haveEndNoteLinks = doc.evaluate(''//a[text() = "Import into EndNote"]'',
108                        doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext();
109        if(!haveEndNoteLinks) {
110                        // SR:Commenting out this bit as code for retreiving citations from "Related" links is unreliable and unnecessary
111                        //// next check if there are docs with no related articles
112                        //if(doc.evaluate(''//p[@class="g"][not(descendant-or-self::text() = "Related Articles")]'',
113                        //      doc, nsResolver, XPathResult.ANY_TYPE, null).iterateNext()) {
114                // SR:Set preferences to show links and do page reload
115                prefsurl = url.replace("scholar?", "scholar_setprefs?scis=yes&scisf=3&submit=Save+Preferences&");
116                Zotero.Utilities.loadDocument(prefsurl, scrape);
117                haveEndNoteLinks = true;
118                return;
119                        //}
120        }
121       
122        scrape(doc, url);
123}');