2
2
from ..extensions import NewelleExtension
3
3
from ..ui .widgets import WebSearchWidget
4
4
from gi .repository import Gtk , GLib
5
+ import os
6
+ import json
5
7
6
8
7
9
class WebsearchIntegration (NewelleExtension ):
@@ -12,6 +14,7 @@ def __init__(self, pip_path, extension_path, settings):
12
14
super ().__init__ (pip_path , extension_path , settings )
13
15
self .widgets = {}
14
16
self .load_widet_cache ()
17
+ self .msgid = 0
15
18
16
19
def get_replace_codeblocks_langs (self ) -> list :
17
20
return ["search" ]
@@ -20,53 +23,54 @@ def provides_both_widget_and_answer(self, codeblock: str, lang: str) -> bool:
20
23
return True
21
24
22
25
def get_answer (self , codeblock : str , lang : str ) -> str | None :
26
+ msgid = self .msgid
23
27
if self .websearch .supports_streaming_query ():
24
- text , sources = self .websearch .query_streaming (codeblock , lambda title , link , favicon , codeblock = codeblock : self .add_website (codeblock , title , link , favicon ))
28
+ text , sources = self .websearch .query_streaming (codeblock , lambda title , link , favicon , codeblock = codeblock , msgid = msgid : self .add_website (codeblock , title , link , favicon , msgid ))
25
29
else :
26
30
text , sources = self .websearch .query (codeblock )
27
31
for source in sources :
28
- self .add_website (codeblock , source , source , "" )
29
- self .finish (codeblock , text )
32
+ self .add_website (codeblock , source , source , "" , msgid )
33
+ self .finish (codeblock , text , sources , msgid )
30
34
return "Here is the web search result for query '" + codeblock + "':\n " + text
31
35
32
- def finish (self , codeblock : str , result : str ):
33
- self .widget_cache [codeblock ]["result" ] = result
36
+ def finish (self , codeblock : str , result : str , sources , msgid ):
37
+ self .widget_cache [msgid ]["result" ] = result
34
38
self .save_widget_cache ()
35
39
search_widget = self .widgets .get (codeblock , None )
36
40
if search_widget is not None :
37
41
GLib .idle_add (search_widget .finish , result )
38
42
39
- def add_website (self , term , title , link , favicon ):
43
+ def add_website (self , term , title , link , favicon , msgid ):
40
44
search_widget = self .widgets .get (term , None )
41
45
if search_widget is not None :
42
46
GLib .idle_add (search_widget .add_website , title , link , favicon )
43
- self .widget_cache [term ]["websites" ].append ((title , link , favicon ))
47
+ self .widget_cache [msgid ]["websites" ].append ((title , link , favicon ))
44
48
45
- def restore_gtk_widget (self , codeblock : str , lang : str ) -> Gtk .Widget | None :
46
- search_widget = self .widgets .get (codeblock , None )
47
- if search_widget is not None and False :
48
- return search_widget
49
+ def load_search_widget (self , query , sources , result ):
50
+ widget = WebSearchWidget (query )
51
+ for title , link , favicon in tuple (sources ):
52
+ widget .add_website (title , link , favicon )
53
+ widget .finish (result )
54
+ widget .connect ("website-clicked" , lambda widget ,link : self .ui_controller .open_link (link , False , not self .settings .get_boolean ("external-browser" )))
55
+ return widget
56
+
57
+ def restore_gtk_widget (self , codeblock : str , lang : str , msgid ) -> Gtk .Widget | None :
58
+ cache = self .widget_cache .get (msgid , None )
59
+ if cache is not None :
60
+ return self .load_search_widget (codeblock , cache ["websites" ], cache ["result" ])
49
61
else :
50
- cache = self .widget_cache .get (codeblock , None )
51
- if cache is not None :
52
- search_widget = WebSearchWidget (codeblock )
53
- search_widget .connect ("website-clicked" , lambda widget ,link : self .ui_controller .open_link (link , False , not self .settings .get_boolean ("external-browser" )))
54
- if "websites" in cache :
55
- for title , link , favicon in cache ["websites" ]:
56
- search_widget .add_website (title , link , favicon )
57
- search_widget .finish (cache ["result" ])
58
- else :
59
- search_widget = WebSearchWidget (codeblock )
60
- search_widget .finish ("No result found" )
62
+ search_widget = WebSearchWidget (codeblock )
63
+ search_widget .finish ("No result found" )
61
64
return search_widget
62
65
63
- def get_gtk_widget (self , codeblock : str , lang : str ) -> Gtk .Widget | None :
66
+ def get_gtk_widget (self , codeblock : str , lang : str , msgid ) -> Gtk .Widget | None :
67
+ self .msgid = msgid
64
68
search_widget = WebSearchWidget (search_term = codeblock )
65
69
search_widget .connect ("website-clicked" , lambda widget ,link : self .ui_controller .open_link (link , False , not self .settings .get_boolean ("external-browser" )))
66
70
self .widgets [codeblock ] = search_widget
67
- self .widget_cache [codeblock ] = {}
68
- self .widget_cache [codeblock ]["websites" ] = []
69
- self .widget_cache [codeblock ]["result" ] = "No result found"
71
+ self .widget_cache [msgid ] = {}
72
+ self .widget_cache [msgid ]["websites" ] = []
73
+ self .widget_cache [msgid ]["result" ] = "No result found"
70
74
return search_widget
71
75
72
76
def postprocess_history (self , history : list , bot_response : str ) -> tuple [list , str ]:
@@ -78,8 +82,16 @@ def postprocess_history(self, history: list, bot_response: str) -> tuple[list, s
78
82
return history , bot_response
79
83
80
84
def save_widget_cache (self ):
81
- self .set_setting ("widget_cache" , self .widget_cache )
85
+ with open (os .path .join (self .extension_path , "websearch_cache.json" ), "w+" ) as f :
86
+ json .dump (self .widget_cache , f )
82
87
83
88
def load_widet_cache (self ):
84
- self .widget_cache = self .get_setting ("widget_cache" , False , {})
89
+ if os .path .exists (os .path .join (self .extension_path , "websearch_cache.json" )):
90
+ with open (os .path .join (self .extension_path , "websearch_cache.json" )) as f :
91
+ self .widget_cache = json .load (f )
92
+ for key in self .widget_cache .copy ():
93
+ self .widget_cache [int (key )] = self .widget_cache [key ]
94
+ del self .widget_cache [key ]
95
+ else :
96
+ self .widget_cache = {}
85
97
0 commit comments