| #!/usr/bin/env python3 |
| # Copyright 2014 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. |
| |
| # Runs 'gn help' and various subhelps, and spits out html. |
| # TODO: |
| # - Handle numbered and dashed lists -> <ol> <ul>. (See "os" and "toolchain"). |
| # - Handle "Arguments:" blocks a bit better (the argument names could be |
| # distinguished). |
| # - Convert "|blahblah|" to <code>. |
| # - Spit out other similar formats like wiki, markdown, whatever. |
| |
| import cgi |
| import subprocess |
| import sys |
| |
| |
| def GetOutput(*args): |
| try: |
| return subprocess.check_output([sys.argv[1]] + list(args)) |
| except subprocess.CalledProcessError: |
| return '' |
| |
| |
| def ParseTopLevel(out): |
| commands = [] |
| output = [] |
| for line in out.splitlines(): |
| if line.startswith(' '): |
| command, sep, rest = line.partition(':') |
| command = command.strip() |
| is_option = command.startswith('-') |
| output_line = ['<li>'] |
| if not is_option: |
| commands.append(command) |
| output_line.append('<a href="#' + cgi.escape(command) + '">') |
| output_line.append(cgi.escape(command)) |
| if not is_option: |
| output_line.append('</a>') |
| output_line.extend([sep + cgi.escape(rest) + '</li>']) |
| output.append(''.join(output_line)) |
| else: |
| output.append('<h2>' + cgi.escape(line) + '</h2>') |
| return commands, output |
| |
| |
| def ParseCommand(command, out): |
| first_line = True |
| got_example = False |
| output = [] |
| for line in out.splitlines(): |
| if first_line: |
| name, sep, rest = line.partition(':') |
| name = name.strip() |
| output.append('<h3><a name="' + cgi.escape(command) + '">' + |
| cgi.escape(name + sep + rest) + '</a></h3>') |
| first_line = False |
| else: |
| if line.startswith('Example'): |
| # Special subsection that's pre-formatted. |
| if got_example: |
| output.append('</pre>') |
| got_example = True |
| output.append('<h4>Example</h4>') |
| output.append('<pre>') |
| elif not line.strip(): |
| output.append('<p>') |
| elif not line.startswith(' ') and line.endswith(':'): |
| # Subsection. |
| output.append('<h4>' + cgi.escape(line[:-1]) + '</h4>') |
| else: |
| output.append(cgi.escape(line)) |
| if got_example: |
| output.append('</pre>') |
| return output |
| |
| |
| def main(): |
| if len(sys.argv) < 2: |
| print('usage: help_as_html.py <gn_binary>') |
| return 1 |
| header = '''<!DOCTYPE html> |
| <html> |
| <head> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <style> |
| body { font-family: Arial, sans-serif; font-size: small; } |
| pre { font-family: Consolas, monospace; font-size: small; } |
| #container { margin: 0 auto; max-width: 48rem; width: 90%; } |
| </style> |
| </head> |
| <body> |
| <div id="container"><h1>GN</h1> |
| ''' |
| footer = '</div></body></html>' |
| commands, output = ParseTopLevel(GetOutput('help')) |
| for command in commands: |
| output += ParseCommand(command, GetOutput('help', command)) |
| print(header + '\n'.join(output) + footer) |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |