# Default template
-default_main_header = """
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+default_main_header = """\
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<link rel="alternate" title="%(title)s" href="%(fullurl)s/atom"
type="application/atom+xml" />
-<link href="%(css_url)s" rel="stylesheet"
- type="text/css" />
+<link href="%(css_url)s" rel="stylesheet" type="text/css" />
<title>%(title)s</title>
</head>
"""
default_main_footer = """
-</div><p/>
-<hr/><br/>
+</div>
<div class="footer">
%(showyear)s: %(monthlinks)s<br/>
years: %(yearlinks)s<br/>
body {
font-family: sans-serif;
font-size: small;
+ width: 52em;
}
div.content {
- width: 50%;
+ width: 96%;
}
h1 {
font-size: large;
border-bottom: 2px solid #99F;
- width: 60%;
+ width: 100%;
margin-bottom: 1em;
}
margin-bottom: 2em;
}
-hr {
- float: left;
- height: 2px;
- border: 0;
- background-color: #99F;
- width: 60%;
-}
-
div.footer {
+ margin-top: 1em;
+ padding-top: 0.4em;
+ width: 100%;
+ border-top: 2px solid #99F;
font-size: x-small;
}
'yearlinks': ' '.join(db.get_year_links()),
}
- def get_main_header(self):
- p = self.tpath + '/header.html'
+ def get_template(self, page_name, default_template, extra_vars = None):
+ if extra_vars is None:
+ vars = self.vars
+ else:
+ vars = self.vars.copy()
+ vars.update(extra_vars)
+
+ p = '%s/%s.html' % (self.tpath, page_name)
if os.path.isfile(p):
- return open(p).read() % self.vars
- return default_main_header % self.vars
+ return open(p).read() % vars
+ return default_template % vars
+
+ def get_main_header(self):
+ return self.get_template('header', default_main_header)
def get_main_footer(self):
- p = self.tpath + '/footer.html'
- if os.path.isfile(p):
- return open(p).read() % self.vars
- return default_main_footer % self.vars
+ return self.get_template('footer', default_main_footer)
def get_article_header(self, article):
- avars = self.vars.copy()
- avars.update( {
- 'arttitle': article.title,
- 'author': article.author,
- 'date': article.created.isoformat(' '),
- 'uuid': article.uuid,
- 'created': article.created.isoformat(' '),
- 'updated': article.updated.isoformat(' '),
- 'tags': article.get_tags_links(),
-
- 'cyear': article.created.year,
- 'cmonth': article.created.month,
- 'cday': article.created.day,
- 'chour': article.created.hour,
- 'cminute': article.created.minute,
- 'csecond': article.created.second,
-
- 'uyear': article.updated.year,
- 'umonth': article.updated.month,
- 'uday': article.updated.day,
- 'uhour': article.updated.hour,
- 'uminute': article.updated.minute,
- 'usecond': article.updated.second,
- } )
-
- p = self.tpath + '/art_header.html'
- if os.path.isfile(p):
- return open(p).read() % avars
- return default_article_header % avars
+ return self.get_template(
+ 'art_header', default_article_header, article.to_vars())
def get_article_footer(self, article):
- avars = self.vars.copy()
- avars.update( {
- 'arttitle': article.title,
- 'author': article.author,
- 'date': article.created.isoformat(' '),
- 'uuid': article.uuid,
- 'created': article.created.isoformat(' '),
- 'updated': article.updated.isoformat(' '),
- 'tags': article.get_tags_links(),
-
- 'cyear': article.created.year,
- 'cmonth': article.created.month,
- 'cday': article.created.day,
- 'chour': article.created.hour,
- 'cminute': article.created.minute,
- 'csecond': article.created.second,
-
- 'uyear': article.updated.year,
- 'umonth': article.updated.month,
- 'uday': article.updated.day,
- 'uhour': article.updated.hour,
- 'uminute': article.updated.minute,
- 'usecond': article.updated.second,
- } )
-
- p = self.tpath + '/art_footer.html'
- if os.path.isfile(p):
- return open(p).read() % avars
- return default_article_footer % avars
+ return self.get_template(
+ 'art_footer', default_article_footer, article.to_vars())
class Article (object):
writer_name = "html")
return parts['body'].encode('utf8')
+ def to_vars(self):
+ return {
+ 'arttitle': self.title,
+ 'author': self.author,
+ 'date': self.created.isoformat(' '),
+ 'uuid': self.uuid,
+ 'tags': self.get_tags_links(),
+
+ 'created': self.created.isoformat(' '),
+ 'ciso': self.created.isoformat(),
+ 'cyear': self.created.year,
+ 'cmonth': self.created.month,
+ 'cday': self.created.day,
+ 'chour': self.created.hour,
+ 'cminute': self.created.minute,
+ 'csecond': self.created.second,
+
+ 'updated': self.updated.isoformat(' '),
+ 'uiso': self.updated.isoformat(),
+ 'uyear': self.updated.year,
+ 'umonth': self.updated.month,
+ 'uday': self.updated.day,
+ 'uhour': self.updated.hour,
+ 'uminute': self.updated.minute,
+ 'usecond': self.updated.second,
+ }
+
def get_tags_links(self):
l = []
tags = list(self.tags)
}
for a in articles:
+ vars = a.to_vars()
+ vars.update( {
+ 'url': full_url,
+ 'contents': a.to_html(),
+ } )
print """
<entry>
<title>%(arttitle)s</title>
<link href="%(url)s/post/%(uuid)s" />
<id>%(url)s/post/%(uuid)s</id>
<summary>%(arttitle)s</summary>
- <published>%(created)sZ</published>
- <updated>%(updated)sZ</updated>
+ <published>%(ciso)sZ</published>
+ <updated>%(uiso)sZ</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml"><p>
%(contents)s
</p></div>
</content>
</entry>
- """ % {
- 'arttitle': a.title,
- 'author': a.author,
- 'uuid': a.uuid,
- 'url': full_url,
- 'created': a.created.isoformat(),
- 'updated': a.updated.isoformat(),
- 'contents': a.to_html(),
- }
-
+ """ % vars
print "</feed>"
def render_style():
- print 'Content-type: text/plain\n'
+ print 'Content-type: text/css\r\n\r\n',
print default_css
def handle_cgi():