experimental: new plaintext renderer. Also used to view source

This commit is contained in:
Ploum 2023-10-07 23:30:09 +02:00
parent c19576bc43
commit f6cb7723e1
3 changed files with 39 additions and 7 deletions

View File

@ -3,6 +3,8 @@
## 2.0-beta2 - unreleased
Changes since beta1
- "--sync" can optionnaly take some lists as arguments, in order to make for specific sync
- "view source" to view the source code of a page
- new PlaintextRenderer which display .txt files without any margin/color/linebreaks
- default URL blocked list is now its own file to make contributions easier
- prompt color is now part of the theme
- improves handling of base64 images

View File

@ -167,7 +167,10 @@ class AbstractRenderer():
def display(self,mode=None,directdisplay=False):
wtitle = self.get_formatted_title()
body = wtitle + "\n" + self.get_body(mode=mode)
if mode == "source":
body = self.body
else:
body = wtitle + "\n" + self.get_body(mode=mode)
if directdisplay:
print(body)
return True
@ -544,6 +547,30 @@ class AbstractRenderer():
# The prepare() function output a list of tuple. Each tuple is [output text, format] where
# format should be in _FORMAT_RENDERERS. If None, current renderer is used
class PlaintextRenderer(AbstractRenderer):
def get_mime(self):
return "text/plain"
def get_title(self):
if self.title:
return self.title
elif self.body:
lines = self.body.splitlines()
if len(lines) > 0:
# If not title found, we take the first 50 char
# of the first line
title_line = lines[0].strip()
if len(title_line) > 50:
title_line = title_line[:49] + ""
self.title = title_line
return self.title
else:
self.title = "Empty Page"
return self.title
else:
return "(unknown)"
def render(self,gemtext, width=None,mode=None,startlinks=0):
return gemtext, []
# Gemtext Rendering Engine
class GemtextRenderer(AbstractRenderer):
def get_mime(self):
@ -569,7 +596,7 @@ class GemtextRenderer(AbstractRenderer):
self.title = "Empty Page"
return self.title
else:
return "Unknown Gopher Page"
return "(unknown)"
#render_gemtext
def render(self,gemtext, width=None,mode=None,startlinks=0):
@ -1179,6 +1206,7 @@ _FORMAT_RENDERERS = {
"text/gemini": GemtextRenderer,
"text/html" : HtmlRenderer,
"text/xml" : FeedRenderer,
"text/plain" : PlaintextRenderer,
"application/xml" : FeedRenderer,
"application/rss+xml" : FeedRenderer,
"application/atom+xml" : FeedRenderer,
@ -1311,6 +1339,8 @@ def render(input,path=None,format="auto",mime=None,url=None):
r = ImageRenderer(input,url)
elif format == "folder":
r = FolderRenderer(input,url)
elif format in ["plaintext","text"]:
r = PlaintextRenderer(input,url)
else:
if not mime and path:
r= renderer_from_file(path,url)
@ -1324,8 +1354,8 @@ def render(input,path=None,format="auto",mime=None,url=None):
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--format", choices=["auto","gemtext","html","feed","gopher","image","folder"],
help="Renderer to use. Available: auto, gemtext, html, feed, gopher, image, folder")
parser.add_argument("--format", choices=["auto","gemtext","html","feed","gopher","image","folder","text","plaintext"],
help="Renderer to use. Available: auto, gemtext, html, feed, gopher, image, folder, plaintext")
parser.add_argument("--mime", help="Mime of the content to parse")
## The argument needs to be a path to a file. If none, then stdin is used which allows
## to pipe text directly into ansirenderer

View File

@ -6,6 +6,7 @@ Offline-First Gemini/Web/Gopher/RSS reader and browser
__version__ = "2.0-beta1"
## Initial imports and conditional imports {{{
import argparse
import cmd
import datetime
@ -34,14 +35,13 @@ try:
_HAS_SETPROCTITLE = True
except ModuleNotFoundError:
_HAS_SETPROCTITLE = False
_HAS_XSEL = shutil.which('xsel')
try:
import requests
_DO_HTTP = True
except ModuleNotFoundError:
_DO_HTTP = False
## }}} end of imports
# Command abbreviations
_ABBREVS = {
@ -982,7 +982,7 @@ Use "view feeds" to see available feeds on this page.
(full, feed, feeds have no effect on non-html content)."""
if self.current_url and args and args[0] != "":
u, m = unmode_url(self.current_url)
if args[0] in ["full","debug"]:
if args[0] in ["full","debug","source"]:
self._go_to_url(self.current_url,mode=args[0])
elif args[0] in ["normal","readable"]:
self._go_to_url(self.current_url,mode="readable")