#!/usr/bin/env python
from offog import die, warn
import codecs
import m25
import markdown
import optparse
import os
import re
import select
import sys
def generate_index(input):
class Replacer:
def __init__(self):
self.output = []
self.level = 0
self.prevn = -1
self.headn = 0
def replace(self, m):
(hashes, title) = m.group(1, 2)
n = len(hashes)
if n > self.prevn:
self.level += 1
elif n < self.prevn:
self.level -= 1
id = u"h%d" % (self.headn,)
self.headn += 1
self.output.append((u" " * self.level) + u'* ' + title + u'\n')
self.prevn = n
return hashes + u' ' + title + u''
rep = Replacer()
input = re.sub(r'(?m)^(#+)\s+(.*)$', rep.replace, input)
return (input, u"".join(rep.output))
DEFAULT_TEMPLATE = u"""
__HEAD__ __TITLE__
__TITLE__
__BODY__
"""
def generate_page(template, input, use_m25 = False):
if use_m25:
input = m25.expand_string(input)
input, index = generate_index(input)
title = []
def replace(m):
command = m.group(1)[2:].split(None, 1)
if command == []:
return u""
elif command[0] == u"title":
title.append(command[1])
return u""
elif command[0] == u"index":
return index[:-1]
data = re.sub(r'(?m)^(@@.*)$', replace, input)
bits = {
u"TITLE": u"".join(title),
u"BODY": markdown.markdown(data, output_format='html4'),
}
def replace(m):
return bits.get(m.group(1), u"")
return re.sub(r'__([^_]+)__', replace, template)
class Expander:
def __init__(self, options):
if options.template is None:
self.template = DEFAULT_TEMPLATE
else:
f = codecs.open(options.template, "r", encoding="utf8")
self.template = f.read()
f.close()
out = sys.stdout
self.out = codecs.getwriter("ascii")(out, errors="xmlcharrefreplace")
def expand(self, fin):
self.out.write(generate_page(self.template, fin.read()))
def close(self):
self.out.close()
def main():
parser = optparse.OptionParser(usage="%prog [options] [SOURCE-FILE...]")
parser.add_option("-t", dest="template", type="str", default=None,
help="template file")
(options, args) = parser.parse_args()
expander = Expander(options)
if len(args) == 0:
expander.expand(codecs.getreader("utf8")(sys.stdin))
else:
for fn in args:
f = codecs.open(fn, "r", encoding="utf8")
expander.expand(f)
f.close()
expander.close()
if __name__ == "__main__":
main()