| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  | from flask_babel import gettext | 
					
						
							|  |  |  | import re | 
					
						
							| 
									
										
										
										
											2016-11-30 18:43:03 +01:00
										 |  |  | from searx.url_utils import urlparse, parse_qsl | 
					
						
							| 
									
										
										
										
											2017-09-22 23:43:05 +02:00
										 |  |  | from searx import settings | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | regex = re.compile(r'10\.\d{4,9}/[^\s]+') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 23:43:05 +02:00
										 |  |  | name = gettext('Open Access DOI rewrite') | 
					
						
							| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  | description = gettext('Avoid paywalls by redirecting to open-access versions of publications when available') | 
					
						
							|  |  |  | default_on = False | 
					
						
							| 
									
										
										
										
											2017-02-12 15:06:01 +01:00
										 |  |  | preference_section = 'privacy' | 
					
						
							| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 23:43:05 +02:00
										 |  |  | doi_resolvers = settings['doi_resolvers'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def extract_doi(url): | 
					
						
							|  |  |  |     match = regex.search(url.path) | 
					
						
							|  |  |  |     if match: | 
					
						
							|  |  |  |         return match.group(0) | 
					
						
							|  |  |  |     for _, v in parse_qsl(url.query): | 
					
						
							|  |  |  |         match = regex.search(v) | 
					
						
							|  |  |  |         if match: | 
					
						
							|  |  |  |             return match.group(0) | 
					
						
							|  |  |  |     return None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-01 13:58:48 +01:00
										 |  |  | def get_doi_resolver(args, preference_doi_resolver): | 
					
						
							| 
									
										
										
										
											2017-09-22 23:43:05 +02:00
										 |  |  |     doi_resolvers = settings['doi_resolvers'] | 
					
						
							| 
									
										
										
										
											2017-11-01 13:58:48 +01:00
										 |  |  |     doi_resolver = args.get('doi_resolver', preference_doi_resolver)[0] | 
					
						
							| 
									
										
										
										
											2017-09-22 23:43:05 +02:00
										 |  |  |     if doi_resolver not in doi_resolvers: | 
					
						
							|  |  |  |         doi_resolvers = settings['default_doi_resolver'] | 
					
						
							| 
									
										
										
										
											2017-11-01 13:58:48 +01:00
										 |  |  |     return doi_resolver | 
					
						
							| 
									
										
										
										
											2017-09-22 23:43:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-22 14:01:53 +02:00
										 |  |  | def on_result(request, search, result): | 
					
						
							|  |  |  |     doi = extract_doi(result['parsed_url']) | 
					
						
							| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  |     if doi and len(doi) < 50: | 
					
						
							|  |  |  |         for suffix in ('/', '.pdf', '/full', '/meta', '/abstract'): | 
					
						
							|  |  |  |             if doi.endswith(suffix): | 
					
						
							|  |  |  |                 doi = doi[:-len(suffix)] | 
					
						
							| 
									
										
										
										
											2017-11-01 13:58:48 +01:00
										 |  |  |         result['url'] = get_doi_resolver(request.args, request.preferences.get_value('doi_resolver')) + doi | 
					
						
							| 
									
										
										
										
											2016-11-14 17:25:21 +01:00
										 |  |  |         result['parsed_url'] = urlparse(result['url']) | 
					
						
							| 
									
										
										
										
											2016-07-16 11:26:29 +02:00
										 |  |  |     return True |