#!/usr/bin/python2
import os
import os.path
import sys
from jinja2 import Environment, PackageLoader, Template, FileSystemLoader
import mistune
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'
for toc in self.toc_tree:
index, text, l, raw = toc
index = cnt
if l > level:
# ignore this level
continue
if first_level is None:
# based on first level
first_level = l
last_level = l
#yield '- %s' % (cnt, text)
yield ''
elif last_level == l:
yield '
\n- %s' % (cnt, text)
elif last_level == l - 1:
last_level = l
yield '
\n- %s' % (cnt, text)
elif last_level > l:
# close indention
yield '
'
while last_level > l:
yield '
\n \n'
last_level -= 1
yield '- %s' % (cnt, text)
cnt = cnt + 1
# close tags
yield '
\n'
while last_level > first_level:
yield '
\n\n'
last_level -= 1
yield '\n'
self.toc_count = 0
class TocRenderer(TocMixin, mistune.Renderer):
pass
################################################################################
#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()
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( block = md_rend )