# below for details.
captcha_method = "title"
+# How many articles to show in the index
+index_articles = 10
+
#
# End of configuration
years: %(yearlinks)s<br/>
subscribe: <a href="%(url)s/atom">atom</a><br/>
views: <a href="%(url)s/">blog</a> <a href="%(url)s/list">list</a><br/>
+ tags: %(taglinks)s<br/>
</div>
</body>
def valid_link(link):
import re
- mail_re = r"^[^ \t\n\r@<>()]+@[a-z0-9][a-z0-9\.\-_]*\.[a-z]+$"
scheme_re = r'^[a-zA-Z]+:'
+ mail_re = r"^[^ \t\n\r@<>()]+@[a-z0-9][a-z0-9\.\-_]*\.[a-z]+$"
url_re = r'^(?:[a-z0-9\-]+|[a-z0-9][a-z0-9\-\.\_]*\.[a-z]+)' \
r'(?::[0-9]+)?(?:/.*)?$'
- scheme = ''
- rest = link
+
if re.match(scheme_re, link, re.I):
scheme, rest = link.split(':', 1)
- if (not scheme or scheme == 'mailto') and re.match(mail_re, rest, re.I):
+ # if we have an scheme and a rest, assume the link is valid
+ # and return it as-is; otherwise (having just the scheme) is
+ # invalid
+ if rest:
+ return link
+ return None
+
+ # at this point, we don't have a scheme; we will try to recognize some
+ # common addresses (mail and http at the moment) and complete them to
+ # form a valid link, if we fail we will just claim it's invalid
+ if re.match(mail_re, link, re.I):
return 'mailto:' + link
- if not scheme and re.match(url_re, rest, re.I):
- return 'http://' + rest
- if scheme:
- return link
+ elif re.match(url_re, link, re.I):
+ return 'http://' + link
+
return None
def sanitize(obj):
- if isinstance(obj, basestring):
- return cgi.escape(obj, True)
- return obj
+ return cgi.escape(obj, quote = True)
# find out our URL, needed for syndication
'showyear': showyear,
'monthlinks': ' '.join(db.get_month_links(showyear)),
'yearlinks': ' '.join(db.get_year_links()),
+ 'taglinks': ' '.join(db.get_tag_links()),
}
def get_template(self, page_name, default_template, extra_vars = None):
vars = comment.to_vars()
if comment.link:
vars['linked_author'] = '<a href="%s">%s</a>' \
- % (comment.link, comment.author)
+ % (vars['link'], vars['author'])
else:
- vars['linked_author'] = comment.author
+ vars['linked_author'] = vars['author']
return self.get_template(
'com_header', default_comment_header, vars)
class CommentDB (object):
def __init__(self, article):
self.path = os.path.join(comments_path, article.uuid)
+ # if comments were enabled after the article was added, we
+ # will need to create the directory
+ if not os.path.exists(self.path):
+ os.mkdir(self.path, 0777)
+
self.comments = []
self.load(article)
self.uuids = {}
self.actyears = set()
self.actmonths = set()
+ self.acttags = set()
self.load()
def get_articles(self, year = 0, month = 0, day = 0, tags = None):
datetime.datetime.fromtimestamp(float(l[1])),
datetime.datetime.fromtimestamp(float(l[2])))
self.uuids[a.uuid] = a
+ self.acttags.update(a.tags)
self.actyears.add(a.created.year)
self.actmonths.add((a.created.year, a.created.month))
self.articles.append(a)
ml.append(s)
return ml
+ def get_tag_links(self):
+ tl = list(self.acttags)
+ tl.sort()
+ return [ '<a href="%s/tag/%s">%s</a>' % (blog_url,
+ sanitize(t), sanitize(t)) for t in tl ]
+
#
# Main
#
print template.get_main_header()
print '<h2>Articles</h2>'
for a in articles:
- print '<li><a href="%(url)s/uuid/%(uuid)s">%(title)s</a></li>' \
+ print '<li><a href="%(url)s/post/%(uuid)s">%(title)s</a></li>' \
% { 'url': blog_url,
'uuid': a.uuid,
'title': a.title,
<published>%(ciso)sZ</published>
<updated>%(uiso)sZ</updated>
<content type="xhtml">
- <div xmlns="http://www.w3.org/1999/xhtml"><p>
+ <div xmlns="http://www.w3.org/1999/xhtml">
%(contents)s
- </p></div>
+ </div>
</content>
</entry>
""" % vars
if atom:
articles = db.get_articles(tags = tags)
articles.sort(reverse = True)
- render_atom(articles[:10])
+ render_atom(articles[:index_articles])
elif style:
render_style()
elif post:
articles = db.get_articles()
articles.sort(cmp = Article.title_cmp)
render_artlist(articles, db)
- elif comment:
+ elif comment and enable_comments:
form_data = CommentFormData(author.strip().replace('\n', ' '),
link.strip().replace('\n', ' '), captcha,
body.replace('\r', ''))
articles = db.get_articles(year, month, day, tags)
articles.sort(reverse = True)
if not year and not month and not day and not tags:
- articles = articles[:10]
+ articles = articles[:index_articles]
render_html(articles, db, year)