Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1658)

Unified Diff: native_client_sdk/src/doc/doxygen/rst_index.py

Issue 136033007: [NaCl SDK Docs] Simplify PPAPI documentation generation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: native_client_sdk/src/doc/doxygen/rst_index.py
diff --git a/native_client_sdk/src/doc/doxygen/rst_index.py b/native_client_sdk/src/doc/doxygen/rst_index.py
new file mode 100755
index 0000000000000000000000000000000000000000..2b303c2c74bb38d74d0fd8f6819c9ad63a2f6bf8
--- /dev/null
+++ b/native_client_sdk/src/doc/doxygen/rst_index.py
@@ -0,0 +1,243 @@
+#!/usr/bin/env python
+# Copyright (c) 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.
+
+import cStringIO
+import fnmatch
+import optparse
+import os
+import sys
+
+VALID_CHANNELS = ('stable', 'beta', 'dev')
+
+ROOT_FILE_CONTENTS = """.. _pepper_%(channel)s_index:
+
+:orphan:
+
+.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
+
+########################################
+Pepper API Reference (%(channel_title)s)
+########################################
+
+:ref:`Pepper C API Reference <pepper_%(channel)s_c_index>`
+===========================================================
+
+:ref:`Pepper C++ API Reference <pepper_%(channel)s_cpp_index>`
+===============================================================
+
+"""
+
+C_FILE_CONTENTS = """.. _pepper_%(channel)s_c_index:
+
+.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
+
+##########################################
+Pepper C API Reference (%(channel_title)s)
+##########################################
+
+`Interfaces <group___interfaces.html>`_
+=======================================
+%(interfaces)s
+
+`Structures <group___structs.html>`_
+====================================
+%(structures)s
+
+`Functions <group___functions.html>`_
+=====================================
+
+`Enums <group___enums.html>`_
+=============================
+
+`Typedefs <group___typedefs.html>`_
+===================================
+
+`Macros <globals_defs.html>`_
+=============================
+
+Files
+=====
+%(files)s
+"""
+
+C_INTERFACE_WILDCARDS = ['struct_p_p_p__*', 'struct_p_p_b__*']
+
+C_STRUCT_WILDCARDS = ['struct_p_p__*', 'union_p_p__*']
+
+CPP_FILE_CONTENTS = """.. _pepper_%(channel)s_cpp_index:
+
+.. DO NOT EDIT! This document is auto-generated by doxygen/rst_index.py.
+
+############################################
+Pepper C++ API Reference (%(channel_title)s)
+############################################
+
+`Classes <inherits.html>`_
+==========================
+%(classes)s
+
+Files
+=====
+%(files)s
+"""
+
+CPP_CLASSES_WILDCARDS = ['classpp_1_1*.html']
+CPP_CLASSES_EXCLUDES = ['*-members*']
+
+FILE_WILDCARDS = ['*_8h.html']
+
+
+def GetName(filename):
+ filename = os.path.splitext(filename)[0]
+ out = ''
+ if filename.startswith('struct_p_p_b__'):
+ mangle = filename[7:] # skip "struct_"
+ elif filename.startswith('struct_p_p_p__'):
+ mangle = filename[7:] # skip "struct_"
+ elif filename.startswith('struct_p_p__'):
+ mangle = filename[7:] # skip "struct_"
+ elif filename.startswith('union_p_p__'):
+ mangle = filename[6:] # skip "union_"
+ elif filename.startswith('classpp_1_1_'):
+ mangle = filename[12:]
+ elif filename.startswith('classpp_1_1ext_1_1_'):
+ out = 'Ext::' # maybe 'ext::' ?
+ mangle = filename[19:]
+ elif filename.startswith('classpp_1_1internal_1_1_'):
+ out = 'Internal::' # maybe 'internal::'
+ mangle = filename[24:]
+ elif filename.startswith('structpp_1_1internal_1_1_'):
+ out = 'Internal::'
+ mangle = filename[25:]
+ elif filename.endswith('_8h'):
+ return filename[:-3].replace('__', '_') + '.h'
+ else:
+ print 'No match: ' + filename
+ cap = True
+ for c in mangle:
+ if c == '_':
+ if cap:
+ # If cap is True, we've already read one underscore. The second means
+ # that we should insert a literal underscore.
+ cap = False
+ else:
+ cap = True
+ continue
+ if cap:
+ c = c.upper()
+ cap = False
+ out += c
+ return out
+
+
+def GetPath(filepath):
+ if os.path.exists(filepath):
+ return filepath
+ raise OSError('Couldnt find: ' + filepath)
+
+
+def MakeReSTListFromFiles(path, matches, excludes=None):
+ dir_files = os.listdir(path)
+ good_files = []
+ for match in matches:
+ good_files.extend(fnmatch.filter(dir_files, match))
+
+ if excludes:
+ for exclude in excludes:
+ good_files = [filename for filename in good_files
+ if not fnmatch.fnmatch(filename, exclude)]
+
+ good_files.sort()
+ return '\n'.join(' * `%s <%s>`_\n' % (GetName(f), f) for f in good_files)
+
+
+def MakeTitleCase(s):
+ return s[0].upper() + s[1:]
+
+
+def GenerateRootIndex(channel, out_filename):
+ channel_title = MakeTitleCase(channel)
+
+ # Use StringIO so we don't write out a partial file on error.
+ output = cStringIO.StringIO()
+ output.write(ROOT_FILE_CONTENTS % vars())
+
+ with open(out_filename, 'w') as f:
+ f.write(output.getvalue())
+
+
+def GenerateCIndex(root_dir, channel, out_filename):
+ interfaces = MakeReSTListFromFiles(root_dir, C_INTERFACE_WILDCARDS)
+ structures = MakeReSTListFromFiles(root_dir, C_STRUCT_WILDCARDS)
+ files = MakeReSTListFromFiles(root_dir, FILE_WILDCARDS)
+ channel_title = MakeTitleCase(channel)
+
+ # Use StringIO so we don't write out a partial file on error.
+ output = cStringIO.StringIO()
+ output.write(C_FILE_CONTENTS % vars())
+
+ with open(out_filename, 'w') as f:
+ f.write(output.getvalue())
+
+
+def GenerateCppIndex(root_dir, channel, out_filename):
+ classes = MakeReSTListFromFiles(root_dir, CPP_CLASSES_WILDCARDS,
+ CPP_CLASSES_EXCLUDES)
+ files = MakeReSTListFromFiles(root_dir, FILE_WILDCARDS)
+ channel_title = MakeTitleCase(channel)
+
+ # Use StringIO so we don't write out a partial file on error.
+ output = cStringIO.StringIO()
+ output.write(CPP_FILE_CONTENTS % vars())
+
+ with open(out_filename, 'w') as f:
+ f.write(output.getvalue())
+
+
+def main(argv):
+ usage = 'Usage: %prog [options] <--root|--c|--cpp> directory'
+ parser = optparse.OptionParser(usage=usage)
+ parser.add_option('--channel', help='pepper channel (stable, beta, dev)')
+ parser.add_option('--root', help='Generate root API index',
+ action='store_true', default=False)
+ parser.add_option('--c', help='Generate C API index', action='store_true',
+ default=False)
+ parser.add_option('--cpp', help='Generate C++ API index', action='store_true',
+ default=False)
+ parser.add_option('-o', '--output', help='output file.')
+ options, files = parser.parse_args(argv)
+
+ if len(files) != 1:
+ parser.error('Expected one directory')
+
+ if not options.output:
+ parser.error('Need output file')
+
+ if options.channel not in VALID_CHANNELS:
+ parser.error('Expected channel to be one of %s' % ', '.join(VALID_CHANNELS))
+
+ if sum((options.c, options.cpp, options.root)) != 1:
+ parser.error('Exactly one of --c/--cpp/--root flags is required.')
+
+ root_dir = files[0]
+
+ if options.c:
+ GenerateCIndex(root_dir, options.channel, options.output)
+ elif options.cpp:
+ GenerateCppIndex(root_dir, options.channel, options.output)
+ elif options.root:
+ GenerateRootIndex(options.channel, options.output)
+ else:
+ assert(False)
+ return 0
+
+
+if __name__ == '__main__':
+ try:
+ rtn = main(sys.argv[1:])
+ except KeyboardInterrupt:
+ sys.stderr.write('%s: interrupted\n' % os.path.basename(__file__))
+ rtn = 1
+ sys.exit(rtn)

Powered by Google App Engine
This is Rietveld 408576698