forked from solderpunk/AV-98
Compare commits
4 Commits
c19576bc43
...
deaa199303
Author | SHA1 | Date |
---|---|---|
Ploum | deaa199303 | |
Ploum | 1baf311f2c | |
Ploum | d50bc5a8e2 | |
Ploum | f6cb7723e1 |
|
@ -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
|
||||
|
@ -10,6 +12,7 @@ Changes since beta1
|
|||
- fixes opening mailto links
|
||||
- fixes existing non-html ressources marked a to_fetch even when not needed (simple and/or confusion)
|
||||
- fixes a crash with RSS feeds without <link> element
|
||||
- fixes a bug in HTML renderer where some hX element were not closed properly
|
||||
- attempt at hiding XMLparsedAsHTMLWarning from BS4 library
|
||||
- chafa now used by default everywhere if version > 1.10
|
||||
- ignoring encoding error in ansicat
|
||||
|
|
49
ansicat.py
49
ansicat.py
|
@ -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):
|
||||
|
@ -1048,11 +1075,12 @@ class HtmlRenderer(AbstractRenderer):
|
|||
elif element.name in ["h4","h5","h6"]:
|
||||
if not r.open_theme("subsubtitle"):
|
||||
r.open_theme("subtitle")
|
||||
r.newparagraph()
|
||||
for child in element.children:
|
||||
r.newparagraph()
|
||||
recursive_render(child)
|
||||
r.newparagraph()
|
||||
r.close_all()
|
||||
#r.close_all()
|
||||
r.close_all()
|
||||
r.newparagraph()
|
||||
elif element.name in ["code","tt"]:
|
||||
for child in element.children:
|
||||
recursive_render(child,indent=indent,preformatted=True)
|
||||
|
@ -1179,6 +1207,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,
|
||||
|
@ -1242,6 +1271,10 @@ def get_mime(path,url=None):
|
|||
else:
|
||||
#by default, we consider it’s gemini except for html
|
||||
mime = "text/gemini"
|
||||
#file doesn’t recognise gemtext. It should be the default renderer.
|
||||
#the only case were it doesn’t make sense is if the file is .txt
|
||||
if mime == "text/plain" and not path.endswith(".txt"):
|
||||
mime = "text/gemini"
|
||||
return mime
|
||||
|
||||
def renderer_from_file(path,url=None,theme=None):
|
||||
|
@ -1311,6 +1344,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 +1359,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
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue