28 lines
895 B
Python
28 lines
895 B
Python
from dataclasses import dataclass, field
|
|
|
|
from bebop.gemtext import parse_gemtext, Title
|
|
from bebop.rendering import generate_metalines
|
|
from bebop.links import Links
|
|
|
|
|
|
@dataclass
|
|
class Page:
|
|
"""Page-related data."""
|
|
metalines: list = field(default_factory=list)
|
|
links: Links = field(default_factory=Links)
|
|
title: str = ""
|
|
|
|
@staticmethod
|
|
def from_gemtext(gemtext: str):
|
|
"""Produce a Page from a Gemtext file or string."""
|
|
elements = parse_gemtext(gemtext)
|
|
metalines = generate_metalines(elements, 80)
|
|
links = Links.from_metalines(metalines)
|
|
# TODO this is horrible; merge parsing with page generation directly
|
|
title = ""
|
|
for element in elements:
|
|
if isinstance(element, Title) and element.level == 1:
|
|
title = element.text
|
|
break
|
|
return Page(metalines, links, title)
|