summaryrefslogtreecommitdiff
path: root/site_builder/blog.py
diff options
context:
space:
mode:
Diffstat (limited to 'site_builder/blog.py')
-rw-r--r--site_builder/blog.py50
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
9import os 9import os
10from functools import wraps
11from datetime import datetime 10from datetime import datetime
12 11
13# Docutils imports, crazy yo
14from docutils import nodes 12from docutils import nodes
15from docutils.core import Publisher, publish_string 13from docutils.parsers import rst
14from docutils.core import Publisher
15from docutils.readers import standalone
16from docutils.transforms import Transform 16from docutils.transforms import Transform
17from docutils.io import NullOutput, FileInput 17from docutils.io import NullOutput, FileInput
18from docutils.parsers.rst import Parser as RSTParser 18from docutils.writers import html4css1 as html
19from docutils.writers.html4css1 import Writer as HTMLWriter
20from docutils.readers.standalone import Reader as StandaloneReader
21 19
22 20
23class BlogMetaTransform(Transform): 21class 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
84class BlogPostReader(StandaloneReader): 80class 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
98class Author(object): 92class 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
114class BlogPost(object): 108class 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
169def load_post_index(directory='.'): 163def 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)