Ticket #622: google scholar translator v4.sql

File google scholar translator v4.sql, 4.4 KB (added by cartesian, 9 years ago)

Places Zotero.wait()s and done()s better. Also handles additional language prefs in the url. Does NOT fix #750. This will be my last contribution for a while!

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