| #!/usr/bin/env python |
| # |
| # This script is designed to be invoked by soy2html.sh. |
| # Usage: |
| # |
| # buck/docs$ python soy2html.py <output_dir> |
| # |
| # This will write all of the static content to the specified output directory. |
| # You may want to verify that things worked correctly by running: |
| # |
| # python -m SimpleHTTPServer <output_dir> |
| # |
| # and then navigating to http://localhost:8000/. |
| # |
| # When this script is run, soyweb should already be running locally on port |
| # 9811. |
| |
| import os |
| import sys |
| import urllib2 |
| |
| |
| def main(output_dir): |
| # Create opener. |
| opener = urllib2.OpenerDirector() |
| opener.add_handler(urllib2.ProxyHandler()) |
| opener.add_handler(urllib2.UnknownHandler()) |
| opener.add_handler(urllib2.HTTPHandler()) |
| opener.add_handler(urllib2.HTTPDefaultErrorHandler()) |
| opener.add_handler(urllib2.HTTPSHandler()) |
| opener.add_handler(urllib2.HTTPErrorProcessor()) |
| |
| # Iterate over the files in the docs directory and copy them, as appropriate. |
| for root, dirs, files in os.walk('.'): |
| for file_name in files: |
| if file_name.endswith('.soy') and not file_name.startswith('__'): |
| # Strip the './' prefix, if appropriate. |
| if root.startswith('./'): |
| root = root[2:] |
| |
| # Construct the URL where the .soy file is being served. |
| soy_file = file_name |
| html_file = root + '/' + soy_file[:-len('.soy')] + '.html' |
| url = 'http://localhost:9811/' + html_file |
| |
| # Fetch url and copy its contents to output_dir. |
| req = urllib2.Request(url) |
| res = opener.open(req) |
| html = res.read() |
| copy_to_output_dir(html_file, output_dir, html) |
| elif (file_name.endswith('.css') or |
| file_name.endswith('.js') or |
| file_name.endswith('.png')): |
| # Copy the static resource to output_dir. |
| relative_path = os.path.join(root, file_name) |
| with open(relative_path) as resource_file: |
| resource = resource_file.read() |
| copy_to_output_dir(relative_path, output_dir, resource) |
| |
| |
| def copy_to_output_dir(path, output_dir, content): |
| # Make sure that the directory for the destination path exists. |
| last_slash = path.rfind('/') |
| if last_slash != -1: |
| output_subdir = os.path.join(output_dir, path[:last_slash]) |
| if not os.path.exists(output_subdir): |
| os.makedirs(output_subdir) |
| |
| # Copy the file. |
| output_file = os.path.join(output_dir, path) |
| with open(output_file, 'w') as f: |
| f.write(content) |
| |
| |
| if __name__ == '__main__': |
| output_dir = sys.argv[1] |
| main(output_dir) |