Index: third_party/liblouis/liblouis_list_tables.py |
diff --git a/third_party/liblouis/liblouis_list_tables.py b/third_party/liblouis/liblouis_list_tables.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..79b0c10d5a8ec685bf52f2d1dc637d041142685a |
--- /dev/null |
+++ b/third_party/liblouis/liblouis_list_tables.py |
@@ -0,0 +1,88 @@ |
+#!/usr/bin/env python |
+# Copyright 2013 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 os |
+import re |
+import sys |
+ |
+import json |
+import optparse |
+ |
+# Matches the include statement in the braille table files. |
+INCLUDE_RE = re.compile(r"^\s*include\s+([^#\s]+)") |
+ |
+ |
+def Error(msg): |
+ print >> sys.stderr, 'liblouis_list_tables: %s' % msg |
+ sys.exit(1) |
+ |
+ |
+def ToNativePath(pathname): |
+ return os.path.sep.join(pathname.split('/')) |
+ |
+ |
+def LoadTablesFile(filename): |
+ with open(ToNativePath(filename), 'r') as fh: |
+ return json.load(fh) |
+ |
+ |
+def FindFile(filename, directories): |
+ for d in directories: |
+ fullname = '/'.join([d, filename]) |
+ if os.path.isfile(ToNativePath(fullname)): |
+ return fullname |
+ Error('File not found: %s' % filename) |
+ |
+ |
+def GetIncludeFiles(filename): |
+ result = [] |
+ with open(ToNativePath(filename), 'r') as fh: |
+ for line in fh.xreadlines(): |
+ match = INCLUDE_RE.match(line) |
+ if match: |
+ result.append(match.group(1)) |
+ return result |
+ |
+ |
+def ProcessFile(output_set, filename, directories): |
+ fullname = FindFile(filename, directories) |
+ if fullname in output_set: |
+ return |
+ output_set.add(fullname) |
+ for include_file in GetIncludeFiles(fullname): |
+ ProcessFile(output_set, include_file, directories) |
+ |
+ |
+def DoMain(argv): |
+ "Entry point for gyp's pymod_do_main command." |
+ parser = optparse.OptionParser() |
+ # Give a clearer error message when this is used as a module. |
+ parser.prog = 'liblouis_list_tables' |
+ parser.set_usage('usage: %prog [options] listfile') |
+ parser.add_option('-D', '--directory', dest='directories', |
+ action='append', help='Where to search for table files') |
+ (options, args) = parser.parse_args(argv) |
+ |
+ if len(args) != 1: |
+ parser.error('Expecting exactly one argument') |
+ if not options.directories: |
+ parser.error('At least one --directory option must be specified') |
+ |
+ tables = LoadTablesFile(args[0]) |
+ output_set = set() |
+ for table in tables: |
+ ProcessFile(output_set, table['fileName'], options.directories) |
+ return '\n'.join(output_set) |
+ |
+ |
+def main(argv): |
+ print DoMain(argv[1:]) |
+ |
+ |
+if __name__ == '__main__': |
+ try: |
+ sys.exit(main(sys.argv)) |
+ except KeyboardInterrupt: |
+ Error('interrupted') |