1
+ {
2
+ "translatorID" :"e78d20f7-488-4023-831-dfe39679f3f" ,
3
+ "translatorType" :4 ,
4
+ "label" :"ACM" ,
5
+ "creator" :"Simon Kornblith and Michael Berkowitz" ,
6
+ "target" :"https?://[^/]*portal\\.acm\\.org[^/]*/(?:results\\.cfm|citation\\.cfm)" ,
7
+ "minVersion" :"1.0.0b3.r1" ,
8
+ "maxVersion" :"" ,
9
+ "priority" :100 ,
10
+ "inRepository" :true ,
11
+ "lastUpdated" :"2008-06-06 08:45:00"
12
+ }
13
+
14
+ function detectWeb ( doc , url ) {
15
+ if ( url . indexOf ( "/results.cfm" ) != - 1 ) {
16
+ var items = Zotero . Utilities . getItemArray ( doc , doc , '^https?://[^/]+/citation.cfm\\?[^#]+$' ) ;
17
+ // hack to return multiple if there are items
18
+ for ( var i in items ) {
19
+ return "multiple" ;
20
+ }
21
+ } else {
22
+ var onClick = doc . evaluate ( '//a[substring(text(), 5, 7) = "EndNote"]' , doc , null , XPathResult . ANY_TYPE ,
23
+ null ) . iterateNext ( ) . getAttribute ( "onClick" ) ;
24
+ if ( onClick . match ( "proceeding.article" ) ) {
25
+ return "conferencePaper" ;
26
+ } else {
27
+ return "journalArticle" ;
28
+ }
29
+ }
30
+ }
31
+
32
+ var urls = new Array ( ) ;
33
+
34
+ // this handles sequential loading, since first we need to process a document (to get the abstract), then
35
+ // get the Refer metadata, then process the next document, etc.
36
+ function getNext ( ) {
37
+ if ( urls . length ) {
38
+ var url = urls . shift ( ) ;
39
+ Zotero . Utilities . processDocuments ( [ url ] , function ( doc ) { scrape ( doc ) ; } ) ;
40
+ } else {
41
+ Zotero . done ( ) ;
42
+ }
43
+ }
44
+
45
+ function scrape ( doc ) {
46
+ var onClick = doc . evaluate ( '//a[substring(text(), 5, 7) = "EndNote"]' , doc , null , XPathResult . ANY_TYPE ,
47
+ null ) . iterateNext ( ) . getAttribute ( "onClick" ) ;
48
+ var m = onClick . match ( / ' ( [ ^ ' ] + ) ' / ) ;
49
+
50
+ if ( doc . evaluate ( '//div[@class="abstract"]/p[@class="abstract"]' , doc , null , XPathResult . ANY_TYPE , null ) . iterateNext ( ) ) {
51
+ var abstract = doc . evaluate ( '//div[@class="abstract"]/p[@class="abstract"]' , doc , null , XPathResult . ANY_TYPE , null ) . iterateNext ( ) ;
52
+ if ( ! abstract . textContent . match ( / \w + / ) ) {
53
+ var abstract = doc . evaluate ( '//div[@class="abstract"]/p[2]' , doc , null , XPathResult . ANY_TYPE , null ) . iterateNext ( ) ;
54
+ }
55
+ if ( abstract ) abstract = Zotero . Utilities . cleanString ( abstract . textContent ) ;
56
+ }
57
+ var snapshot = doc . location . href ;
58
+
59
+ var attachments = new Array ( ) ;
60
+ var url ;
61
+ var typeLinks = doc . evaluate ( '//td[@class="smaller-text"]/a[img]' , doc , null ,
62
+ XPathResult . ANY_TYPE , null ) ;
63
+ var typeLink ;
64
+ while ( typeLink = typeLinks . iterateNext ( ) ) {
65
+ var linkText = typeLink . textContent . toLowerCase ( ) ;
66
+ if ( linkText == "pdf" ) {
67
+ attachments . push ( { title :"ACM Full Text PDF" , mimeType :"application/pdf" , url :typeLink . href } ) ;
68
+ url = typeLink . href ;
69
+ } else if ( linkText == "html" ) {
70
+ url = snapshot = typeLink . href ;
71
+ }
72
+ }
73
+
74
+ attachments . push ( { title :"ACM Snapshot" , mimeType :"text/html" , url :snapshot } ) ;
75
+
76
+ var keywords = new Array ( ) ;
77
+ var keywordLinks = doc . evaluate ( '//p[@class="keywords"]/a' , doc , null ,
78
+ XPathResult . ANY_TYPE , null ) ;
79
+ var keywordLink ;
80
+ while ( keywordLink = keywordLinks . iterateNext ( ) ) {
81
+ keywords . push ( Zotero . Utilities . trimInternal ( keywordLink . textContent . toLowerCase ( ) ) ) ;
82
+ }
83
+ var doi = "" ;
84
+ var doiElmt = doc . evaluate ( '/html/body/div/table/tbody/tr[4]/td/table/tbody/tr/td/table/tbody/tr[3]/td[2][@class="small-text"]/a' , doc , null , XPathResult . ANY_TYPE , null ) . iterateNext ( )
85
+ if ( doiElmt ) {
86
+ var match = doiElmt . textContent . match ( / o r g \/ ( .* ) / ) ;
87
+ if ( match ) {
88
+ doi = match [ 1 ] ;
89
+ }
90
+ }
91
+
92
+ Zotero . Utilities . HTTP . doGet ( "http://portal.acm.org/" + m [ 1 ] , function ( text ) {
93
+ // split() may no longer be necessary
94
+ var m = text . split ( / < \/ ? p r e [ ^ > ] * > / ig) ;
95
+ if ( m [ 1 ] ) {
96
+ var text = m [ 1 ] ;
97
+ }
98
+ // unescape HTML for extended characters
99
+ function unescapeHTML ( str , p1 ) {
100
+ return Zotero . Utilities . unescapeHTML ( "&#" + p1 ) ;
101
+ }
102
+ text = text . replace ( / \\ & \\ # ( [ ^ ; ] + ; ) / g, unescapeHTML ) ;
103
+ // load Refer translator
104
+ var translator = Zotero . loadTranslator ( "import" ) ;
105
+ translator . setTranslator ( "881f60f2-0802-411a-9228-ce5f47b64c7d" ) ;
106
+ translator . setString ( text ) ;
107
+ translator . setHandler ( "itemDone" , function ( obj , item ) {
108
+ if ( abstract ) item . abstractNote = abstract ;
109
+ item . attachments = attachments ;
110
+ item . tags = keywords ;
111
+ item . DOI = doi ;
112
+ item . url = doc . location . href ;
113
+ item . complete ( ) ;
114
+ } ) ;
115
+ translator . translate ( ) ;
116
+
117
+ getNext ( ) ;
118
+ } ) ;
119
+ }
120
+
121
+ function doWeb ( doc , url ) {
122
+ if ( url . indexOf ( "/results.cfm" ) != - 1 ) {
123
+ var items = Zotero . Utilities . getItemArray ( doc , doc , '^https?://[^/]+/citation.cfm\\?[^#]+$' ) ;
124
+
125
+ items = Zotero . selectItems ( items ) ;
126
+ if ( ! items ) return true ;
127
+
128
+ for ( var url in items ) {
129
+ urls . push ( url ) ;
130
+ }
131
+
132
+ getNext ( ) ;
133
+ } else {
134
+ scrape ( doc ) ;
135
+ }
136
+
137
+ Zotero . wait ( ) ;
138
+ }
0 commit comments