#!/usr/bin/python2 import os import os.path import sys from jinja2 import Environment, PackageLoader, Template, FileSystemLoader import mistune #global name for templates article = {} class TocMixin(): """TOC mixin for Renderer, mix this with Renderer:: class TocRenderer(TocMixin, Renderer): pass toc = TocRenderer() md = mistune.Markdown(renderer=toc) # required in this order toc.reset_toc() # initial the status md.parse(text) # parse for headers toc.render_toc(level=3) # render TOC HTML """ def reset_toc(self): self.toc_tree = [] self.toc_count = 0 self.title = None def header(self, text, level, raw=None): rv = "" if level != 1: rv = '%s\n' % ( level, self.toc_count, text, level ) else: self.title = text self.toc_tree.append((self.toc_count, text, level, raw)) self.toc_count += 1 return rv def render_toc(self, level=3): """Render TOC to HTML. :param level: render toc to the given level """ return ''.join(self._iter_toc(level)) def _iter_toc(self, level): first_level = None last_level = None cnt = 0 if (self.title != None): yield '

%s

\n' % (self.title) yield '\n\n' last_level -= 1 yield '\n' self.toc_count = 0 class TocRenderer(TocMixin, mistune.Renderer): pass ################################################################################ #get first tags and use them to configure some bits def get_tags(data): text = "" tag_section = True for line in data.split("\n"): if tag_section: tag = line.split(":") l = len(tag) if l != 2: tag_section = False text += line+"\n" else: article[tag[0]] = tag[1] else: text += line+"\n" return text ################################################################################ #check if there is input file if len(sys.argv) < 2: print "Need more arguments" sys.exit(0) md_fn = sys.argv[1] #template loader loader = FileSystemLoader( "/home/fam/downloads/source/repos/md-site/src/templ" ) templ_env = Environment( loader = loader ) t = templ_env.get_template("main.thtml") #get md file f = open( md_fn, "r" ) data = f.read() data = get_tags(data) toc = TocRenderer() md = mistune.Markdown(rule=True,renderer=toc) toc.reset_toc() md.parse(data) md_rend_toc = toc.render_toc(level=3) md_rend = md_rend_toc + md.render( data ) print t.render( article=article, block = md_rend )