diff options
author | FreeArtMan <dos21h@gmail.com> | 2016-05-22 16:25:49 +0100 |
---|---|---|
committer | FreeArtMan <dos21h@gmail.com> | 2016-05-22 16:25:49 +0100 |
commit | 5d1395063460945524c2e6ac6194e61ef40c220a (patch) | |
tree | 926433e831a71c118d36ab22ab5a6bc57a5bba2a /src/md.py | |
parent | c8270aa6fcb9aaac7b9d35c672f59995687aefd9 (diff) | |
download | md-site-5d1395063460945524c2e6ac6194e61ef40c220a.tar.gz md-site-5d1395063460945524c2e6ac6194e61ef40c220a.zip |
Added TOC for mistune
Diffstat (limited to 'src/md.py')
-rwxr-xr-x | src/md.py | 102 |
1 files changed, 99 insertions, 3 deletions
@@ -7,6 +7,97 @@ 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 = '<h%d id="toc-%d">%s</h%d>\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 '<h1>%s</h1>\n' % (self.title) + + yield '<ul id="table-of-content">\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 '<li><a href="#toc-%d">%s</a>' % (cnt, text) + yield '' + elif last_level == l: + yield '</li>\n<li><a href="#toc-%d">%s</a>' % (cnt, text) + elif last_level == l - 1: + last_level = l + yield '<ul>\n<li><a href="#toc-%d">%s</a>' % (cnt, text) + elif last_level > l: + # close indention + yield '</li>' + while last_level > l: + yield '</ul>\n</li>\n' + last_level -= 1 + yield '<li><a href="#toc-%d">%s</a>' % (cnt, text) + cnt = cnt + 1 + + # close tags + yield '</li>\n' + while last_level > first_level: + yield '</ul>\n<!--</li>-->\n' + last_level -= 1 + + yield '</ul>\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" @@ -15,7 +106,7 @@ if len(sys.argv) < 2: md_fn = sys.argv[1] #template loader -loader = FileSystemLoader( "/home/fam/prog/python/mdsite/templ/" ) +loader = FileSystemLoader( "/home/fam/downloads/source/repos/md-site/src/templ" ) templ_env = Environment( loader = loader ) t = templ_env.get_template("main.thtml") @@ -23,7 +114,12 @@ t = templ_env.get_template("main.thtml") #get md file f = open( md_fn, "r" ) data = f.read() -md = mistune.Markdown(rule=True) -md_rend = md.render( 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( block = md_rend )
\ No newline at end of file |