Browse Source

[enh] infoboxes : if the result doesn't contain anything except one link, use the normal result template

dalf 10 years ago
parent
commit
cac1761a54
2 changed files with 57 additions and 28 deletions
  1. 17
    10
      searx/engines/duckduckgo_definitions.py
  2. 40
    18
      searx/engines/wikidata.py

+ 17
- 10
searx/engines/duckduckgo_definitions.py View File

@@ -116,15 +116,22 @@ def response(resp):
116 116
 
117 117
     if len(heading)>0:
118 118
         # TODO get infobox.meta.value where .label='article_title'
119
-        results.append({
120
-               'infobox': heading,
121
-               'id': infobox_id,
122
-               'entity': entity,
123
-               'content': content,
124
-               'img_src' : image,
125
-               'attributes': attributes,
126
-               'urls': urls,
127
-               'relatedTopics': relatedTopics
128
-               })
119
+        if image==None and len(attributes)==0 and len(urls)==1 and len(relatedTopics)==0 and len(content)==0:
120
+            results.append({
121
+                    'url': urls[0]['url'],
122
+                    'title': heading,
123
+                    'content': content
124
+                    })
125
+        else:
126
+            results.append({
127
+                    'infobox': heading,
128
+                    'id': infobox_id,
129
+                    'entity': entity,
130
+                    'content': content,
131
+                    'img_src' : image,
132
+                    'attributes': attributes,
133
+                    'urls': urls,
134
+                    'relatedTopics': relatedTopics
135
+                    })
129 136
 
130 137
     return results

+ 40
- 18
searx/engines/wikidata.py View File

@@ -33,17 +33,20 @@ def response(resp):
33 33
     return results
34 34
 
35 35
 def getDetail(jsonresponse, wikidata_id, language):
36
+    results = []
37
+    urls = []
38
+    attributes = []
39
+
36 40
     result = jsonresponse.get('entities', {}).get(wikidata_id, {})
37 41
 
38 42
     title = result.get('labels', {}).get(language, {}).get('value', None)
39 43
     if title == None:
40
-        title = result.get('labels', {}).get('en', {}).get('value', wikidata_id)
41
-    results = []
42
-    urls = []
43
-    attributes = []
44
+        title = result.get('labels', {}).get('en', {}).get('value', None)
45
+    if title == None:
46
+        return results
44 47
 
45
-    description = result.get('descriptions', {}).get(language, {}).get('value', '')
46
-    if description == '':
48
+    description = result.get('descriptions', {}).get(language, {}).get('value', None)
49
+    if description == None:
47 50
         description = result.get('descriptions', {}).get('en', {}).get('value', '')
48 51
 
49 52
     claims = result.get('claims', {})
@@ -52,11 +55,16 @@ def getDetail(jsonresponse, wikidata_id, language):
52 55
         urls.append({ 'title' : 'Official site', 'url': official_website })
53 56
         results.append({ 'title': title, 'url' : official_website })
54 57
 
58
+    wikipedia_link_count = 0
55 59
     if language != 'en':
56
-        add_url(urls, 'Wikipedia (' + language + ')', get_wikilink(result, language + 'wiki'))
60
+        wikipedia_link_count += add_url(urls, 'Wikipedia (' + language + ')', get_wikilink(result, language + 'wiki'))
57 61
     wikipedia_en_link = get_wikilink(result, 'enwiki')
58
-    add_url(urls, 'Wikipedia (en)', wikipedia_en_link)
59
-
62
+    wikipedia_link_count += add_url(urls, 'Wikipedia (en)', wikipedia_en_link)
63
+    if wikipedia_link_count == 0:
64
+        misc_language = get_wiki_firstlanguage(result, 'wiki')
65
+        if misc_language != None:
66
+            add_url(urls, 'Wikipedia (' + misc_language + ')', get_wikilink(result, misc_language + 'wiki'))
67
+        
60 68
     if language != 'en':
61 69
         add_url(urls, 'Wiki voyage (' + language + ')', get_wikilink(result, language + 'wikivoyage'))
62 70
     add_url(urls, 'Wiki voyage (en)', get_wikilink(result, 'enwikivoyage'))
@@ -105,14 +113,20 @@ def getDetail(jsonresponse, wikidata_id, language):
105 113
     if date_of_death != None:
106 114
         attributes.append({'label' : 'Date of death', 'value' : date_of_death})
107 115
 
108
-
109
-    results.append({
110
-            'infobox' : title,
111
-            'id' : wikipedia_en_link,
112
-            'content' : description,
113
-            'attributes' : attributes,
114
-            'urls' : urls
115
-            })
116
+    if len(attributes)==0 and len(urls)==2 and len(description)==0:
117
+        results.append({
118
+                'url': urls[0]['url'],
119
+                'title': title,
120
+                'content': description
121
+                })
122
+    else:
123
+        results.append({
124
+                'infobox' : title,
125
+                'id' : wikipedia_en_link,
126
+                'content' : description,
127
+                'attributes' : attributes,
128
+                'urls' : urls
129
+                })
116 130
 
117 131
     return results
118 132
 
@@ -120,7 +134,9 @@ def getDetail(jsonresponse, wikidata_id, language):
120 134
 def add_url(urls, title, url):
121 135
     if url != None:
122 136
         urls.append({'title' : title, 'url' : url})
123
-
137
+        return 1
138
+    else:
139
+        return 0
124 140
 
125 141
 def get_mainsnak(claims, propertyName):
126 142
     propValue = claims.get(propertyName, {})
@@ -213,3 +229,9 @@ def get_wikilink(result, wikiid):
213 229
     elif url.startswith('//'):
214 230
         url = 'https:' + url
215 231
     return url
232
+
233
+def get_wiki_firstlanguage(result, wikipatternid):
234
+    for k in result.get('sitelinks', {}).keys():
235
+        if k.endswith(wikipatternid) and len(k)==(2+len(wikipatternid)):
236
+            return k[0:2]
237
+    return None