""".lstrip()
address = '\n'
address += 'Sean B. Palmer, \n'
address += 'and the irc.freenode.net/#sbp folk.\n'
address += '\n'
def quoteHTML(s):
s = s.replace('&', '&')
s = s.replace('<', '<')
return s
t_wlink = r'(?}\s]+) ([^}]+)(?"]+$')
def wikiLinkify(s):
def htmlify(m):
uri, title = m.group(1), m.group(2)
return '%s' % (uri, title)
s = r_wlink.sub(htmlify, s)
return s
def unicodeify(s):
i = int(s, 16)
if i in (0x9, 0xA, 0xD) + tuple(xrange(0x20, 0x7E)):
return chr(i)
elif i > 0x10FFFF:
raise "UnicodeError", "Codepoint exceeds U+10FFFF"
return '%s;' % s
def wikiFormat(s):
# @@ reserve \[A-Za-z]+{...} for future extensions
# @@ use a proper parser, or catch the matches using a function
result = ''
pos = 0
while pos < len(s):
m = r_wlink.match(s[pos:])
if m:
span = m.span()
result += wikiLinkify(s[pos:pos+span[1]])
pos += len(m.group(0))
else:
m = re.compile(r'[A-Za-z0-9]--[A-Za-z0-9]').match(s[pos:])
if m:
result += s[pos] + '—' + s[pos+3]
pos += 4
else:
m = r_uniquot.match(s[pos:])
if m:
result += unicodeify(m.group(1))
pos += len(m.group(0))
elif s[pos:pos+4] == '\n..\n':
result += '\n\n
'
pos += 4
elif s[pos] == '&':
result += '&'
pos += 1
elif s[pos] == '<':
result += '<'
pos += 1
else:
result += s[pos]
pos += 1
return result
def html(title, body):
s = '\n'
s += '
\n'
s += '%s\n' % title
s += '\n'
s += '\n'
s += '\n'
s += body
s += '\n'
s += ''
return s
def getEntryIDs():
# Each entry's content will be stored as (digit).html
# So we can use that as a kind of entry-index
filenames = filter(lambda s: (s.endswith('.html') and
s[:-len('.html')].isdigit()),
os.listdir('.'))
filenames = [int(fn[:-len('.html')]) for fn in filenames]
filenames.sort()
return filenames
def postEntry(form):
# Compute the next available entry ID
filenames = getEntryIDs()
if filenames:
nextid = filenames[-1] + 1
else: nextid = 1
t = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime())
title = str(form.get('title')).strip()
content = str(form.get('content')).strip()
nick = str(form.get('nick')).strip()
data = open('./%s.html' % nextid, 'w')
print >> data, '' % t
print >> data, '%s' % quoteHTML(title)
print >> data, ('')
print >> data, '
' % (nextid,
t.replace('T', ' ').replace('Z', ' UTC'))
data.close()
# Return the ID as an int
return int(nextid)
class Entry(object):
def __init__(self, i):
self.data = open('./%s.html' % i, 'r').read()
self.lines = self.data.splitlines()
self.date = self.lines[0][5:-4]
self.title = self.lines[1][7:-8]
def __str__(self):
return '\n'.join(self.lines[3:])
def buildIndex(n=None):
if n is None:
n = 10
result = navigation
result += '
%s \n' % blogname
result += '(by sbp & '
result += 'friends)
\n'
filenames = getEntryIDs()[-n:] # get the last ten or so entries
if filenames:
filenames.reverse()
for fn in filenames:
e = Entry(fn)
result += '
\n' + str(e) + '
\n\n'
else: result += '
No entries yet.
\n'
result += address
return html("%s - the noets of #sbp &c." % blogname, result)
def buildArchives():
filenames = getEntryIDs()
filenames.reverse()
result = navigation
result += '
\n
\n'
months = {}
for filename in filenames:
e = Entry(filename)
date, title = e.date, e.title
date = date[:10]
month = date[:7]
if not months.has_key(month):
result += '