106 lines
3.1 KiB
Python
Executable File
106 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# 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())
|