diff options
Diffstat (limited to 'src/pyssg/md/page.py')
-rw-r--r-- | src/pyssg/md/page.py | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/pyssg/md/page.py b/src/pyssg/md/page.py new file mode 100644 index 0000000..6a393d1 --- /dev/null +++ b/src/pyssg/md/page.py @@ -0,0 +1,81 @@ +from datetime import datetime, timezone +from logging import Logger, getLogger +from typing import Any + +log: Logger = getLogger(__name__) + + +class Page: + def __init__(self, name: str, + cts: float, + mts: float, + html: str, + toc: str, + toc_tokens: list[str], + meta: dict[str, Any], + config: dict[str, Any]) -> None: + # initial data + self.name: str = name.replace(".md", ".html") + self.cts: float = cts + self.mts: float = mts + self.content: str = html + self.toc: str = toc + self.toc_tokens: list[str] = toc_tokens + self.meta: dict[str, Any] = meta + self.config: dict[str, Any] = config + + # data from self.meta + self.title: str + self.author: list[str] + self.summary: str + self.lang: str + self.tags: tuple[str] + + # constructed + self.cdate_rss: str + self.cdate_sitemap: str + self.mdate_rss: str | None = None + self.mdate_sitemap: str | None = None + + self.next: Page | None = None + self.previous: Page | None = None + + def __lt__(self, other): + return self.cts < other.cts + + def __get_meta(self, var: str, + or_else: str | list[str] = ['']) -> str | list[str] | Any: + if var in self.meta: + return self.meta[var] + else: + log.debug('getting metadata "%s" failed, using optional value "%s"', + var, or_else) + return or_else + + def date(self, ts: float, format: str) -> str: + dt: datetime = datetime.fromtimestamp(ts, tz=timezone.utc) + + if format in self.config['fmt']: + return dt.strftime(self.config['fmt'][format]) + else: + log.warning('format "%s" not found in config, returning ' + 'empty string', format) + return '' + + # parses meta from self.meta + def parse_metadata(self): + self.title = str(self.__get_meta('title')[0]) + self.author = list(self.__get_meta('author')) + self.summary = str(self.__get_meta('summary')[0]) + self.lang = str(self.__get_meta('lang', ['en'])[0]) + + # probably add a way to sanitize tags + self.tags = tuple(set(sorted(self.__get_meta('tags', [])))) + log.debug('parsed tags %s', self.tags) + + self.cdate_rss = self.date(self.cts, 'rss_date') + self.cdate_sitemap = self.date(self.cts, 'sitemap_date') + if self.mts != 0.0: + self.mdate_rss = self.date(self.mts, 'rss_date') + self.mdate_sitemap = self.date(self.mts, 'sitemap_date') + |