1 | var bitsPubmedCentralService = { |
---|
2 | _init : false, |
---|
3 | _threadID : 0, |
---|
4 | _mainThread : null, |
---|
5 | _backgroundThread : null, |
---|
6 | _stack : [], |
---|
7 | |
---|
8 | _capture : { |
---|
9 | confirm : false, |
---|
10 | substitution : { |
---|
11 | confirm : false, |
---|
12 | format : "MEDLINE.SO from PMC", |
---|
13 | }, |
---|
14 | }, |
---|
15 | |
---|
16 | get STRING() { return document.getElementById("MarkingCollectionOverlayString"); }, |
---|
17 | get UNICODE() { return Components.classes['@mozilla.org/intl/scriptableunicodeconverter'].getService(Components.interfaces.nsIScriptableUnicodeConverter); }, |
---|
18 | |
---|
19 | get Common() { return window.top.bitsObjectMng.Common; }, |
---|
20 | get Database() { return window.top.bitsObjectMng.Database; }, |
---|
21 | |
---|
22 | get mainThread() { return this._mainThread; }, |
---|
23 | get backgroundThread() { return this._backgroundThread; }, |
---|
24 | |
---|
25 | get SIDEBAR() { return window.top.document.getElementById("sidebar"); }, |
---|
26 | get SIDEBAR_WIN() {try{return this.SIDEBAR.contentWindow;}catch(e){return undefined;}}, |
---|
27 | get SIDEBAR_DOC() {try{return this.SIDEBAR.contentDocument;}catch(e){return undefined;}}, |
---|
28 | |
---|
29 | ///////////////////////////////////////////////////////////////////// |
---|
30 | init : function(aEvent){ |
---|
31 | if(!this._init){ |
---|
32 | var info = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo); |
---|
33 | this._app_version = parseInt(info.version); |
---|
34 | if(this._app_version>=3){ |
---|
35 | this._capture.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.confirm", true); |
---|
36 | this._capture.substitution.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.substitution.confirm", true); |
---|
37 | var format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format"); |
---|
38 | if(format == null) nsPreferences.setUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format", this._capture.substitution.format); |
---|
39 | |
---|
40 | this._mainThread = Components.classes["@mozilla.org/thread-manager;1"].getService().mainThread; |
---|
41 | } |
---|
42 | this._init = true; |
---|
43 | } |
---|
44 | }, |
---|
45 | |
---|
46 | ///////////////////////////////////////////////////////////////////// |
---|
47 | done : function(aEvent){ |
---|
48 | if(this._backgroundThread) delete this._backgroundThread; |
---|
49 | if(this._mainThread) delete this._mainThread; |
---|
50 | }, |
---|
51 | |
---|
52 | ///////////////////////////////////////////////////////////////////// |
---|
53 | formatPMCID : function(aPMCID){ |
---|
54 | try{ |
---|
55 | if(!aPMCID) return undefined; |
---|
56 | if(aPMCID.match(/^\d+$/)) aPMCID = "PMC"+aPMCID; |
---|
57 | if(!aPMCID.match(/^PMC\d+$/)) return undefined; |
---|
58 | return aPMCID; |
---|
59 | }catch(err){ |
---|
60 | this._dump("bitsPubmedCentralService.getExtensionDir():"+err); |
---|
61 | return undefined; |
---|
62 | } |
---|
63 | }, |
---|
64 | |
---|
65 | ///////////////////////////////////////////////////////////////////// |
---|
66 | getExtensionDir : function(aPMCID){ |
---|
67 | try{ |
---|
68 | aPMCID = this.formatPMCID(aPMCID); |
---|
69 | if(!aPMCID) return undefined; |
---|
70 | var extensionDir = this.Common.getExtensionDir().clone(); |
---|
71 | extensionDir.append("PubmedCentral"); |
---|
72 | var arr = aPMCID.split(""); |
---|
73 | while(arr.length>0){ |
---|
74 | extensionDir.append(arr.shift()); |
---|
75 | } |
---|
76 | return extensionDir; |
---|
77 | }catch(err){ |
---|
78 | this._dump("bitsPubmedCentralService.getExtensionDir():"+err); |
---|
79 | return undefined; |
---|
80 | } |
---|
81 | }, |
---|
82 | |
---|
83 | ///////////////////////////////////////////////////////////////////// |
---|
84 | getPubmedInfo : function(aObject){ |
---|
85 | this._capture.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.confirm", true); |
---|
86 | this._capture.substitution.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.substitution.confirm", true); |
---|
87 | this._capture.substitution.format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format"); |
---|
88 | if(!this._capture.confirm) return; |
---|
89 | if(!aObject) return; |
---|
90 | if(!aObject.con_url.match(/^http:\/\/www\.pubmedcentral\.nih\.gov\/.+?\?artid=(\d+)/) && !aObject.con_url.match(/^http:\/\/www\.ncbi\.nlm\.nih\.gov\/pmc\/articles\/([^\/]+)/)) return; |
---|
91 | var pmcid = RegExp.$1; |
---|
92 | pmcid = this.formatPMCID(pmcid); |
---|
93 | this.execThread(pmcid,function(aResult){ |
---|
94 | if(!aObject.oid_property) aObject.oid_property = '<PROPERTY/>'; |
---|
95 | var parser = new DOMParser(); |
---|
96 | var xml_property = parser.parseFromString(aObject.oid_property, "text/xml"); |
---|
97 | parser = undefined; |
---|
98 | var extras_msg = xml_property.getElementsByTagName("EXTENDED_MESSAGE")[0]; |
---|
99 | if(!extras_msg){ |
---|
100 | extras_msg = xml_property.createElement("EXTENDED_MESSAGE"); |
---|
101 | xml_property.documentElement.appendChild(extras_msg); |
---|
102 | } |
---|
103 | elem_medline = xml_property.createElement("MEDLINE"); |
---|
104 | extras_msg.appendChild(elem_medline); |
---|
105 | if(aResult.medline.PMID){ |
---|
106 | var elem_pmid = xml_property.createElement("PMID"); |
---|
107 | elem_pmid.appendChild(xml_property.createTextNode(aResult.medline.PMID)); |
---|
108 | elem_medline.appendChild(elem_pmid); |
---|
109 | } |
---|
110 | if(aResult.medline.SO){ |
---|
111 | var elem_so = xml_property.createElement("SO"); |
---|
112 | elem_so.appendChild(xml_property.createTextNode(aResult.medline.SO)); |
---|
113 | elem_medline.appendChild(elem_so); |
---|
114 | } |
---|
115 | aResult.medline.PMCID = pmcid; |
---|
116 | var elem_pmcid = xml_property.createElement("PMCID"); |
---|
117 | elem_pmcid.appendChild(xml_property.createTextNode(pmcid)); |
---|
118 | elem_medline.appendChild(elem_pmcid); |
---|
119 | var s = new XMLSerializer(); |
---|
120 | aObject.oid_property = s.serializeToString(xml_property); |
---|
121 | s = undefined; |
---|
122 | if(bitsPubmedCentralService._capture.substitution.confirm){ |
---|
123 | var keys_arr = []; |
---|
124 | for(var key in aResult.medline){ |
---|
125 | keys_arr.push(key); |
---|
126 | } |
---|
127 | keys_arr.sort(); |
---|
128 | keys_arr.sort(function(a,b){return b.length-a.length;}); |
---|
129 | var format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format"); |
---|
130 | for(var i=0;i<keys_arr.length;i++){ |
---|
131 | var regexp = new RegExp("MEDLINE\\."+keys_arr[i],"g"); |
---|
132 | format = format.replace(regexp,aResult.medline[keys_arr[i]]); |
---|
133 | } |
---|
134 | aObject.doc_title = format; |
---|
135 | } |
---|
136 | var dbtype = aObject.dbtype; |
---|
137 | delete aObject.dbtype; |
---|
138 | delete aObject.fid_style; |
---|
139 | delete aObject.fid_title; |
---|
140 | delete aObject.folder_order; |
---|
141 | bitsPubmedCentralService.Database.updateObject(aObject,dbtype); |
---|
142 | setTimeout(function(){ |
---|
143 | aObject.dbtype = dbtype; |
---|
144 | var contentWindow = bitsPubmedCentralService.SIDEBAR_WIN; |
---|
145 | var contentDocument = bitsPubmedCentralService.SIDEBAR_DOC; |
---|
146 | var mcTreeHandler = null; |
---|
147 | if(contentWindow && contentWindow.mcPropertyView) mcPropertyView = contentWindow.mcPropertyView; |
---|
148 | if(mcPropertyView && mcPropertyView._id == aObject.oid && mcPropertyView._dbtype == aObject.dbtype){ |
---|
149 | mcPropertyView.dispProperty(aObject); |
---|
150 | } |
---|
151 | },500); |
---|
152 | }) |
---|
153 | }, |
---|
154 | |
---|
155 | ///////////////////////////////////////////////////////////////////// |
---|
156 | getPubmedInfoSync : function(aObject){ |
---|
157 | this._capture.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.confirm", true); |
---|
158 | this._capture.substitution.confirm = nsPreferences.getBoolPref("wiredmarker.pubmedcentral.capture.substitution.confirm", true); |
---|
159 | this._capture.substitution.format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format"); |
---|
160 | if(!this._capture.confirm) return aObject; |
---|
161 | if(!aObject) return aObject; |
---|
162 | if(!aObject.con_url.match(/^http:\/\/www\.pubmedcentral\.nih\.gov\/.+?\?artid=(\d+)/) && !aObject.con_url.match(/^http:\/\/www\.ncbi\.nlm\.nih\.gov\/pmc\/articles\/([^\/]+)/)) return; |
---|
163 | var pmcid = RegExp.$1; |
---|
164 | pmcid = this.formatPMCID(pmcid); |
---|
165 | var aResult = this.execThread(pmcid); |
---|
166 | if(!aObject.oid_property) aObject.oid_property = '<PROPERTY/>'; |
---|
167 | var parser = new DOMParser(); |
---|
168 | var xml_property = parser.parseFromString(aObject.oid_property, "text/xml"); |
---|
169 | parser = undefined; |
---|
170 | var extras_msg = xml_property.getElementsByTagName("EXTENDED_MESSAGE")[0]; |
---|
171 | if(!extras_msg){ |
---|
172 | extras_msg = xml_property.createElement("EXTENDED_MESSAGE"); |
---|
173 | xml_property.documentElement.appendChild(extras_msg); |
---|
174 | } |
---|
175 | elem_medline = xml_property.createElement("MEDLINE"); |
---|
176 | extras_msg.appendChild(elem_medline); |
---|
177 | if(aResult.medline.PMID){ |
---|
178 | var elem_pmid = xml_property.createElement("PMID"); |
---|
179 | elem_pmid.appendChild(xml_property.createTextNode(aResult.medline.PMID)); |
---|
180 | elem_medline.appendChild(elem_pmid); |
---|
181 | } |
---|
182 | if(aResult.medline.SO){ |
---|
183 | var elem_so = xml_property.createElement("SO"); |
---|
184 | elem_so.appendChild(xml_property.createTextNode(aResult.medline.SO)); |
---|
185 | elem_medline.appendChild(elem_so); |
---|
186 | } |
---|
187 | aResult.medline.PMCID = pmcid; |
---|
188 | var elem_pmcid = xml_property.createElement("PMCID"); |
---|
189 | elem_pmcid.appendChild(xml_property.createTextNode(pmcid)); |
---|
190 | elem_medline.appendChild(elem_pmcid); |
---|
191 | var s = new XMLSerializer(); |
---|
192 | aObject.oid_property = s.serializeToString(xml_property); |
---|
193 | s = undefined; |
---|
194 | if(bitsPubmedCentralService._capture.substitution.confirm){ |
---|
195 | var keys_arr = []; |
---|
196 | for(var key in aResult.medline){ |
---|
197 | keys_arr.push(key); |
---|
198 | } |
---|
199 | keys_arr.sort(); |
---|
200 | keys_arr.sort(function(a,b){return b.length-a.length;}); |
---|
201 | var format = nsPreferences.copyUnicharPref("wiredmarker.pubmedcentral.capture.substitution.format"); |
---|
202 | for(var i=0;i<keys_arr.length;i++){ |
---|
203 | var regexp = new RegExp("MEDLINE\\."+keys_arr[i],"g"); |
---|
204 | format = format.replace(regexp,aResult.medline[keys_arr[i]]); |
---|
205 | } |
---|
206 | aObject.doc_title = format; |
---|
207 | } |
---|
208 | return aObject; |
---|
209 | }, |
---|
210 | |
---|
211 | ///////////////////////////////////////////////////////////////////// |
---|
212 | execThread : function(aPMCID,aCB){ |
---|
213 | //Threadã䜿çšããªã |
---|
214 | if(aCB){ |
---|
215 | setTimeout(function(){ |
---|
216 | var func = new bitsPubmedCentralServiceFunc(aPMCID,aCB); |
---|
217 | var aResult = func.run(); |
---|
218 | if(aCB) (aCB)(aResult); |
---|
219 | },0); |
---|
220 | return; |
---|
221 | }else{ |
---|
222 | var func = new bitsPubmedCentralServiceFunc(aPMCID,aCB); |
---|
223 | var aResult = func.run(); |
---|
224 | return aResult; |
---|
225 | } |
---|
226 | //Threadã䜿çšãã |
---|
227 | if(!this._mainThread) return; |
---|
228 | this._threadID++; |
---|
229 | if(this._backgroundThread){ |
---|
230 | this._stack.push({pmcid : aPMCID, callback : aCB}); |
---|
231 | }else{ |
---|
232 | this._backgroundThread = Components.classes["@mozilla.org/thread-manager;1"].getService().newThread(0); |
---|
233 | this.backgroundThread.dispatch(new bitsPubmedCentralServiceWorkingThread(this._threadID, aPMCID, aCB), this.backgroundThread.DISPATCH_NORMAL); |
---|
234 | } |
---|
235 | }, |
---|
236 | |
---|
237 | ///////////////////////////////////////////////////////////////////// |
---|
238 | exitThread : function(aResult,aCB){ |
---|
239 | if(this._backgroundThread) delete this._backgroundThread; |
---|
240 | this._backgroundThread = null; |
---|
241 | if(aCB) (aCB)(aResult); |
---|
242 | if(this._stack.length){ |
---|
243 | var stack = this._stack.shift(); |
---|
244 | this.execThread(stack.pmcid,stack.callback); |
---|
245 | } |
---|
246 | }, |
---|
247 | |
---|
248 | ///////////////////////////////////////////////////////////////////// |
---|
249 | _dump : function(aString){ |
---|
250 | window.top.bitsMarkingCollection._dump(aString); |
---|
251 | }, |
---|
252 | }; |
---|
253 | |
---|
254 | ///////////////////////////////////////////////////////////////////// |
---|
255 | var bitsPubmedCentralServiceFunc = function(aPMCID, aCB) { |
---|
256 | this.pmcid = aPMCID; |
---|
257 | this.callback = aCB; //äºææ§ã®çºãå®éã«ã¯äœ¿çšããªã |
---|
258 | this.result = 0; |
---|
259 | }; |
---|
260 | |
---|
261 | bitsPubmedCentralServiceFunc.prototype = { |
---|
262 | getText : function(pUrl){ |
---|
263 | var text = null; |
---|
264 | try{ |
---|
265 | var xmlhttp = new XMLHttpRequest(); |
---|
266 | if(xmlhttp){ |
---|
267 | xmlhttp.open("GET",pUrl,false); |
---|
268 | xmlhttp.send(null); |
---|
269 | if(xmlhttp.status == 200){ |
---|
270 | if(xmlhttp.responseText.length >0) return xmlhttp.responseText; |
---|
271 | }else{ |
---|
272 | bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.getText():error=["+ req.status +" "+ req.statusText+"]"); |
---|
273 | } |
---|
274 | } |
---|
275 | }catch(err){ |
---|
276 | Components.utils.reportError(err); |
---|
277 | } |
---|
278 | return undefined; |
---|
279 | }, |
---|
280 | |
---|
281 | getXML : function(pUrl){ |
---|
282 | var xmldoc = null; |
---|
283 | try{ |
---|
284 | var responseText = this.getText(pUrl); |
---|
285 | if(responseText){ |
---|
286 | var parser = new DOMParser(); |
---|
287 | xmldoc = parser.parseFromString(responseText, "text/xml"); |
---|
288 | parser = undefined; |
---|
289 | } |
---|
290 | }catch(err){ |
---|
291 | Components.utils.reportError(err); |
---|
292 | } |
---|
293 | return xmldoc; |
---|
294 | }, |
---|
295 | |
---|
296 | searchNCBI : function(aPMCID){ |
---|
297 | aPMCID = bitsPubmedCentralService.formatPMCID(aPMCID); |
---|
298 | if(!aPMCID) return undefined; |
---|
299 | const getURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="; |
---|
300 | var url = getURL + aPMCID; |
---|
301 | var xmldoc = this.getXML(url); |
---|
302 | if(!xmldoc) return undefined; |
---|
303 | var elemId = xmldoc.getElementsByTagName("Id")[0]; |
---|
304 | if(elemId){ |
---|
305 | return elemId.textContent; |
---|
306 | }else{ |
---|
307 | return undefined; |
---|
308 | } |
---|
309 | }, |
---|
310 | |
---|
311 | fetchNCBI : function(aPMID, aRetmode){ |
---|
312 | const getMEDLINEURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=text&rettype=medline&id="; |
---|
313 | const getXMLURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id="; |
---|
314 | if(!aRetmode || aRetmode == 'xml'){ |
---|
315 | return this.getXML(getXMLURL + aPMID); |
---|
316 | }else{ |
---|
317 | return this.getText(getMEDLINEURL + aPMID); |
---|
318 | } |
---|
319 | return undefined; |
---|
320 | }, |
---|
321 | |
---|
322 | convertFormUnicode : function(aString, aCharset){ |
---|
323 | if(!aString) return ""; |
---|
324 | try { |
---|
325 | bitsPubmedCentralService.UNICODE.charset = aCharset; |
---|
326 | aString = bitsPubmedCentralService.UNICODE.ConvertFromUnicode(aString); |
---|
327 | }catch(ex){} |
---|
328 | return aString; |
---|
329 | }, |
---|
330 | |
---|
331 | convertToUnicode : function(aString, aCharset){ |
---|
332 | if(!aString) return ""; |
---|
333 | try { |
---|
334 | bitsPubmedCentralService.UNICODE.charset = aCharset; |
---|
335 | aString = bitsPubmedCentralService.UNICODE.ConvertToUnicode(aString); |
---|
336 | }catch(ex){} |
---|
337 | return aString; |
---|
338 | }, |
---|
339 | |
---|
340 | writeFile : function(aFile, aContent){ |
---|
341 | if(aFile.exists()) aFile.remove(false); |
---|
342 | try { |
---|
343 | aFile.create(aFile.NORMAL_FILE_TYPE, 0666); |
---|
344 | var content = this.convertFormUnicode(aContent,"UTF-8"); |
---|
345 | var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream); |
---|
346 | ostream.init(aFile, 2, 0x200, false); |
---|
347 | ostream.write(content, content.length); |
---|
348 | ostream.close(); |
---|
349 | }catch(ex){ |
---|
350 | bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: Failed to write file: " + aFile.path + "["+ ex + "]"); |
---|
351 | } |
---|
352 | }, |
---|
353 | |
---|
354 | readFile : function(aFile){ |
---|
355 | if(!aFile || !aFile.exists()) return undefined; |
---|
356 | try { |
---|
357 | var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream); |
---|
358 | istream.init(aFile, 1, 0, false); |
---|
359 | var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream); |
---|
360 | sstream.init(istream); |
---|
361 | var content = sstream.read(sstream.available()); |
---|
362 | sstream.close(); |
---|
363 | istream.close(); |
---|
364 | content = this.convertToUnicode(content,"UTF-8"); |
---|
365 | return content; |
---|
366 | }catch(ex){ |
---|
367 | bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: readFile():" + ex); |
---|
368 | return undefined; |
---|
369 | } |
---|
370 | }, |
---|
371 | |
---|
372 | createXMLDocument : function(aXMLFile){ |
---|
373 | if(!aXMLFile) return undefined; |
---|
374 | try{ |
---|
375 | var fileContents = this.readFile(aXMLFile); |
---|
376 | var parser = new DOMParser(); |
---|
377 | var xmlDocument = parser.parseFromString(fileContents, "text/xml"); |
---|
378 | parser = undefined; |
---|
379 | return xmlDocument; |
---|
380 | }catch(ex){ |
---|
381 | bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.createXMLDocument():"+ ex); |
---|
382 | return undefined; |
---|
383 | } |
---|
384 | }, |
---|
385 | |
---|
386 | analysisMedline : function(aMedline){ |
---|
387 | if(!aMedline) return undefined; |
---|
388 | try{ |
---|
389 | var rtn = {}; |
---|
390 | var arr = aMedline.replace(/\x0D\x0A|\x0D|\x0A/g,"\n").split("\n"); |
---|
391 | var key = ""; |
---|
392 | var val = ""; |
---|
393 | for(var i=0;i<arr.length;i++){ |
---|
394 | if(arr[i].match(/^([A-Z]+)\s*\-\s(.+)$/)){ |
---|
395 | key = RegExp.$1; |
---|
396 | val = RegExp.$2; |
---|
397 | if(rtn[key]){ |
---|
398 | if(typeof rtn[key] == "string"){ |
---|
399 | var oldval = rtn[key]; |
---|
400 | rtn[key] = [oldval]; |
---|
401 | } |
---|
402 | rtn[key].push(val); |
---|
403 | }else{ |
---|
404 | rtn[key] = val; |
---|
405 | } |
---|
406 | }else if(arr[i].match(/^\s+?(\S.+)$/)){ |
---|
407 | val = RegExp.$1; |
---|
408 | rtn[key] += ' ' + val; |
---|
409 | rtn[key] = rtn[key].replace(/\s{2,}/g," "); |
---|
410 | } |
---|
411 | } |
---|
412 | return rtn; |
---|
413 | }catch(ex){ |
---|
414 | bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.analysisMedline():"+ ex); |
---|
415 | return undefined; |
---|
416 | } |
---|
417 | }, |
---|
418 | |
---|
419 | run : function() { |
---|
420 | try { |
---|
421 | var xmldoc = null; |
---|
422 | var medline = null; |
---|
423 | var xmlFile = bitsPubmedCentralService.getExtensionDir(this.pmcid); |
---|
424 | var medlineFile = xmlFile.clone(); |
---|
425 | xmlFile.append(this.pmcid+".xml"); |
---|
426 | medlineFile.append(this.pmcid+".txt"); |
---|
427 | if(!xmlFile.exists()){ |
---|
428 | var pmid = this.searchNCBI(this.pmcid); |
---|
429 | if(pmid){ |
---|
430 | xmldoc = this.fetchNCBI(pmid); |
---|
431 | if(xmldoc){ |
---|
432 | var s = new XMLSerializer(); |
---|
433 | var xml = s.serializeToString(xmldoc); |
---|
434 | s = undefined; |
---|
435 | this.writeFile(xmlFile, xml+"\n","UTF-8"); |
---|
436 | } |
---|
437 | medline = this.fetchNCBI(pmid,'text'); |
---|
438 | if(medline) this.writeFile(medlineFile, medline,"UTF-8"); |
---|
439 | } |
---|
440 | }else{ |
---|
441 | xmldoc = this.createXMLDocument(xmlFile); |
---|
442 | medline = this.readFile(medlineFile); |
---|
443 | } |
---|
444 | if(medline) medline = this.analysisMedline(medline); |
---|
445 | this.result = { |
---|
446 | xmldoc : xmldoc, |
---|
447 | medline : medline, |
---|
448 | }; |
---|
449 | return this.result; |
---|
450 | |
---|
451 | }catch(err){ |
---|
452 | Components.utils.reportError(err); |
---|
453 | } |
---|
454 | } |
---|
455 | }; |
---|
456 | |
---|
457 | ///////////////////////////////////////////////////////////////////// |
---|
458 | var bitsPubmedCentralServiceMainThread = function(threadID, aResult, aCB) { |
---|
459 | this.threadID = threadID; |
---|
460 | this.result = aResult; |
---|
461 | this.callback = aCB; |
---|
462 | }; |
---|
463 | |
---|
464 | bitsPubmedCentralServiceMainThread.prototype = { |
---|
465 | run: function() { |
---|
466 | try { |
---|
467 | // ããã§ã¯ãŒãã³ã°ã¹ã¬ããã®å®äºã«å¯ŸããŠåå¿ãè¿ã |
---|
468 | bitsPubmedCentralService.exitThread(this.result,this.callback); |
---|
469 | }catch(err){ |
---|
470 | Components.utils.reportError(err); |
---|
471 | } |
---|
472 | }, |
---|
473 | |
---|
474 | QueryInterface: function(iid) { |
---|
475 | if( iid.equals(Components.interfaces.nsIRunnable) || |
---|
476 | iid.equals(Components.interfaces.nsISupports)) { |
---|
477 | return this; |
---|
478 | } |
---|
479 | throw Components.results.NS_ERROR_NO_INTERFACE; |
---|
480 | } |
---|
481 | }; |
---|
482 | |
---|
483 | ///////////////////////////////////////////////////////////////////// |
---|
484 | var bitsPubmedCentralServiceWorkingThread = function(threadID, aPMCID, aCB) { |
---|
485 | this.threadID = threadID; |
---|
486 | this.pmcid = aPMCID; |
---|
487 | this.callback = aCB; |
---|
488 | this.result = 0; |
---|
489 | }; |
---|
490 | |
---|
491 | bitsPubmedCentralServiceWorkingThread.prototype = { |
---|
492 | getText : function(pUrl){ |
---|
493 | var text = null; |
---|
494 | try{ |
---|
495 | var xmlhttp = new XMLHttpRequest(); |
---|
496 | if(xmlhttp){ |
---|
497 | xmlhttp.open("GET",pUrl,false); |
---|
498 | xmlhttp.send(null); |
---|
499 | if(xmlhttp.status == 200){ |
---|
500 | if(xmlhttp.responseText.length >0) return xmlhttp.responseText; |
---|
501 | }else{ |
---|
502 | bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.getText():error=["+ req.status +" "+ req.statusText+"]"); |
---|
503 | } |
---|
504 | } |
---|
505 | }catch(err){ |
---|
506 | Components.utils.reportError(err); |
---|
507 | } |
---|
508 | return undefined; |
---|
509 | }, |
---|
510 | |
---|
511 | getXML : function(pUrl){ |
---|
512 | var xmldoc = null; |
---|
513 | try{ |
---|
514 | var responseText = this.getText(pUrl); |
---|
515 | if(responseText){ |
---|
516 | var parser = new DOMParser(); |
---|
517 | xmldoc = parser.parseFromString(responseText, "text/xml"); |
---|
518 | parser = undefined; |
---|
519 | } |
---|
520 | }catch(err){ |
---|
521 | Components.utils.reportError(err); |
---|
522 | } |
---|
523 | return xmldoc; |
---|
524 | }, |
---|
525 | |
---|
526 | searchNCBI : function(aPMCID){ |
---|
527 | aPMCID = bitsPubmedCentralService.formatPMCID(aPMCID); |
---|
528 | if(!aPMCID) return undefined; |
---|
529 | const getURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term="; |
---|
530 | var url = getURL + aPMCID; |
---|
531 | var xmldoc = this.getXML(url); |
---|
532 | if(!xmldoc) return undefined; |
---|
533 | var elemId = xmldoc.getElementsByTagName("Id")[0]; |
---|
534 | if(elemId){ |
---|
535 | return elemId.textContent; |
---|
536 | }else{ |
---|
537 | return undefined; |
---|
538 | } |
---|
539 | }, |
---|
540 | |
---|
541 | fetchNCBI : function(aPMID, aRetmode){ |
---|
542 | const getMEDLINEURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=text&rettype=medline&id="; |
---|
543 | const getXMLURL = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&retmode=xml&id="; |
---|
544 | if(!aRetmode || aRetmode == 'xml'){ |
---|
545 | return this.getXML(getXMLURL + aPMID); |
---|
546 | }else{ |
---|
547 | return this.getText(getMEDLINEURL + aPMID); |
---|
548 | } |
---|
549 | return undefined; |
---|
550 | }, |
---|
551 | |
---|
552 | convertFormUnicode : function(aString, aCharset){ |
---|
553 | if(!aString) return ""; |
---|
554 | try { |
---|
555 | bitsPubmedCentralService.UNICODE.charset = aCharset; |
---|
556 | aString = bitsPubmedCentralService.UNICODE.ConvertFromUnicode(aString); |
---|
557 | }catch(ex){} |
---|
558 | return aString; |
---|
559 | }, |
---|
560 | |
---|
561 | convertToUnicode : function(aString, aCharset){ |
---|
562 | if(!aString) return ""; |
---|
563 | try { |
---|
564 | bitsPubmedCentralService.UNICODE.charset = aCharset; |
---|
565 | aString = bitsPubmedCentralService.UNICODE.ConvertToUnicode(aString); |
---|
566 | }catch(ex){} |
---|
567 | return aString; |
---|
568 | }, |
---|
569 | |
---|
570 | writeFile : function(aFile, aContent){ |
---|
571 | if(aFile.exists()) aFile.remove(false); |
---|
572 | try { |
---|
573 | aFile.create(aFile.NORMAL_FILE_TYPE, 0666); |
---|
574 | var content = this.convertFormUnicode(aContent,"UTF-8"); |
---|
575 | var ostream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream); |
---|
576 | ostream.init(aFile, 2, 0x200, false); |
---|
577 | ostream.write(content, content.length); |
---|
578 | ostream.close(); |
---|
579 | }catch(ex){ |
---|
580 | bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: Failed to write file: " + aFile.path + "["+ ex + "]"); |
---|
581 | } |
---|
582 | }, |
---|
583 | |
---|
584 | readFile : function(aFile){ |
---|
585 | if(!aFile || !aFile.exists()) return undefined; |
---|
586 | try { |
---|
587 | var istream = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream); |
---|
588 | istream.init(aFile, 1, 0, false); |
---|
589 | var sstream = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream); |
---|
590 | sstream.init(istream); |
---|
591 | var content = sstream.read(sstream.available()); |
---|
592 | sstream.close(); |
---|
593 | istream.close(); |
---|
594 | content = this.convertToUnicode(content,"UTF-8"); |
---|
595 | return content; |
---|
596 | }catch(ex){ |
---|
597 | bitsPubmedCentralService._dump("bitsPubmedCentralService ERROR: readFile():" + ex); |
---|
598 | return undefined; |
---|
599 | } |
---|
600 | }, |
---|
601 | |
---|
602 | createXMLDocument : function(aXMLFile){ |
---|
603 | if(!aXMLFile) return undefined; |
---|
604 | try{ |
---|
605 | var fileContents = this.readFile(aXMLFile); |
---|
606 | var parser = new DOMParser(); |
---|
607 | var xmlDocument = parser.parseFromString(fileContents, "text/xml"); |
---|
608 | parser = undefined; |
---|
609 | return xmlDocument; |
---|
610 | }catch(ex){ |
---|
611 | bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.createXMLDocument():"+ ex); |
---|
612 | return undefined; |
---|
613 | } |
---|
614 | }, |
---|
615 | |
---|
616 | analysisMedline : function(aMedline){ |
---|
617 | if(!aMedline) return undefined; |
---|
618 | try{ |
---|
619 | var rtn = {}; |
---|
620 | var arr = aMedline.replace(/\x0D\x0A|\x0D|\x0A/g,"\n").split("\n"); |
---|
621 | var key = ""; |
---|
622 | var val = ""; |
---|
623 | for(var i=0;i<arr.length;i++){ |
---|
624 | if(arr[i].match(/^([A-Z]+)\s*\-\s(.+)$/)){ |
---|
625 | key = RegExp.$1; |
---|
626 | val = RegExp.$2; |
---|
627 | if(rtn[key]){ |
---|
628 | if(typeof rtn[key] == "string"){ |
---|
629 | var oldval = rtn[key]; |
---|
630 | rtn[key] = [oldval]; |
---|
631 | } |
---|
632 | rtn[key].push(val); |
---|
633 | }else{ |
---|
634 | rtn[key] = val; |
---|
635 | } |
---|
636 | }else if(arr[i].match(/^\s+?(\S.+)$/)){ |
---|
637 | val = RegExp.$1; |
---|
638 | rtn[key] += ' ' + val; |
---|
639 | rtn[key] = rtn[key].replace(/\s{2,}/g," "); |
---|
640 | } |
---|
641 | } |
---|
642 | return rtn; |
---|
643 | }catch(ex){ |
---|
644 | bitsPubmedCentralService._dump("bitsPubmedCentralServiceWorkingThread.analysisMedline():"+ ex); |
---|
645 | return undefined; |
---|
646 | } |
---|
647 | }, |
---|
648 | |
---|
649 | run : function() { |
---|
650 | try { |
---|
651 | // ããã§ã¯ãŒãã³ã°ã¹ã¬ãããåŠçãè¡ã |
---|
652 | var xmldoc = null; |
---|
653 | var medline = null; |
---|
654 | var xmlFile = bitsPubmedCentralService.getExtensionDir(this.pmcid); |
---|
655 | var medlineFile = xmlFile.clone(); |
---|
656 | xmlFile.append(this.pmcid+".xml"); |
---|
657 | medlineFile.append(this.pmcid+".txt"); |
---|
658 | if(!xmlFile.exists()){ |
---|
659 | var pmid = this.searchNCBI(this.pmcid); |
---|
660 | if(pmid){ |
---|
661 | xmldoc = this.fetchNCBI(pmid); |
---|
662 | if(xmldoc){ |
---|
663 | var s = new XMLSerializer(); |
---|
664 | var xml = s.serializeToString(xmldoc); |
---|
665 | s = undefined; |
---|
666 | this.writeFile(xmlFile, xml+"\n","UTF-8"); |
---|
667 | } |
---|
668 | medline = this.fetchNCBI(pmid,'text'); |
---|
669 | if(medline) this.writeFile(medlineFile, medline,"UTF-8"); |
---|
670 | } |
---|
671 | }else{ |
---|
672 | xmldoc = this.createXMLDocument(xmlFile); |
---|
673 | medline = this.readFile(medlineFile); |
---|
674 | } |
---|
675 | if(medline) medline = this.analysisMedline(medline); |
---|
676 | this.result = { |
---|
677 | xmldoc : xmldoc, |
---|
678 | medline : medline, |
---|
679 | }; |
---|
680 | // åŠçãçµäºããããçµäºãç¥ãããããã«ã¡ã€ã³ã¹ã¬ããã«ã³ãŒã«ããã¯ãã |
---|
681 | bitsPubmedCentralService.mainThread.dispatch(new bitsPubmedCentralServiceMainThread(this.threadID, this.result, this.callback), bitsPubmedCentralService.backgroundThread.DISPATCH_NORMAL); |
---|
682 | }catch(err){ |
---|
683 | Components.utils.reportError(err); |
---|
684 | } |
---|
685 | }, |
---|
686 | |
---|
687 | QueryInterface : function(iid) { |
---|
688 | if( iid.equals(Components.interfaces.nsIRunnable) || |
---|
689 | iid.equals(Components.interfaces.nsISupports)) { |
---|
690 | return this; |
---|
691 | } |
---|
692 | throw Components.results.NS_ERROR_NO_INTERFACE; |
---|
693 | } |
---|
694 | }; |
---|