doc: remove span tags from within pre sections
[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 and span tags from within pre sections
27 for p in soup('pre'):
28     for b in p('br'):
29         b.extract()
30     for s in p('span'):
31         s.unwrap()
32
33 # Extract the navigation bar
34 navmenu = soup.find('div', 'navigation')
35 if navmenu:
36     navmenu.extract()
37
38 # Wrap the remaining contents within a div
39 if not soup.find('div', id='maincontainer'):
40     soup.body['id'] = 'maincontainer'
41     soup.body.name = 'div'
42     soup.find('div', id='maincontainer').wrap( soup.new_tag('body') )
43
44 if navmenu:
45     # If this navmenu doesn't already have a TOC, insert one
46     if not navmenu.find('ul','manual-toc'):
47         # Add a toc within the navmenu
48         navmenuTOC = BeautifulSoup(open("tmp-navmenu.html"), "lxml")
49         navmenuTOC = navmenuTOC.find('ul','manual-toc').extract()
50         navmenuTOC.append( BeautifulSoup("".join([
51         '<li><a href="http://charm.cs.illinois.edu">PPL Homepage</a></li>',
52         '<li><a href="http://charm.cs.illinois.edu/help">Other Manuals</a></li>'])
53         ) )
54         navmenu.append(navmenuTOC)
55
56     # Insert navigation symbols to prev and next links
57     prevsymbol = soup.new_tag('span')
58     prevsymbol['class'] = 'navsymbol'
59     prevsymbol.string = u'\xab'
60     prv = navmenu.find('li',id='nav-prev')
61     if prv:
62         prv.find('a').insert(0, prevsymbol)
63
64     nextsymbol = soup.new_tag('span')
65     nextsymbol['class'] = 'navsymbol'
66     nextsymbol.string = u'\xbb'
67     nxt = navmenu.find('li',id='nav-next')
68     if nxt:
69         nxt.find('a').append(nextsymbol)
70
71     # Reinsert the navigation bar at the end
72     soup.body.append(navmenu)
73
74 # Extract the title
75 titl = soup.find('title')
76
77 # Replace the head section with the user-supplied head markup
78 soup.find('head').extract()
79 newhead = BeautifulSoup(open("../assets/head.html"), "lxml")
80 newhead = newhead.find('head').extract()
81 newhead.append(titl)
82 soup.html.body.insert_before(newhead)
83
84 # Print cleaned up markup to stdout
85 print( soup.prettify(formatter="html") )
86