4 import os
, time
, datetime
5 from os
.path
import join
, abspath
8 from cfg
import o
, setup_cfg
10 o('-c', '--conf', dest
='conf',
11 help='Configuration file'),
12 o('-r', '--rstdir', dest
='rstdir',
13 help='Directory where source .rst files are found'),
14 o('-t', '--templatedir', dest
='templatedir',
15 help='Directory where mako templates can be found'),
16 o('-b', '--baseurl', dest
='baseurl',
17 help='The base URL of the site'),
18 o('-T', '--title', dest
='title',
19 help='Site title that goes into <title>'),
20 o('', '--regen', dest
='regen', action
="store_true",
21 help='Regenerate the whole site (all files)'),
22 o('-d', '--disqus-forum', dest
='disqus_forum',
23 help='The name of the disqus forum. For example, ' +
24 'if http://foo.disqus.com is the forum, then do --disqus-forum=foo'),
25 o('', '--blog-title', dest
='blog.title',
27 o('', '--blog-subtitle', dest
='blog.subtitle',
29 o('', '--feedburner-url', dest
='blog.feedburner_url',
30 help='FeedBurner URL to use instead of local atom.xml'),
31 o('', '--google-analytics', dest
='google_analytics',
32 help='Your google analytics code (eg: UA-1563463-1)'),
35 cfg
['rstdir'] = abspath(cfg
['rstdir'])
36 cfg
['templatedir'] = abspath(cfg
['templatedir'])
38 from util
import make_mako
, last_modified
, rfc3339
44 def __init__(self
, rstfile
):
45 parts
, meta
= rst
.process(rstfile
)
47 self
.rstfile
= rstfile
48 self
.title
= parts
['title']
49 self
.fragment
= parts
['fragment']
53 return '%s - %s' % (self
.title
, cfg
['title'])
56 if '|' in self
.meta
['date']:
57 format
= '%Y-%m-%d|%H:%M'
61 return datetime
.datetime(
62 *time
.strptime(self
.meta
['date'],
65 def updated_date(self
):
66 return datetime
.datetime
.fromtimestamp(
67 last_modified(self
.rstfile
))
70 tags
= self
.meta
.get('tags', '').split()
75 path_info
= rst
.htmlpath(self
.rstfile
[len(cfg
['rstdir']):])
76 return cfg
['baseurl'] + path_info
78 def commentable(self
):
86 def commentable(self
):
89 def __cmp__(self
, other
):
90 return cmp(self
.date(), other
.date())
93 return '<BlogPost "%s" on %s>' % (self
.title
, self
.date())
96 if __name__
== '__main__':
97 # Import Psyco if available
104 print '[%s - %s] rstdir:%s [using templatedir:%s]' % (
105 cfg
['baseurl'], cfg
['title'], cfg
['rstdir'], cfg
['templatedir'])
107 rstdir
= cfg
['rstdir']
109 blog_path
= join(rstdir
, 'blog')
110 feed_url
= cfg
['blog.feedburner_url'] or cfg
['baseurl'] + '/blom/atom.xml'
112 for f
in rst
.rstfiles(rstdir
):
115 blog_posts
.append(page
)
119 make_mako(rst
.htmlpath(f
),
126 # generate blog index
127 make_mako(join(rstdir
, 'blog', 'index.html'),
128 [p
.rstfile
for p
in blog_posts
],
132 recent_blog_posts
= blog_posts
133 updated
= max([p
.updated_date()
134 for p
in recent_blog_posts
])
135 recent_blog_posts
= recent_blog_posts
[:10]
136 make_mako(join(rstdir
, 'blog', 'atom.xml'),
137 [p
.rstfile
for p
in recent_blog_posts
],
138 'blog/atom.xml.mako')