Merge remote-tracking branch 'origin/charm' into charm
[charm.git] / doc / markupSanitizer.py
1 #!/usr/bin/python
2
3 from bs4 import BeautifulSoup
4 import sys
5 import os
6
7 # Accept filename as user input
8 argc = len( sys.argv )
9 if (argc < 2): raise Exception
10 fileName = sys.argv[1];
11
12 # Construct a DOM object
13 soup = BeautifulSoup(open(fileName), "lxml")
14
15 # Assuming, tt tags are not spewed recklessly by latex2html,
16 # replace them with code tags
17 for t in soup('tt'):
18     t.wrap( soup.new_tag('code') )
19     t.unwrap()
20
21 # Rewrap all div class=alltt blocks in pre tags
22 for d in soup('div','alltt'):
23     d.wrap( soup.new_tag('pre') )
24     d.unwrap()
25
26 # Remove br tags required within pre sections
27 for p in soup('pre'):
28     for b in p('br'):
29         b.extract()
30
31 # Extract the navigation bar
32 navmenu = soup.find('div', 'navigation')
33 if navmenu:
34     navmenu.extract()
35
36 # Wrap the remaining contents within a div
37 if not soup.find('div', id='maincontainer'):
38     soup.body['id'] = 'maincontainer'
39     soup.body.name = 'div'
40     soup.find('div', id='maincontainer').wrap( soup.new_tag('body') )
41
42 if navmenu:
43     # If this navmenu doesn't already have a TOC, insert one
44     if not navmenu.find('ul','manual-toc'):
45         # Add a toc within the navmenu
46         navmenuTOC = BeautifulSoup(open("tmp-navmenu.html"), "lxml")
47         navmenuTOC = navmenuTOC.find('ul','manual-toc').extract()
48         navmenuTOC.append( BeautifulSoup("".join([
49         '<li><a href="http://charm.cs.illinois.edu">PPL Homepage</a></li>',
50         '<li><a href="http://charm.cs.illinois.edu/help">Other Manuals</a></li>'])
51         ) )
52         navmenu.append(navmenuTOC)
53
54     # Insert navigation symbols to prev and next links
55     prevsymbol = soup.new_tag('span')
56     prevsymbol['class'] = 'navsymbol'
57     prevsymbol.string = u'\xab'
58     prv = navmenu.find('li',id='nav-prev')
59     if prv:
60         prv.find('a').insert(0, prevsymbol)
61
62     nextsymbol = soup.new_tag('span')
63     nextsymbol['class'] = 'navsymbol'
64     nextsymbol.string = u'\xbb'
65     nxt = navmenu.find('li',id='nav-next')
66     if nxt:
67         nxt.find('a').append(nextsymbol)
68
69     # Reinsert the navigation bar at the end
70     soup.body.append(navmenu)
71
72 # Extract the title
73 titl = soup.find('title')
74
75 # Replace the head section with the user-supplied head markup
76 soup.find('head').extract()
77 newhead = BeautifulSoup(open("../assets/head.html"), "lxml")
78 newhead = newhead.find('head').extract()
79 newhead.append(titl)
80 soup.html.body.insert_before(newhead)
81
82 # Print cleaned up markup to stdout
83 print( soup.prettify(formatter="html") )
84