summaryrefslogtreecommitdiff
path: root/src/pyssg/md/page.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pyssg/md/page.py')
-rw-r--r--src/pyssg/md/page.py81
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')
+