Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 3 # Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
| 6 | 6 |
| 7 '''This utility cleans up the html files as emitted by doxygen so | 7 '''This utility cleans up the html files as emitted by doxygen so |
| 8 that they are suitable for publication on a Google documentation site. | 8 that they are suitable for publication on a Google documentation site. |
| 9 ''' | 9 ''' |
| 10 | 10 |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 129 table_index = table_parent.contents.index(table) | 129 table_index = table_parent.contents.index(table) |
| 130 table_parent.insert(table_index, tag) | 130 table_parent.insert(table_index, tag) |
| 131 | 131 |
| 132 def RemoveTopHeadings(self): | 132 def RemoveTopHeadings(self): |
| 133 '''Removes <div> sections with a header, tabs, or navpath class attribute''' | 133 '''Removes <div> sections with a header, tabs, or navpath class attribute''' |
| 134 header_tags = self.soup.findAll( | 134 header_tags = self.soup.findAll( |
| 135 name='div', | 135 name='div', |
| 136 attrs={'class' : re.compile('^(header|tabs[0-9]*|navpath)$')}) | 136 attrs={'class' : re.compile('^(header|tabs[0-9]*|navpath)$')}) |
| 137 [tag.extract() for tag in header_tags] | 137 [tag.extract() for tag in header_tags] |
| 138 | 138 |
| 139 def RemoveSeparators(self): | |
| 140 '''Removes separator rows from tables | |
| 141 | |
| 142 This seems to only exist in newer versions of doxygen (1.8). | |
| 143 ''' | |
| 144 separator_tags = self.soup.findAll( | |
| 145 name='tr', | |
| 146 attrs={'class': re.compile(r'^separator:.*$')}) | |
| 147 [tag.extract() for tag in separator_tags] | |
| 148 | |
| 149 def FixFragments(self): | |
| 150 '''''' | |
|
Sam Clegg
2014/09/20 00:02:36
Is this also a doxygen version thing? Maybe menti
binji
2014/09/22 17:54:02
Done.
| |
| 151 first = True | |
| 152 fragments = self.soup.findAll(name='div', attrs={'class': 'fragment'}) | |
| 153 for fragment in fragments: | |
| 154 # Replace: | |
| 155 # <div class="fragment"> | |
| 156 # <div class="line">...</div> | |
| 157 # | |
| 158 # With: | |
| 159 # <div class="fragment"> | |
| 160 # ... | |
| 161 lines = fragment.findAll(name='div', attrs={'class': 'line'}) | |
| 162 for line in lines: | |
| 163 line.replaceWithChildren() | |
| 164 | |
| 165 # Wrap the contents of the fragment in a <pre>, but only if it isn't | |
| 166 # already there. | |
| 167 if not fragment.pre: | |
| 168 pre = Tag(self.soup, name='pre', attrs={'class': 'fragment'}) | |
| 169 for el in reversed(fragment.contents): | |
| 170 pre.insert(0, el.extract()) | |
| 171 fragment.append(pre) | |
| 172 | |
| 139 def RemoveVersionNumbers(self, html): | 173 def RemoveVersionNumbers(self, html): |
| 140 '''Horrible hack to strip _#_# from struct names.''' | 174 '''Horrible hack to strip _#_# from struct names.''' |
| 141 return re.sub(r'(_\d_\d)(?=[": <])', '', html) | 175 return re.sub(r'(_\d_\d)(?=[": <])', '', html) |
| 142 | 176 |
| 143 def FixAll(self): | 177 def FixAll(self): |
| 144 self.FixTableHeadings() | 178 self.FixTableHeadings() |
| 145 self.RemoveTopHeadings() | 179 self.RemoveTopHeadings() |
| 180 self.RemoveSeparators() | |
| 181 self.FixFragments() | |
| 146 html = str(self.soup) | 182 html = str(self.soup) |
| 147 html = self.RemoveVersionNumbers(html) | 183 html = self.RemoveVersionNumbers(html) |
| 148 return html | 184 return html |
| 149 | 185 |
| 150 | 186 |
| 151 def main(argv): | 187 def main(argv): |
| 152 """Main entry for the doxy_cleanup utility | 188 """Main entry for the doxy_cleanup utility |
| 153 | 189 |
| 154 doxy_cleanup cleans up the html files generated by doxygen. | 190 doxy_cleanup cleans up the html files generated by doxygen. |
| 155 """ | 191 """ |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 182 for wildcard in FILES_TO_REMOVE: | 218 for wildcard in FILES_TO_REMOVE: |
| 183 Trace('Removing "%s":' % wildcard) | 219 Trace('Removing "%s":' % wildcard) |
| 184 path = os.path.join(root_dir, wildcard) | 220 path = os.path.join(root_dir, wildcard) |
| 185 for filename in glob.glob(path): | 221 for filename in glob.glob(path): |
| 186 Trace(' Removing "%s"' % filename) | 222 Trace(' Removing "%s"' % filename) |
| 187 os.remove(filename) | 223 os.remove(filename) |
| 188 | 224 |
| 189 # Now, fix the HTML files we've kept. | 225 # Now, fix the HTML files we've kept. |
| 190 Trace('Fixing HTML files...') | 226 Trace('Fixing HTML files...') |
| 191 for root, _, files in os.walk(root_dir): | 227 for root, _, files in os.walk(root_dir): |
| 228 files.sort() | |
| 192 for filename in files: | 229 for filename in files: |
| 193 if not os.path.splitext(filename)[1] == '.html': | 230 if not os.path.splitext(filename)[1] == '.html': |
| 194 Trace('Skipping %s' % filename) | 231 Trace('Skipping %s' % filename) |
| 195 continue | 232 continue |
| 196 | 233 |
| 197 filename = os.path.join(root, filename) | 234 filename = os.path.join(root, filename) |
| 198 Trace('Processing "%s"...' % filename) | 235 Trace('Processing "%s"...' % filename) |
| 199 try: | 236 try: |
| 200 with open(filename) as f: | 237 with open(filename) as f: |
| 201 html = f.read() | 238 html = f.read() |
| 202 | 239 |
| 203 fixer = HTMLFixer(html) | 240 fixer = HTMLFixer(html) |
| 204 output = fixer.FixAll() | 241 output = fixer.FixAll() |
| 205 with open(filename, 'w') as f: | 242 with open(filename, 'w') as f: |
| 206 f.write(output) | 243 f.write(output) |
| 207 except: | 244 except: |
| 208 sys.stderr.write("Error while processing %s\n" % filename) | 245 sys.stderr.write("Error while processing %s\n" % filename) |
| 209 raise | 246 raise |
| 210 | 247 |
| 211 return 0 | 248 return 0 |
| 212 | 249 |
| 213 if __name__ == '__main__': | 250 if __name__ == '__main__': |
| 214 try: | 251 try: |
| 215 rtn = main(sys.argv[1:]) | 252 rtn = main(sys.argv[1:]) |
| 216 except KeyboardInterrupt: | 253 except KeyboardInterrupt: |
| 217 sys.stderr.write('%s: interrupted\n' % os.path.basename(__file__)) | 254 sys.stderr.write('%s: interrupted\n' % os.path.basename(__file__)) |
| 218 rtn = 1 | 255 rtn = 1 |
| 219 sys.exit(rtn) | 256 sys.exit(rtn) |
| OLD | NEW |