| Index: chrome/common/extensions/docs/build/build.py
|
| diff --git a/chrome/common/extensions/docs/build/build.py b/chrome/common/extensions/docs/build/build.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..c9ea4dd2806a5672f24155d2fc1b11b6a2f77870
|
| --- /dev/null
|
| +++ b/chrome/common/extensions/docs/build/build.py
|
| @@ -0,0 +1,164 @@
|
| +#!/usr/bin/python
|
| +# Copyright (c) 2009 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.
|
| +
|
| +"""Docbuilder for extension docs."""
|
| +
|
| +import os
|
| +import os.path
|
| +import shutil
|
| +import sys
|
| +
|
| +from subprocess import Popen, PIPE
|
| +from optparse import OptionParser
|
| +
|
| +_script_path = os.path.realpath(__file__)
|
| +_build_dir = os.path.dirname(_script_path)
|
| +_base_dir = os.path.normpath(_build_dir + "/..")
|
| +_static_dir = _base_dir + "/static"
|
| +_js_dir = _base_dir + "/js"
|
| +_template_dir = _base_dir + "/template"
|
| +_extension_api_dir = os.path.normpath(_base_dir + "/../api")
|
| +
|
| +_extension_api_json = _extension_api_dir + "/extension_api.json"
|
| +_api_template_html = _template_dir + "/api_template.html"
|
| +_page_shell_html = _template_dir + "/page_shell.html"
|
| +_generator_html = _build_dir + "/generator.html"
|
| +
|
| +_expected_output_preamble = "<!DOCTYPE html>"
|
| +
|
| +# HACK! This is required because we can only depend on python 2.4 and
|
| +# the calling environment may not be setup to set the PYTHONPATH
|
| +sys.path.append(os.path.normpath(_base_dir +
|
| + "/../../../../third_party/simplejson"))
|
| +import simplejson as json
|
| +
|
| +def RenderPage(name, test_shell):
|
| + """
|
| + Calls test_shell --layout-tests .../generator.html?<name> and writes the
|
| + result to .../docs/<name>.html
|
| + """
|
| +
|
| + if not name:
|
| + raise Exception("RenderPage called with empty name");
|
| +
|
| + generator_url = _generator_html + "?" + name
|
| + output_file = _base_dir + "/" + name + ".html"
|
| +
|
| + # Copy page_shell to destination output;
|
| + if (os.path.isfile(output_file)):
|
| + os.remove(output_file)
|
| +
|
| + shutil.copy(_page_shell_html, output_file)
|
| +
|
| + # Run test_shell and capture result
|
| + p = Popen([test_shell, "--layout-tests", generator_url], shell=True,
|
| + stdout=PIPE)
|
| +
|
| + # first output line is url that was processed by test_shell
|
| + p.stdout.readline()
|
| +
|
| + # second output line is the layoutTestShell.dumpText() value.
|
| + result = p.stdout.readline()
|
| + if (not result.startswith(_expected_output_preamble)):
|
| + raise Exception("test_shell returned unexpected output: " + result);
|
| +
|
| + # Rewrite result
|
| + os.remove(output_file)
|
| + open(output_file, 'w').write(result)
|
| +
|
| +def FindTestShell(product_dir):
|
| + search_locations = []
|
| +
|
| + if (sys.platform in ('cygwin', 'win32')):
|
| + search_locations.append(product_dir + "/test_shell.exe")
|
| +
|
| + if (sys.platform in ('linux', 'linux2')):
|
| + search_locations.append(product_dir + "/test_shell")
|
| +
|
| + if (sys.platform == 'darwin'):
|
| + search_locations.append(product_dir +
|
| + "/TestShell.app/Contents/MacOS/TestShell")
|
| +
|
| + for loc in search_locations:
|
| + if os.path.isfile(loc):
|
| + return loc
|
| +
|
| + print ("Failed to find test_shell executable in: \n" +
|
| + "\n".join(search_locations))
|
| +
|
| + raise Exception('Could not find test_shell executable.')
|
| +
|
| +def GetRelativePath(path):
|
| + return os.path.normpath(path)[len(os.getcwd()) + 1:]
|
| +
|
| +def GetAPIModuleNames():
|
| + contents = open(_extension_api_json, 'r').read();
|
| + extension_api = json.loads(contents, encoding="ASCII")
|
| + return set( module['namespace'].encode() for module in extension_api)
|
| +
|
| +def GetStaticFileNames():
|
| + static_files = os.listdir(_static_dir)
|
| + return set(os.path.splitext(file)[0]
|
| + for file in static_files
|
| + if file.endswith(".html"))
|
| +
|
| +def GetInputFiles():
|
| + input_files = [];
|
| +
|
| + input_files.append(GetRelativePath(_api_template_html));
|
| + input_files.append(GetRelativePath(_page_shell_html));
|
| + input_files.append(GetRelativePath(_generator_html));
|
| + input_files.append(GetRelativePath(_script_path));
|
| + input_files.append(GetRelativePath(_extension_api_json));
|
| + # static files
|
| + input_files += [GetRelativePath(_static_dir + "/" + name + ".html")
|
| + for name in GetStaticFileNames()]
|
| + # js files
|
| + input_files += [GetRelativePath(_js_dir + "/" + file)
|
| + for file in os.listdir(_js_dir)]
|
| + return input_files
|
| +
|
| +def GetOutputFiles():
|
| + page_names = GetAPIModuleNames() | GetStaticFileNames()
|
| + return [GetRelativePath(_base_dir + "/" + name + ".html")
|
| + for name in page_names]
|
| +
|
| +def main():
|
| + parser = OptionParser()
|
| + parser.add_option("--list-inputs", action="store_true", dest="list_inputs")
|
| + parser.add_option("--list-outputs", action="store_true", dest="list_outputs")
|
| + parser.add_option("--product-dir", dest="product_dir")
|
| +
|
| + (options, args) = parser.parse_args()
|
| +
|
| + # Return input list to gyp build target
|
| + if (options.list_inputs):
|
| + for f in GetInputFiles():
|
| + print f
|
| + return 0;
|
| + # Return output list to gyp build target
|
| + if (options.list_outputs):
|
| + for f in GetOutputFiles():
|
| + print f
|
| + return 0;
|
| +
|
| + test_shell = FindTestShell(options.product_dir)
|
| +
|
| + # Read static file names
|
| + static_names = GetStaticFileNames()
|
| +
|
| + # Read module names
|
| + module_names = GetAPIModuleNames()
|
| +
|
| + # All pages to generate
|
| + page_names = static_names | module_names
|
| +
|
| + for page in page_names:
|
| + RenderPage(page, test_shell);
|
| +
|
| + return 0;
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(main())
|
|
|