Index: native_client_sdk/src/doc/doxygen/doxy_cleanup.py |
diff --git a/ppapi/c/documentation/doxy_cleanup.py b/native_client_sdk/src/doc/doxygen/doxy_cleanup.py |
similarity index 51% |
copy from ppapi/c/documentation/doxy_cleanup.py |
copy to native_client_sdk/src/doc/doxygen/doxy_cleanup.py |
index 01b1ca07d4e72d00eae19d4f5a161123b346501d..491fd047109cd921e33a57fdc24882a13cdd16fe 100755 |
--- a/ppapi/c/documentation/doxy_cleanup.py |
+++ b/native_client_sdk/src/doc/doxygen/doxy_cleanup.py |
@@ -8,11 +8,11 @@ |
that they are suitable for publication on a Google documentation site. |
''' |
+import glob |
import optparse |
import os |
import re |
import shutil |
-import string |
import sys |
try: |
from BeautifulSoup import BeautifulSoup, Tag |
@@ -24,6 +24,50 @@ except (ImportError, NotImplementedError): |
raise |
+def Trace(msg): |
+ if Trace.verbose: |
+ sys.stderr.write(str(msg) + '\n') |
+ |
+Trace.verbose = False |
+ |
+ |
+FILES_TO_REMOVE = [ |
+ '*.css', |
+ '*.map', |
+ '*.md5', |
+ 'annotated.html', |
+ 'bc_s.png', |
+ 'classes.html', |
+ 'closed.png', |
+ 'doxygen.png', |
+ 'files.html', |
+ 'functions*.html', |
+ 'globals_0x*.html', |
+ 'globals_enum.html', |
+ 'globals_eval.html', |
+ 'globals_func.html', |
+ 'globals.html', |
+ 'globals_type.html', |
+ 'globals_vars.html', |
+ 'graph_legend.html', |
+ 'graph_legend.png', |
+ 'hierarchy.html', |
+ 'index_8dox.html', |
+ 'index.html', |
+ 'modules.html', |
+ 'namespacemembers_func.html', |
+ 'namespacemembers.html', |
+ 'namespaces.html', |
+ 'nav_f.png', |
+ 'nav_h.png', |
+ 'open.png', |
+ 'tab_a.png', |
+ 'tab_b.png', |
+ 'tab_h.png', |
+ 'tab_s.png', |
+] |
+ |
+ |
class HTMLFixer(object): |
'''This class cleans up the html strings as produced by Doxygen |
''' |
@@ -66,10 +110,10 @@ class HTMLFixer(object): |
table_headers.reverse() |
# Split up tables that have multiple table header (th) rows |
for tag in table_headers: |
- print "Header tag: %s is %s" % (tag.name, tag.string.strip()) |
+ Trace("Header tag: %s is %s" % (tag.name, tag.string.strip())) |
# Is this a heading in the middle of a table? |
if tag.findPreviousSibling('tr') and tag.parent.name == 'table': |
- print "Splitting Table named %s" % tag.string.strip() |
+ Trace("Splitting Table named %s" % tag.string.strip()) |
table = tag.parent |
table_parent = table.parent |
table_index = table_parent.contents.index(table) |
@@ -92,51 +136,84 @@ class HTMLFixer(object): |
attrs={'class' : re.compile('^(header|tabs[0-9]*|navpath)$')}) |
[tag.extract() for tag in header_tags] |
+ def RemoveVersionNumbers(self, html): |
+ '''Horrible hack to strip _#_# from struct names.''' |
+ return re.sub(r'(_\d_\d)(?=[": <])', '', html) |
+ |
def FixAll(self): |
self.FixTableHeadings() |
self.RemoveTopHeadings() |
- |
- def __str__(self): |
- return str(self.soup) |
- |
- |
-def main(): |
- '''Main entry for the doxy_cleanup utility |
- |
- doxy_cleanup takes a list of html files and modifies them in place.''' |
- |
- parser = optparse.OptionParser(usage='Usage: %prog [options] files...') |
- |
- parser.add_option('-m', '--move', dest='move', action='store_true', |
- default=False, help='move html files to "original_html"') |
- |
- options, files = parser.parse_args() |
- |
- if not files: |
- parser.print_usage() |
- return 1 |
- |
- for filename in files: |
- try: |
- with open(filename, 'r') as file: |
- html = file.read() |
- |
- print "Processing %s" % filename |
- fixer = HTMLFixer(html) |
- fixer.FixAll() |
- with open(filename, 'w') as file: |
- file.write(str(fixer)) |
- if options.move: |
- new_directory = os.path.join( |
- os.path.dirname(os.path.dirname(filename)), 'original_html') |
- if not os.path.exists(new_directory): |
- os.mkdir(new_directory) |
- shutil.move(filename, new_directory) |
- except: |
- print "Error while processing %s" % filename |
- raise |
+ html = str(self.soup) |
+ html = self.RemoveVersionNumbers(html) |
+ return html |
+ |
+ |
+def main(argv): |
+ """Main entry for the doxy_cleanup utility |
+ |
+ doxy_cleanup cleans up the html files generated by doxygen. |
+ """ |
+ |
+ parser = optparse.OptionParser(usage='Usage: %prog [options] directory') |
+ parser.add_option('-v', '--verbose', help='verbose output.', |
+ action='store_true') |
+ options, files = parser.parse_args(argv) |
+ |
+ if len(files) != 1: |
+ parser.error('Expected one directory') |
+ |
+ if options.verbose: |
+ Trace.verbose = True |
+ |
+ root_dir = files[0] |
+ html_dir = os.path.join(root_dir, 'html') |
+ |
+ # Doxygen puts all files in an 'html' directory. |
+ # First, move all files from that directory to root_dir. |
+ for filename in glob.glob(os.path.join(html_dir, '*')): |
+ Trace('Moving %s -> %s' % (filename, root_dir)) |
+ shutil.move(filename, root_dir) |
+ |
+ # Now remove the 'html' directory. |
+ Trace('Removing %s' % html_dir) |
+ os.rmdir(html_dir) |
+ |
+ # Then remove unneeded files. |
+ for wildcard in FILES_TO_REMOVE: |
+ Trace('Removing "%s":' % wildcard) |
+ path = os.path.join(root_dir, wildcard) |
+ for filename in glob.glob(path): |
+ Trace(' Removing "%s"' % filename) |
+ os.remove(filename) |
+ |
+ # Now, fix the HTML files we've kept. |
+ Trace('Fixing HTML files...') |
+ for root, _, files in os.walk(root_dir): |
+ for filename in files: |
+ if not os.path.splitext(filename)[1] == '.html': |
+ Trace('Skipping %s' % filename) |
+ continue |
+ |
+ filename = os.path.join(root, filename) |
+ Trace('Processing "%s"...' % filename) |
+ try: |
+ with open(filename) as f: |
+ html = f.read() |
+ |
+ fixer = HTMLFixer(html) |
+ output = fixer.FixAll() |
+ with open(filename, 'w') as f: |
+ f.write(output) |
+ except: |
+ sys.stderr.write("Error while processing %s\n" % filename) |
+ raise |
return 0 |
if __name__ == '__main__': |
- sys.exit(main()) |
+ try: |
+ rtn = main(sys.argv[1:]) |
+ except KeyboardInterrupt: |
+ sys.stderr.write('%s: interrupted\n' % os.path.basename(__file__)) |
+ rtn = 1 |
+ sys.exit(rtn) |