diff options
Diffstat (limited to 'blog/post.py')
-rw-r--r-- | blog/post.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/blog/post.py b/blog/post.py new file mode 100644 index 0000000..1d35b6c --- /dev/null +++ b/blog/post.py @@ -0,0 +1,71 @@ +import os +import shutil +import datetime +import functools + +import render + + +class Metadata(object): + __slots__ = ("title", "date", "status") + + def __init__(self, title, date, status): + self.title = title + self.date = date + self.status = status + + +class Post(object): + def __init__(self, template, directory): + self.template = template + self.directory = directory + self.name = os.path.basename(directory) + + @staticmethod + def _load_raw_metadata(filename): + data = {} + + with open(filename) as f: + for line in f: + k, v = line.strip().split(": ") + data[k] = v + + return data + + @functools.cached_property + def metadata(self): + raw = Post._load_raw_metadata(os.path.join(self.directory, + "metadata.txt")) + + title = raw["Title"] + date = raw.get("Date", datetime.date.today().strftime("%Y-%m-%d")) + status = raw.get("Status", "draft") + + return Metadata(title, date, status) + + def is_draft(self): + return self.metadata.status == "draft" + + def generate(self, basedir): + postdir = os.path.basename(self.directory) + workdir = os.path.join(basedir, postdir) + os.makedirs(workdir) + + md = None + for filename in os.listdir(self.directory): + source = os.path.join(self.directory, filename) + destination = os.path.join(workdir, filename) + + shutil.copy(source, destination) + + if filename.endswith(".md"): + md = source + + assert md, f"There is no markdown file in `{self.directory}`" + + body = render.to_html(md) + rendered = self.template.render(title=self.metadata.title, + date=self.metadata.date, + body=body) + render.write_file_content(os.path.join(workdir, "index.html"), + rendered) |