browser: render all "text/*" Gemini responses
This commit is contained in:
parent
347b5a81cc
commit
f3a3a36039
|
@ -4,7 +4,7 @@ TODO DONE
|
||||||
links
|
links
|
||||||
redirections
|
redirections
|
||||||
web links
|
web links
|
||||||
history
|
history (back/forward)
|
||||||
simple caching
|
simple caching
|
||||||
simple text files
|
simple text files
|
||||||
encodings
|
encodings
|
||||||
|
@ -14,6 +14,7 @@ non shit command-line
|
||||||
home page
|
home page
|
||||||
downloads
|
downloads
|
||||||
media files
|
media files
|
||||||
|
view history
|
||||||
identity management
|
identity management
|
||||||
configuration
|
configuration
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
|
@ -18,7 +18,7 @@ def open_file(browser: Browser, filepath: str, encoding="utf-8", history=True):
|
||||||
except (OSError, ValueError) as exc:
|
except (OSError, ValueError) as exc:
|
||||||
browser.set_status_error(f"Failed to open file: {exc}")
|
browser.set_status_error(f"Failed to open file: {exc}")
|
||||||
return
|
return
|
||||||
browser.load_page(Page.from_gemtext(text))
|
browser.load_page(Page.from_text(text))
|
||||||
file_url = "file://" + filepath
|
file_url = "file://" + filepath
|
||||||
if history:
|
if history:
|
||||||
browser.history.push(file_url)
|
browser.history.push(file_url)
|
||||||
|
|
|
@ -84,7 +84,9 @@ def handle_response_content(browser: Browser, response: Response) -> int:
|
||||||
According to the MIME type received or inferred, render or download the
|
According to the MIME type received or inferred, render or download the
|
||||||
response's content.
|
response's content.
|
||||||
|
|
||||||
Currently only text/gemini content is rendered.
|
Currently only text content is rendered. For Gemini, the encoding specified
|
||||||
|
in the response is used, if available on the Python distribution. For other
|
||||||
|
text formats, only UTF-8 is attempted.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
- response: a successful Response.
|
- response: a successful Response.
|
||||||
|
@ -108,7 +110,9 @@ def handle_response_content(browser: Browser, response: Response) -> int:
|
||||||
browser.load_page(Page.from_gemtext(text))
|
browser.load_page(Page.from_gemtext(text))
|
||||||
return 0
|
return 0
|
||||||
else:
|
else:
|
||||||
pass # TODO
|
text = response.content.decode("utf-8", errors="replace")
|
||||||
|
browser.load_page(Page.from_text(text))
|
||||||
|
return 0
|
||||||
else:
|
else:
|
||||||
pass # TODO
|
pass # TODO
|
||||||
return 1
|
return 1
|
||||||
|
|
|
@ -94,6 +94,11 @@ def generate_metalines(elements, width):
|
||||||
return metalines
|
return metalines
|
||||||
|
|
||||||
|
|
||||||
|
def generate_dumb_metalines(lines):
|
||||||
|
"""Generate dumb metalines: all lines are given the PARAGRAPH line type."""
|
||||||
|
return [({"type": LineType.PARAGRAPH}, line) for line in lines]
|
||||||
|
|
||||||
|
|
||||||
def format_title(title: Title, context: dict):
|
def format_title(title: Title, context: dict):
|
||||||
"""Return metalines for this title."""
|
"""Return metalines for this title."""
|
||||||
width = context["width"]
|
width = context["width"]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
|
|
||||||
from bebop.gemtext import parse_gemtext, Title
|
from bebop.gemtext import parse_gemtext, Title
|
||||||
from bebop.metalines import generate_metalines
|
from bebop.metalines import generate_dumb_metalines, generate_metalines
|
||||||
from bebop.links import Links
|
from bebop.links import Links
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ class Page:
|
||||||
"""Page-related data.
|
"""Page-related data.
|
||||||
|
|
||||||
Attributes:
|
Attributes:
|
||||||
|
- source: str used to create the page.
|
||||||
- metalines: lines ready to be rendered.
|
- metalines: lines ready to be rendered.
|
||||||
- links: Links instance, mapping IDs to links on the page; this data is
|
- links: Links instance, mapping IDs to links on the page; this data is
|
||||||
redundant as the links' URLs/IDs are already available in the
|
redundant as the links' URLs/IDs are already available in the
|
||||||
|
@ -28,3 +29,9 @@ class Page:
|
||||||
elements, links, title = parse_gemtext(gemtext)
|
elements, links, title = parse_gemtext(gemtext)
|
||||||
metalines = generate_metalines(elements, 80)
|
metalines = generate_metalines(elements, 80)
|
||||||
return Page(gemtext, metalines, links, title)
|
return Page(gemtext, metalines, links, title)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def from_text(text: str):
|
||||||
|
"""Produce a Page for a text string."""
|
||||||
|
metalines = generate_dumb_metalines(text.splitlines())
|
||||||
|
return Page(text, metalines)
|
||||||
|
|
Reference in a new issue