first step to transform renderers into their own objects

This commit is contained in:
Lionel Dricot 2022-01-29 15:35:28 +01:00
parent 69db426ab8
commit f2944d35af
1 changed files with 211 additions and 180 deletions

View File

@ -187,10 +187,26 @@ standard_ports = {
# First, we define the gemtext and html renderers, outside of the rest
# (They could later be factorized in other files or replaced)
# Gemtext Rendering Engine
# this method takes the original gemtext and returns
# [rendered_text,links_table]
def render_gemtext(gemtext, width=80):
# Gemtext Rendering Engine
# this method takes the original gemtext and returns
# [rendered_text,links_table]
class GemtextRenderer():
def __init__(self,content):
self.body = content
self.rendered_text = None
self.links = None
def get_body(self):
if self.rendered_text == None :
self.rendered_text, self.links = self.render_gemtext(self.body)
return self.rendered_text
def get_links(self):
if self.links == None :
self.rendered_text, self.links = self.render_gemtext(self.body)
return self.links
def render_gemtext(self,gemtext, width=80):
links = []
preformatted = False
rendered_text = ""
@ -258,9 +274,24 @@ def render_gemtext(gemtext, width=80):
rendered_text += wrap_line(line).rstrip() + "\n"
return rendered_text, links
# Our own HTML engine (crazy, isnt it?)
# Return [rendered_body, list_of_links]
def render_html(body,width=80):
class HtmlRenderer():
def __init__(self,content):
self.body = content
self.rendered_text = None
self.links = None
def get_body(self):
if self.rendered_text == None :
self.rendered_text, self.links = self.render_html(self.body)
return self.rendered_text
def get_links(self):
if self.links == None :
self.rendered_text, self.links = self.render_html(self.body)
return self.links
# Our own HTML engine (crazy, isnt it?)
# Return [rendered_body, list_of_links]
def render_html(self,body,width=80):
if not _DO_HTML:
print("HTML document detected. Please install python-bs4 and python-readability.")
return
@ -365,9 +396,9 @@ def render_html(body,width=80):
# Mapping mimetypes with renderers
# (any content with a mimetype text/* not listed here will be rendered with render_gemtext)
_FORMAT_RENDERERS = {
"text/gemini": render_gemtext,
"text/html" : render_html,
"text/xml" : render_html
"text/gemini": GemtextRenderer,
"text/html" : HtmlRenderer,
"text/xml" : HtmlRenderer
}
# Offpunk is organized as follow:
# - a GeminiClient instance which handles the browsing of GeminiItems (= pages).
@ -560,12 +591,12 @@ class GeminiItem():
if not self.renderer:
mime = self.get_mime()
if mime in _FORMAT_RENDERERS:
self.renderer = _FORMAT_RENDERERS[mime]
func = _FORMAT_RENDERERS[mime]
self.renderer = func(self.get_body())
if self.renderer:
body = self.get_body()
r_body, links = self.renderer(body)
self.__make_links(links)
to_return = self._make_terminal_title() + r_body
body = self.renderer.get_body()
self.__make_links(self.renderer.get_links())
to_return = self._make_terminal_title() + body
return to_return
else:
return None