devtools/hackdoc: render TOC

Change-Id: I03c224675c0d142d630d872994658faa2ac70691
diff --git a/devtools/hackdoc/markdown.go b/devtools/hackdoc/markdown.go
index fb46c5d..06e2c6e 100644
--- a/devtools/hackdoc/markdown.go
+++ b/devtools/hackdoc/markdown.go
@@ -16,13 +16,16 @@
 // renderMarkdown renders markdown to HTML, replacing all relative (intra-hackdoc) links with version that have ref set.
 func renderMarkdown(input []byte, ref string) []byte {
 	r := blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{
-		Flags: blackfriday.CommonHTMLFlags,
+		Flags: blackfriday.CommonHTMLFlags | blackfriday.TOC,
 	})
 
 	parser := blackfriday.New(blackfriday.WithRenderer(r), blackfriday.WithExtensions(blackfriday.CommonExtensions))
 	ast := parser.Parse(input)
 
 	var buf bytes.Buffer
+	buf.Write([]byte(`<div class="toc"><h1>Page Contents</h1>`))
+	r.RenderHeader(&buf, ast)
+	buf.Write([]byte(`</div><div class="content">`))
 	ast.Walk(func(node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
 		if ref != "" && entering && node.Type == blackfriday.Link {
 			dest := string(node.Destination)
@@ -37,6 +40,8 @@
 		}
 		return r.RenderNode(&buf, node, entering)
 	})
+	buf.Write([]byte(`</div>`))
+	r.RenderFooter(&buf, ast)
 	return buf.Bytes()
 }