#!/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__
__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()