diff options
Diffstat (limited to 'site_builder/blog.py')
-rw-r--r-- | site_builder/blog.py | 50 |
1 files changed, 22 insertions, 28 deletions
diff --git a/site_builder/blog.py b/site_builder/blog.py index a8ef446..9a1b48d 100644 --- a/site_builder/blog.py +++ b/site_builder/blog.py | |||
@@ -7,17 +7,15 @@ Blog Post Builder | |||
7 | """ | 7 | """ |
8 | 8 | ||
9 | import os | 9 | import os |
10 | from functools import wraps | ||
11 | from datetime import datetime | 10 | from datetime import datetime |
12 | 11 | ||
13 | # Docutils imports, crazy yo | ||
14 | from docutils import nodes | 12 | from docutils import nodes |
15 | from docutils.core import Publisher, publish_string | 13 | from docutils.parsers import rst |
14 | from docutils.core import Publisher | ||
15 | from docutils.readers import standalone | ||
16 | from docutils.transforms import Transform | 16 | from docutils.transforms import Transform |
17 | from docutils.io import NullOutput, FileInput | 17 | from docutils.io import NullOutput, FileInput |
18 | from docutils.parsers.rst import Parser as RSTParser | 18 | from docutils.writers import html4css1 as html |
19 | from docutils.writers.html4css1 import Writer as HTMLWriter | ||
20 | from docutils.readers.standalone import Reader as StandaloneReader | ||
21 | 19 | ||
22 | 20 | ||
23 | class BlogMetaTransform(Transform): | 21 | class BlogMetaTransform(Transform): |
@@ -34,9 +32,7 @@ class BlogMetaTransform(Transform): | |||
34 | def __init__(self, *args, **kwargs): | 32 | def __init__(self, *args, **kwargs): |
35 | Transform.__init__(self, *args, **kwargs) | 33 | Transform.__init__(self, *args, **kwargs) |
36 | 34 | ||
37 | self.meta = self.document.blog_meta = { | 35 | self.meta = self.document.blog_meta = {"tags": []} |
38 | 'tags': [], | ||
39 | } | ||
40 | 36 | ||
41 | def apply(self): | 37 | def apply(self): |
42 | docinfo = None | 38 | docinfo = None |
@@ -50,7 +46,7 @@ class BlogMetaTransform(Transform): | |||
50 | self.document.remove(node) | 46 | self.document.remove(node) |
51 | 47 | ||
52 | if isinstance(node, nodes.title): | 48 | if isinstance(node, nodes.title): |
53 | self.meta['title'] = unicode(node[0]) | 49 | self.meta["title"] = unicode(node[0]) |
54 | self.document.remove(node) | 50 | self.document.remove(node) |
55 | 51 | ||
56 | # And one to process the docinfo | 52 | # And one to process the docinfo |
@@ -65,23 +61,23 @@ class BlogMetaTransform(Transform): | |||
65 | self._handle_field(node) | 61 | self._handle_field(node) |
66 | 62 | ||
67 | def _handle_author(self, node): | 63 | def _handle_author(self, node): |
68 | self.meta['author'] = Author(node[0]['name'], node[0]['refuri']) | 64 | self.meta["author"] = Author(node[0]["name"], node[0]["refuri"]) |
69 | 65 | ||
70 | def _handle_date(self, node): | 66 | def _handle_date(self, node): |
71 | raw_date = unicode(node[0]) | 67 | raw_date = unicode(node[0]) |
72 | self.meta['post_date'] = datetime.strptime(raw_date, | 68 | self.meta["post_date"] = datetime.strptime(raw_date, |
73 | '%a %b %d %H:%M:%S %Y') | 69 | "%a %b %d %H:%M:%S %Y") |
74 | 70 | ||
75 | def _handle_field(self, node): | 71 | def _handle_field(self, node): |
76 | name = node[0][0] | 72 | name = node[0][0] |
77 | value = unicode(node[1][0][0]) | 73 | value = unicode(node[1][0][0]) |
78 | 74 | ||
79 | if name == 'Tag': | 75 | if name == "Tag": |
80 | self.meta['tags'].append(value) | 76 | self.meta["tags"].append(value) |
81 | 77 | ||
82 | 78 | ||
83 | 79 | ||
84 | class BlogPostReader(StandaloneReader): | 80 | class BlogPostReader(standalone.Reader): |
85 | """ | 81 | """ |
86 | Post reader for blog posts. | 82 | Post reader for blog posts. |
87 | 83 | ||
@@ -90,9 +86,7 @@ class BlogPostReader(StandaloneReader): | |||
90 | """ | 86 | """ |
91 | 87 | ||
92 | def get_transforms(self): | 88 | def get_transforms(self): |
93 | return StandaloneReader.get_transforms(self) + [ | 89 | return standalone.Reader.get_transforms(self) + [BlogMetaTransform] |
94 | BlogMetaTransform, | ||
95 | ] | ||
96 | 90 | ||
97 | 91 | ||
98 | class Author(object): | 92 | class Author(object): |
@@ -104,11 +98,11 @@ class Author(object): | |||
104 | self.name = name | 98 | self.name = name |
105 | self.email = email | 99 | self.email = email |
106 | 100 | ||
107 | if email.startswith('mailto:'): | 101 | if email.startswith("mailto:"): |
108 | self.email = email[len('mailto:'):] | 102 | self.email = email[len("mailto:"):] |
109 | 103 | ||
110 | def __str__(self): | 104 | def __str__(self): |
111 | return '{0} <{1}>'.format(self.name, self.email) | 105 | return "{0} <{1}>".format(self.name, self.email) |
112 | 106 | ||
113 | 107 | ||
114 | class BlogPost(object): | 108 | class BlogPost(object): |
@@ -150,29 +144,29 @@ class BlogPost(object): | |||
150 | """ | 144 | """ |
151 | pub = Publisher(destination_class=NullOutput, | 145 | pub = Publisher(destination_class=NullOutput, |
152 | source=FileInput(source_path=filename), | 146 | source=FileInput(source_path=filename), |
153 | reader=BlogPostReader(), writer=HTMLWriter(), | 147 | reader=BlogPostReader(), writer=html.Writer(), |
154 | parser=RSTParser()) | 148 | parser=rst.Parser()) |
155 | 149 | ||
156 | pub.get_settings() # This is not sane. | 150 | pub.get_settings() # This is not sane. |
157 | pub.settings.traceback = True # Damnit | 151 | pub.settings.traceback = True # Damnit |
158 | pub.publish() | 152 | pub.publish() |
159 | 153 | ||
160 | meta = pub.document.blog_meta | 154 | meta = pub.document.blog_meta |
161 | post = cls(meta['title'], meta['post_date'], meta['author'], | 155 | post = cls(meta["title"], meta["post_date"], meta["author"], |
162 | meta['tags'], pub.writer.parts['html_body']) | 156 | meta["tags"], pub.writer.parts["html_body"]) |
163 | 157 | ||
164 | post.filename = filename | 158 | post.filename = filename |
165 | 159 | ||
166 | return post | 160 | return post |
167 | 161 | ||
168 | 162 | ||
169 | def load_post_index(directory='.'): | 163 | def load_post_index(directory="."): |
170 | """ | 164 | """ |
171 | Scan the current directory for rst files and build an index. | 165 | Scan the current directory for rst files and build an index. |
172 | """ | 166 | """ |
173 | posts = [] | 167 | posts = [] |
174 | for filename in os.listdir(directory): | 168 | for filename in os.listdir(directory): |
175 | if not filename.endswith('.rst'): | 169 | if not filename.endswith(".rst"): |
176 | continue | 170 | continue |
177 | 171 | ||
178 | filename = os.path.join(directory, filename) | 172 | filename = os.path.join(directory, filename) |