diff --git a/ansirenderer.py b/ansirenderer.py index 7926ea5..c63341d 100644 --- a/ansirenderer.py +++ b/ansirenderer.py @@ -210,9 +210,10 @@ class AbstractRenderer(): self.images = {} self.title = None self.validity = True - self.temp_file = {} + self.temp_files = {} self.less_histfile = {} self.center = center + self.last_mode = "readable" #This class hold an internal representation of the HTML text class representation: @@ -439,7 +440,11 @@ class AbstractRenderer(): return [[self.url,self.get_mime(),self.get_title()]] def is_valid(self): return self.validity - def get_links(self,mode="links_only"): + def is_local(self): + #TODO with self.url + return False + def get_links(self,mode=None): + if not mode: mode = self.last_mode if mode not in self.links : prepared_body = self.prepare(self.body,mode=mode) results = self.render(prepared_body,mode=mode) @@ -533,16 +538,17 @@ class AbstractRenderer(): title_r.close_color("red") return title_r.get_final() - def display(self,mode="readable",window_title="",window_info=None,grep=None): - if not mode: mode = "readable" + def display(self,mode=None,window_title="",window_info=None,grep=None): + if mode: self.last_mode = mode + else: mode = self.last_mode wtitle = self._window_title(window_title,info=window_info) body = wtitle + "\n" + self.get_body(mode=mode) if not body: return False # We actually put the body in a tmpfile before giving it to less - if mode not in self.temp_file: + if mode not in self.temp_files: tmpf = tempfile.NamedTemporaryFile("w", encoding="UTF-8", delete=False) - self.temp_file[mode] = tmpf.name + self.temp_files[mode] = tmpf.name tmpf.write(body) tmpf.close() if mode not in self.less_histfile: @@ -551,12 +557,12 @@ class AbstractRenderer(): self.less_histfile[mode] = tmpf.name else: firsttime = False - less_cmd(self.temp_file[mode], histfile=self.less_histfile[mode],cat=firsttime,grep=grep) + less_cmd(self.temp_files[mode], histfile=self.less_histfile[mode],cat=firsttime,grep=grep) return True def get_temp_file(self,mode="readable"): - if mode in self.temp_file: - return self.temp_file[mode] + if mode in self.temp_files: + return self.temp_files[mode] else: return None diff --git a/offpunk.py b/offpunk.py index 6d343aa..a1478a5 100755 --- a/offpunk.py +++ b/offpunk.py @@ -1,6 +1,3 @@ -#TODO: migrate go_to_gi to netcache -#TODO: separate ansirenderer into ansicat and ansiless -#TODO: migrate displaying into ansirenderer #!/usr/bin/env python3 # Offpunk Offline Gemini client # Derived from AV-98 by Solderpunk, @@ -245,28 +242,6 @@ class GeminiItem(): else: return [] - #TODO: should be in ansiless - def display(self,mode=None,grep=None): - if self.renderer and self.renderer.is_valid(): - if not mode: - mode = self.last_mode - else: - self.last_mode = mode - title = self.renderer.get_url_title() - if netcache.is_cache_valid(self.url): #and self.offline_only and not self.local: - nbr = len(self.get_links(mode=mode)) - if self.local: - title += " (%s items)"%nbr - str_last = "local file" - else: - str_last = "last accessed on %s" %time.ctime(netcache.cache_last_modified(self.url)) - title += " (%s links)"%nbr - return self.renderer.display(mode=mode,window_title=title,window_info=str_last,grep=grep) - else: - return False - else: - return False - def get_filename(self): filename = os.path.basename(netcache.get_cache_path(self.url)) return filename @@ -534,6 +509,14 @@ class GeminiClient(cmd.Cmd): def get_renderer(self,url=None): # If launched without argument, we return the renderer for the current URL if not url: url = self.url + findmode = url.split("##offpunk_mode=") + if len(findmode) > 1: + url = findmode[0] + if findmode[1] in ["full"] or findmode[1].isnumeric(): + #TODO: what should we do with last mode ? + last_mode = findmode[1] + else: + self.url = url # reuse existing renderer if any if url in self.rendererdic.keys(): renderer = self.rendererdic[url] @@ -635,7 +618,20 @@ class GeminiClient(cmd.Cmd): print(toprint,end="\r") self._go_to_url(image, update_hist=False, check_cache=True, \ handle=False,limit_size=True) - if display and gi.display(mode=mode): + is_rendered = False + if display and netcache.is_cache_valid(self.url): + title = renderer.get_url_title() + nbr = len(renderer.get_links(mode=mode)) + if renderer.is_local(): + title += " (%s items)"%nbr + str_last = "local file" + else: + str_last = "last accessed on %s"\ + %time.ctime(netcache.cache_last_modified(self.url)) + title += " (%s links)"%nbr + is_rendered = renderer.display(mode=mode,\ + window_title=title,window_info=str_last) + if display and is_rendered: self.index = gi.get_links() self.page_index = 0 self.index_index = -1 @@ -644,7 +640,7 @@ class GeminiClient(cmd.Cmd): self.current_url = url if update_hist and not self.sync_only: self._update_history(gi) - elif display : + elif display and not is_rendered : cmd_str = self._get_handler_cmd(ansirenderer.get_mime(gi.url)) try: # get body (tmpfile) from gi ! @@ -763,12 +759,12 @@ class GeminiClient(cmd.Cmd): r = self.get_renderer() if r: url = r.get_link(n) + self._go_to_url(url) else: print("No page with links") return self.index_index = n - self._go_to_url(url) ### Settings def do_redirect(self,line): @@ -1267,7 +1263,7 @@ Use 'ls -l' to see URLs.""" @needs_gi def do_find(self, searchterm): """Find in current page by displaying only relevant lines (grep).""" - self.gi.display(grep=searchterm) + self.get_renderer().display(grep=searchterm) def emptyline(self): """Page through index ten lines at a time."""