summaryrefslogtreecommitdiff
path: root/blog/post.py
blob: eab9d0d101453783ff6282b582df9ad7139c3210 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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}`"

        content = render.to_html(md)
        rendered = self.template.render(title=self.metadata.title,
                                        date=self.metadata.date,
                                        content=content)
        render.write_file_content(os.path.join(workdir, "index.html"),
                                  rendered)