From a6fee03d2ba26d7500b764c419f810eb4b409e8b Mon Sep 17 00:00:00 2001 From: Lionel Dricot Date: Mon, 31 Jul 2023 13:19:28 +0200 Subject: [PATCH] next work : reimplementing list and local files --- ansirenderer.py | 18 +++++++++++++----- offpunk.py | 40 ++++++++++++++++++++++------------------ 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/ansirenderer.py b/ansirenderer.py index c63341d..5788ea9 100644 --- a/ansirenderer.py +++ b/ansirenderer.py @@ -443,7 +443,10 @@ class AbstractRenderer(): def is_local(self): #TODO with self.url return False + def set_mode(self,mode): + self.last_mode = mode def get_links(self,mode=None): + print("mode : %s and last_mode : %s (%s)"%(mode,self.last_mode,self.url)) if not mode: mode = self.last_mode if mode not in self.links : prepared_body = self.prepare(self.body,mode=mode) @@ -503,7 +506,8 @@ class AbstractRenderer(): # This function return a list of URL which should be downloaded # before displaying the page (images in HTML pages, typically) - def get_images(self,mode="readable"): + def get_images(self,mode=None): + if not mode: mode = self.last_mode if not mode in self.images: self.get_body(mode=mode) # we also invalidate the body that was done without images @@ -516,7 +520,8 @@ class AbstractRenderer(): def prepare(self,body,mode=None): return body - def get_body(self,width=None,mode="readable"): + def get_body(self,width=None,mode=None): + if not mode: mode = self.last_mode if not width: width = term_width() if mode not in self.rendered_text: @@ -560,7 +565,8 @@ class AbstractRenderer(): less_cmd(self.temp_files[mode], histfile=self.less_histfile[mode],cat=firsttime,grep=grep) return True - def get_temp_file(self,mode="readable"): + def get_temp_file(self,mode=None): + if not mode: mode = self.last_mode if mode in self.temp_files: return self.temp_files[mode] else: @@ -849,7 +855,8 @@ class FeedRenderer(GemtextRenderer): self.get_body() return self.title - def prepare(self,content,mode="readable",width=None): + def prepare(self,content,mode=None,width=None): + if not mode: mode = self.last_mode if not width: width = term_width() self.title = "RSS/Atom feed" @@ -972,7 +979,8 @@ class HtmlRenderer(AbstractRenderer): # Our own HTML engine (crazy, isn’t it?) # Return [rendered_body, list_of_links] # mode is either links_only, readable or full - def render(self,body,mode="readable",width=None,add_title=True): + def render(self,body,mode=None,width=None,add_title=True): + if not mode: mode = self.last_mode if not width: width = term_width() if not _DO_HTML: diff --git a/offpunk.py b/offpunk.py index a1478a5..75a4829 100755 --- a/offpunk.py +++ b/offpunk.py @@ -199,7 +199,7 @@ class GeminiItem(): toreturn = [] if self.renderer: if not mode: - mode = self.last_mode + mode = self.renderer.last_mode links = self.renderer.get_links(mode=mode) for l in links: #split between link and potential name @@ -400,8 +400,6 @@ class GeminiClient(cmd.Cmd): self.gi = None self.current_url = None self.hist_index = 0 - self.index = [] - self.index_index = -1 self.marks = {} self.page_index = 0 self.permanent_redirects = {} @@ -508,15 +506,13 @@ class GeminiClient(cmd.Cmd): def get_renderer(self,url=None): # If launched without argument, we return the renderer for the current URL + mode = None 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 + mode = findmode[1] # reuse existing renderer if any if url in self.rendererdic.keys(): renderer = self.rendererdic[url] @@ -530,6 +526,9 @@ class GeminiClient(cmd.Cmd): print("WARNING: no cache for requested renderer for %s" %url) #TODO FIXME return None + self.url = url + if mode: + renderer.set_mode(mode) return renderer #TODO: go_to_gi should take an URL as parameter, not gi #it should also only be called to really go, not for all links @@ -568,8 +567,6 @@ class GeminiClient(cmd.Cmd): # print("Sorry, no support for {} links.".format(gi.scheme)) # return url = gi.url - if not mode: - mode = gi.last_mode # Obey permanent redirects if url in self.permanent_redirects: self._go_to_url(self.permanent_redirects[url],name=gi.name,mode=mode) @@ -588,6 +585,12 @@ class GeminiClient(cmd.Cmd): params["offline"] = self.offline_only cachepath = netcache.fetch(url,**params) renderer = self.get_renderer(url) + if not renderer: + print("no renderer for %s"%url) + print("mode is originally : %s"%mode) + if not mode: + mode = renderer.last_mode + print("now mode is %s" %mode) # Use cache or mark as to_fetch if resource is not cached if not cachepath: self.get_list("to_fetch") @@ -631,10 +634,10 @@ class GeminiClient(cmd.Cmd): title += " (%s links)"%nbr is_rendered = renderer.display(mode=mode,\ window_title=title,window_info=str_last) + print("after display: last_mode = %s" %renderer.last_mode) + print("renderers : %s"%self.rendererdic) if display and is_rendered: - self.index = gi.get_links() self.page_index = 0 - self.index_index = -1 # Update state (external files are not added to history) self.gi = gi self.current_url = url @@ -687,6 +690,7 @@ class GeminiClient(cmd.Cmd): @needs_gi def _show_lookup(self, offset=0, end=None, url=False): + #TODO: change get_links to use the renderer for n, gi in enumerate(self.gi.get_links()[offset:end]): print(self._format_geminiitem(n+offset+1, gi, url)) @@ -764,7 +768,6 @@ class GeminiClient(cmd.Cmd): print("No page with links") return - self.index_index = n ### Settings def do_redirect(self,line): @@ -931,10 +934,9 @@ Use with "cache" to copy the path of the cached content.""" args = arg.split() if args and args[0] == "url": if len(args) > 1 and args[1].isdecimal(): - gi = self.index[int(args[1])-1] - url = gi.url + url = self.get_renderer().get_link(int(args[1])-1) else: - url = self.gi.url + url = self.url run("xsel -b -i", input=url, direct_output=True) elif args and args[0] == "raw": run("xsel -b -i", input=open(self.gi.get_temp_filename(), "rb"), direct_output=True) @@ -1070,6 +1072,7 @@ Current tour can be listed with `tour ls` and scrubbed with `tour clear`.""" for l in self.list_get_links("tour"): self.list_rm_url(l.url_mode(),"tour") elif line == "*": + #TODO: change to use renderer.get_links and change list_add_line for l in self.gi.get_links(): self.list_add_line("tour",gi=l,verbose=False) elif line == ".": @@ -1084,6 +1087,7 @@ Current tour can be listed with `tour ls` and scrubbed with `tour clear`.""" gi = GeminiItem("list:///%s"%line) display = not self.sync_only if gi: + #TODO : change get_links for l in gi.get_links(): self.list_add_line("tour",gi=l,verbose=False) else: @@ -1268,7 +1272,7 @@ Use 'ls -l' to see URLs.""" def emptyline(self): """Page through index ten lines at a time.""" i = self.page_index - if not self.gi or i > len(self.gi.get_links()): + if not self.gi or i > len(self.get_renderer().get_links()): return self._show_lookup(offset=i, end=i+10) self.page_index += 10 @@ -1632,8 +1636,7 @@ archives, which is a special historical list limited in size. It is similar to ` def list_get_links(self,list): list_path = self.list_path(list) if list_path: - gi = GeminiItem("list:///%s"%list) - return gi.get_links() + return self.get_renderer("list:///%s"%list).get_links() else: return [] @@ -2007,6 +2010,7 @@ Argument : duration of cache validity (in seconds).""" #we should only savetotour at the first level of recursion # The code for this was removed so, currently, we savetotour # at every level of recursion. + #TODO: get rid of gitem links = gitem.get_links(mode="links_only") subcount = [0,len(links)] d = depth - 1