aboutsummaryrefslogtreecommitdiffstats
path: root/src/md.py
blob: a37d5ce3f5bb1dfea9e044e490a1d6691b17c20d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/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 = '<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"
	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 )