Google analytics in README
[wrigit.git] / wrigit.py
blob5c48cf6ae1ec1b9050db710d050bf2067e8e1a12
1 #!/usr/bin/env python
2 # -*- mode: python -*-
4 import os, time, datetime
5 from os.path import join, abspath
7 import rst
8 from cfg import o, setup_cfg
9 cfg = 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',
26 help='Blog title'),
27 o('', '--blog-subtitle', dest='blog.subtitle',
28 help='Blog title'),
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)'),
33 ], {'regen': False})
35 cfg['rstdir'] = abspath(cfg['rstdir'])
36 cfg['templatedir'] = abspath(cfg['templatedir'])
38 from util import make_mako, last_modified, rfc3339
41 class Page(object):
42 """A rst page"""
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']
50 self.meta = meta
52 def title_html(self):
53 return '%s - %s' % (self.title, cfg['title'])
55 def date(self):
56 if '|' in self.meta['date']:
57 format = '%Y-%m-%d|%H:%M'
58 else:
59 format = '%Y-%m-%d'
61 return datetime.datetime(
62 *time.strptime(self.meta['date'],
63 format)[0:6])
65 def updated_date(self):
66 return datetime.datetime.fromtimestamp(
67 last_modified(self.rstfile))
69 def tags(self):
70 tags = self.meta.get('tags', '').split()
71 tags.sort()
72 return tags
74 def url(self):
75 path_info = rst.htmlpath(self.rstfile[len(cfg['rstdir']):])
76 return cfg['baseurl'] + path_info
78 def commentable(self):
79 return False
81 class BlogPost(Page):
83 def title_html(self):
84 return self.title
86 def commentable(self):
87 return True
89 def __cmp__(self, other):
90 return cmp(self.date(), other.date())
92 def __repr__(self):
93 return '<BlogPost "%s" on %s>' % (self.title, self.date())
96 if __name__ == '__main__':
97 # Import Psyco if available
98 try:
99 import psyco
100 psyco.full()
101 except ImportError:
102 pass
104 print '[%s - %s] rstdir:%s [using templatedir:%s]' % (
105 cfg['baseurl'], cfg['title'], cfg['rstdir'], cfg['templatedir'])
107 rstdir = cfg['rstdir']
108 blog_posts = []
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):
113 if blog_path in f:
114 page = BlogPost(f)
115 blog_posts.append(page)
116 else:
117 page = Page(f)
119 make_mako(rst.htmlpath(f),
120 [f],
121 'page.mako')
123 blog_posts.sort()
124 blog_posts.reverse()
126 # generate blog index
127 make_mako(join(rstdir, 'blog', 'index.html'),
128 [p.rstfile for p in blog_posts],
129 'blog/index.mako')
131 # generate blog feed
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')