Index: net/tools/net_docs/net_docs.py |
diff --git a/net/tools/net_docs/net_docs.py b/net/tools/net_docs/net_docs.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..a433a201e5ae60b3d606bb76c030753690c5a52a |
--- /dev/null |
+++ b/net/tools/net_docs/net_docs.py |
@@ -0,0 +1,123 @@ |
+#!/usr/bin/env python |
+# Copyright 2015 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. |
+ |
+ |
+"""Reads, parses, and (optionally) writes as HTML the contents of Markdown |
+files passed as arguments. Intended for rendering network stack documentation |
+stored as Markdown in the source tree to a human-readable format.""" |
+ |
+ |
+import argparse |
+import os.path |
+import sys |
+ |
+ |
+def nth_parent_directory(path, n): |
+ for i in range(n): |
+ path = os.path.dirname(path) |
+ return path |
+ |
+ |
+# Go up the directory tree from this script and add src/third_party to sys.path |
+# so "import markdown" can find it in src/third_party/markdown. |
+SCRIPT_PATH = os.path.abspath(__file__) |
+SRC_PATH = nth_parent_directory(SCRIPT_PATH, 4) |
+THIRD_PARTY_PATH = os.path.join(SRC_PATH, 'third_party') |
+sys.path.insert(0, THIRD_PARTY_PATH) |
+import markdown |
+ |
+ |
+def ReadFile(filename): |
+ with open(filename, 'r') as file: |
+ return file.read() |
+ |
+ |
+def WriteFile(filename, contents): |
+ dir = os.path.dirname(filename) |
+ if not os.path.isdir(dir): |
+ os.mkdir(dir) |
+ with open(filename, 'w') as file: |
+ file.write(contents) |
+ |
+ |
+TEMPLATE = """ |
+<html> |
+ <head> |
+ <title>{title}</title> |
+ </head> |
+ <body> |
+ {body} |
+ </body> |
+</html>""" |
+ |
+ |
+def FormatPage(markdown_html, title): |
+ # TODO(ttuttle): Add a navigation list / table of contents of available |
+ # Markdown files, perhaps? |
+ return TEMPLATE.format(title=title, body=markdown_html) |
+ |
+ |
+def ProcessDocs(input_filenames, input_pathname, output_pathname, |
+ extensions=None): |
+ """Processes a list of Markdown documentation files. |
+ |
+ If input_pathname and output_pathname are specified, outputs HTML files |
+ into the corresponding subdirectories of output_pathname. If one or both is |
+ not specified, simply ensures the files exist and contain valid Markdown. |
+ |
+ Args: |
+ input_filenames: A list of filenames (absolute, or relative to $PWD) of |
+ Markdown files to parse and possibly render. |
+ input_pathname: The base directory of the input files. (Needed so they |
+ can be placed in the same relative path in the output path.) |
+ output_pathname: The output directory into which rendered Markdown files |
+ go, using that relative path. |
+ extensions: a list of Markdown.extensions to apply if any. |
+ |
+ Returns: |
+ nothing |
+ |
+ Raises: |
+ IOError: if any of the file operations fail (e.g. input_filenames |
+ contains a non-existent file). |
+ """ |
+ |
+ outputting = (input_pathname is not None) and (output_pathname is not None) |
+ |
+ if extensions: |
+ markdown_parser = markdown.Markdown(extensions) |
+ else: |
+ markdown_parser = markdown.Markdown() |
+ |
+ for input_filename in input_filenames: |
+ markdown_text = ReadFile(input_filename) |
+ markdown_html = markdown_parser.reset().convert(markdown_text) |
+ if not outputting: |
+ continue |
+ |
+ full_html = FormatPage(markdown_html, title=input_filename) |
+ rel_filename = os.path.relpath(input_filename, start=input_pathname) |
+ output_filename = os.path.join(output_pathname, rel_filename) + '.html' |
+ WriteFile(output_filename, full_html) |
+ |
+ |
+def main(): |
+ parser = argparse.ArgumentParser( |
+ description='Parse and render Markdown documentation') |
+ parser.add_argument('--input_path', default=None, |
+ help="Input path for Markdown; required only if output_path set") |
+ parser.add_argument('--output_path', default=None, |
+ help="Output path for rendered HTML; if unspecified, won't output") |
+ parser.add_argument('filenames', nargs=argparse.REMAINDER) |
+ args = parser.parse_args() |
+ |
+ extensions = ['markdown.extensions.def_list'] |
+ ProcessDocs(args.filenames, args.input_path, args.output_path, extensions) |
+ |
+ return 0 |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |