dece
1468e6ef10
Dumb mode affects Gemtext parsing (gotta keep those empty lines) and rendering (render empty lines, do not attempt to put smart margins).
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Optional
|
|
|
|
from bebop.gemtext import parse_gemtext
|
|
from bebop.metalines import generate_dumb_metalines, generate_metalines
|
|
from bebop.mime import MimeType
|
|
from bebop.links import Links
|
|
|
|
|
|
@dataclass
|
|
class Page:
|
|
"""Page-related data.
|
|
|
|
Attributes:
|
|
- source: str used to create the page.
|
|
- metalines: lines ready to be rendered.
|
|
- links: Links instance, mapping IDs to links on the page; this data is
|
|
redundant as the links' URLs/IDs are already available in the
|
|
corresponding metalines, it is meant to be used as a quick map for link ID
|
|
lookup and disambiguation.
|
|
- title: optional page title.
|
|
"""
|
|
source: str
|
|
metalines: list = field(default_factory=list)
|
|
links: Links = field(default_factory=Links)
|
|
title: str = ""
|
|
mime: Optional[MimeType] = None
|
|
encoding: str = ""
|
|
|
|
@staticmethod
|
|
def from_gemtext(gemtext: str, wrap_at: int, dumb: bool =False):
|
|
"""Produce a Page from a Gemtext file or string."""
|
|
elements, links, title = parse_gemtext(gemtext, dumb=dumb)
|
|
metalines = generate_metalines(elements, wrap_at, dumb=dumb)
|
|
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)
|