Index: ppapi/cpp/documentation/doxy_cleanup.py |
=================================================================== |
--- ppapi/cpp/documentation/doxy_cleanup.py (revision 0) |
+++ ppapi/cpp/documentation/doxy_cleanup.py (revision 0) |
@@ -0,0 +1,142 @@ |
+#!/usr/bin/python |
+ |
+# Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+'''This utility cleans up the html files as emitted by doxygen so |
+that they are suitable for publication on a Google documentation site. |
+''' |
+ |
+import optparse |
+import os |
+import re |
+import shutil |
+import string |
+import sys |
+try: |
+ from BeautifulSoup import BeautifulSoup, Tag |
+except (ImportError, NotImplementedError): |
+ print ("This tool requires the BeautifulSoup package " |
+ "(see http://www.crummy.com/software/BeautifulSoup/).\n" |
+ "Make sure that the file BeautifulSoup.py is either in this directory " |
+ "or is available in your PYTHON_PATH") |
+ raise |
+ |
+ |
+class HTMLFixer(object): |
+ '''This class cleans up the html strings as produced by Doxygen |
+ ''' |
+ |
+ def __init__(self, html): |
+ self.soup = BeautifulSoup(html) |
+ |
+ def FixTableHeadings(self): |
+ '''Fixes the doxygen table headings. |
+ |
+ This includes: |
+ - Using bare <h2> title row instead of row embedded in <tr><td> in table |
+ - Putting the "name" attribute into the "id" attribute of the <tr> tag. |
+ - Splitting up tables into multiple separate tables if a table |
+ heading appears in the middle of a table. |
+ |
+ For example, this html: |
+ <table> |
+ <tr><td colspan="2"><h2><a name="pub-attribs"></a> |
+ Data Fields List</h2></td></tr> |
+ ... |
+ </table> |
+ |
+ would be converted to this: |
+ <h2>Data Fields List</h2> |
+ <table> |
+ ... |
+ </table> |
+ ''' |
+ |
+ table_headers = [] |
+ for tag in self.soup.findAll('tr'): |
+ if tag.td and tag.td.h2 and tag.td.h2.a and tag.td.h2.a['name']: |
+ #tag['id'] = tag.td.h2.a['name'] |
+ tag.string = tag.td.h2.a.next |
+ tag.name = 'h2' |
+ table_headers.append(tag) |
+ |
+ # reverse the list so that earlier tags don't delete later tags |
+ 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()) |
+ # 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() |
+ table = tag.parent |
+ table_parent = table.parent |
+ table_index = table_parent.contents.index(table) |
+ new_table = Tag(self.soup, name='table', attrs=table.attrs) |
+ table_parent.insert(table_index + 1, new_table) |
+ tag_index = table.contents.index(tag) |
+ for index, row in enumerate(table.contents[tag_index:]): |
+ new_table.insert(index, row) |
+ # Now move the <h2> tag to be in front of the <table> tag |
+ assert tag.parent.name == 'table' |
+ table = tag.parent |
+ table_parent = table.parent |
+ table_index = table_parent.contents.index(table) |
+ table_parent.insert(table_index, tag) |
+ |
+ def RemoveTopHeadings(self): |
+ '''Removes <div> sections with a header, tabs, or navpath class attribute''' |
+ header_tags = self.soup.findAll( |
+ name='div', |
+ attrs={'class' : re.compile('^(header|tabs[0-9]*|navpath)$')}) |
+ [tag.extract() for tag in header_tags] |
+ |
+ 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 |
+ |
+ return 0 |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |
Property changes on: ppapi/cpp/documentation/doxy_cleanup.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |