doc: Generate, embed and animate a table of contents in the navbar itself
authorRamprasad Venkataraman <ramv@illinois.edu>
Mon, 6 Aug 2012 22:50:32 +0000 (17:50 -0500)
committerRamprasad Venkataraman <ramv@illinois.edu>
Tue, 7 Aug 2012 04:34:20 +0000 (23:34 -0500)
- extract TOC from index.html (BeautifulSoup)
- embed this into the navigation panel (again, dom manipulation)
- style it, hide it, and animate it (jquery)

doc/Makefile.common
doc/hilitesyntax.js
doc/manual.css
doc/markupSanitizer.py
doc/navmenuGenerator.py [new file with mode: 0755]

index 2212cc7ea888ee13038e04f8f911614ee30446ac..542cb9061b1cbcaccb85a8daedd8829f8e90b4df 100644 (file)
@@ -54,10 +54,14 @@ $(FILE).pdf: $(TEX) $(FILE).aux
 # HTML Target:
 html: html1page $(FILE)
 
+tmpFile = tmp-navmenu.html
+
 $(FILE): setup $(TEX) $(FILE).aux
        export MANUALTITLE=$(DOCTITLE) && $(LATEX2HTML) $(FILE).tex && unset MANUALTITLE
        ../l2h_sanitize_markup.sh
-       for f in $@/*.html; do echo "Sanitizing $$f"; ../markupSanitizer.py $$f > tmpop && cat tmpop > $$f && rm tmpop; done
+       ../navmenuGenerator.py $@/index.html > $(tmpFile)
+       for f in $@/*.html; do echo "Sanitizing $$f"; ../markupSanitizer.py $$f $(tmpFile) > tmpop && cat tmpop > $$f && rm tmpop; done
+       rm -f $(tmpFile)
 
 html1page: setup $(TEX) $(FILE).aux
        $(L2H) -split 0 $(FILE).tex
index de5b8b3cad6846b93ee2fd5aad2218ff430a1a4e..c11eed0ba46ddc9e40a2175c93af79a053610a15 100644 (file)
@@ -5,5 +5,8 @@ $(document).ready( function() {
     })
     .addClass("cm-s-lesser-dark")
     .children("span.cm-charmkeyword").css("color", "#dd5ef3");
+
+               $(".navigation").click( function() { $("ul.manual-toc").fadeToggle() } );
+               $(".navigation").mouseleave( function() { $("ul.manual-toc").fadeOut('slow') } );
 } )
 
index ab7739ed10893071a3d4de0349437df3096e4376..b2e27657d6b5ca771e4c520990d189c5fba952ab 100644 (file)
@@ -66,8 +66,33 @@ div.navigation {
                border-bottom: 1px #555555 solid;
                background: #dfdfdf;
                font-size: 80%;
+               cursor: pointer;
 }
 
+ul.manual-toc {
+               -moz-column-width: 32em;
+               -webkit-column-width: 32em;
+               display: none;
+}
+
+ul.manual-toc > li {
+               font-weight: bold;
+}
+
+ul.manual-toc > li > ul {
+               font-weight: normal;
+}
+
+ul.manual-toc li a {
+               color: #000;
+               text-decoration: none;
+}
+
+ul.manual-toc li a:hover {
+               color: #7b2e2e;
+}
+
+
 #nav-quicklinks {
                display:inline-block;
                padding: 0px 10px;
index 9b23ee3e786fdbf63c7ce50c3197b87e92d56de7..1dc34c34b76e8647b01c3c56f9ee06e08c41a7f9 100755 (executable)
@@ -28,6 +28,24 @@ for p in soup('pre'):
     for b in p('br'):
         b.extract()
 
+# Extract the navigation bar
+navmenu = soup.find('div', 'navigation')
+if navmenu:
+    navmenu.extract()
+
+# Wrap the remaining contents with a div
+soup.body['class'] = 'maincontainer'
+soup.body.name = 'div'
+soup.find('div','maincontainer').wrap( soup.new_tag('body') )
+
+if navmenu:
+    # Add a toc within the navmenu
+    navmenuTOC = BeautifulSoup(open("tmp-navmenu.html"), "lxml")
+    navmenuTOC = navmenuTOC.find('ul','manual-toc').extract()
+    navmenu.append(navmenuTOC)
+    # Reinsert the navigation bar at the end
+    soup.body.append(navmenu)
+
 # Print cleaned up markup to stdout
 print( soup.prettify(formatter="html") )
 
diff --git a/doc/navmenuGenerator.py b/doc/navmenuGenerator.py
new file mode 100755 (executable)
index 0000000..c9a8cb2
--- /dev/null
@@ -0,0 +1,36 @@
+#!/usr/bin/python
+
+from bs4 import BeautifulSoup
+import sys
+import os
+
+# Accept filename as user input
+argc = len( sys.argv )
+if (argc < 2): raise Exception
+fileName = sys.argv[1];
+
+# Construct a DOM object
+soup = BeautifulSoup(open(fileName), "lxml")
+
+# Get just the table of contents from the index page
+toc = soup.find("ul","ChildLinks").extract()
+
+# Retain only part and chapter titles
+for sctn in toc.select("li > ul > li > ul"):
+    sctn.extract()
+
+# Discard all spans (numbering)
+for spn in toc("span"):
+    spn.extract()
+
+# Discard all br tags
+for b in toc("br"):
+    b.extract()
+
+# Setup classes etc
+toc['class'] = "manual-toc"
+
+# Print cleaned up markup to stdout
+print( toc.prettify(formatter="html") )
+
+