| Index: third_party/document_image_extractor/third_party/closure-library/closure/bin/scopify.py
|
| diff --git a/third_party/document_image_extractor/third_party/closure-library/closure/bin/scopify.py b/third_party/document_image_extractor/third_party/closure-library/closure/bin/scopify.py
|
| deleted file mode 100755
|
| index d8057efbc9fa2aa01c6f0e9941f67ffc46d66f77..0000000000000000000000000000000000000000
|
| --- a/third_party/document_image_extractor/third_party/closure-library/closure/bin/scopify.py
|
| +++ /dev/null
|
| @@ -1,221 +0,0 @@
|
| -#!/usr/bin/python
|
| -#
|
| -# Copyright 2010 The Closure Library Authors. All Rights Reserved.
|
| -#
|
| -# Licensed under the Apache License, Version 2.0 (the "License");
|
| -# you may not use this file except in compliance with the License.
|
| -# You may obtain a copy of the License at
|
| -#
|
| -# http://www.apache.org/licenses/LICENSE-2.0
|
| -#
|
| -# Unless required by applicable law or agreed to in writing, software
|
| -# distributed under the License is distributed on an "AS-IS" BASIS,
|
| -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -# See the License for the specific language governing permissions and
|
| -# limitations under the License.
|
| -
|
| -
|
| -"""Automatically converts codebases over to goog.scope.
|
| -
|
| -Usage:
|
| -cd path/to/my/dir;
|
| -../../../../javascript/closure/bin/scopify.py
|
| -
|
| -Scans every file in this directory, recursively. Looks for existing
|
| -goog.scope calls, and goog.require'd symbols. If it makes sense to
|
| -generate a goog.scope call for the file, then we will do so, and
|
| -try to auto-generate some aliases based on the goog.require'd symbols.
|
| -
|
| -Known Issues:
|
| -
|
| - When a file is goog.scope'd, the file contents will be indented +2.
|
| - This may put some lines over 80 chars. These will need to be fixed manually.
|
| -
|
| - We will only try to create aliases for capitalized names. We do not check
|
| - to see if those names will conflict with any existing locals.
|
| -
|
| - This creates merge conflicts for every line of every outstanding change.
|
| - If you intend to run this on your codebase, make sure your team members
|
| - know. Better yet, send them this script so that they can scopify their
|
| - outstanding changes and "accept theirs".
|
| -
|
| - When an alias is "captured", it can no longer be stubbed out for testing.
|
| - Run your tests.
|
| -
|
| -"""
|
| -
|
| -__author__ = 'nicksantos@google.com (Nick Santos)'
|
| -
|
| -import os.path
|
| -import re
|
| -import sys
|
| -
|
| -REQUIRES_RE = re.compile(r"goog.require\('([^']*)'\)")
|
| -
|
| -# Edit this manually if you want something to "always" be aliased.
|
| -# TODO(nicksantos): Add a flag for this.
|
| -DEFAULT_ALIASES = {}
|
| -
|
| -def Transform(lines):
|
| - """Converts the contents of a file into javascript that uses goog.scope.
|
| -
|
| - Arguments:
|
| - lines: A list of strings, corresponding to each line of the file.
|
| - Returns:
|
| - A new list of strings, or None if the file was not modified.
|
| - """
|
| - requires = []
|
| -
|
| - # Do an initial scan to be sure that this file can be processed.
|
| - for line in lines:
|
| - # Skip this file if it has already been scopified.
|
| - if line.find('goog.scope') != -1:
|
| - return None
|
| -
|
| - # If there are any global vars or functions, then we also have
|
| - # to skip the whole file. We might be able to deal with this
|
| - # more elegantly.
|
| - if line.find('var ') == 0 or line.find('function ') == 0:
|
| - return None
|
| -
|
| - for match in REQUIRES_RE.finditer(line):
|
| - requires.append(match.group(1))
|
| -
|
| - if len(requires) == 0:
|
| - return None
|
| -
|
| - # Backwards-sort the requires, so that when one is a substring of another,
|
| - # we match the longer one first.
|
| - for val in DEFAULT_ALIASES.values():
|
| - if requires.count(val) == 0:
|
| - requires.append(val)
|
| -
|
| - requires.sort()
|
| - requires.reverse()
|
| -
|
| - # Generate a map of requires to their aliases
|
| - aliases_to_globals = DEFAULT_ALIASES.copy()
|
| - for req in requires:
|
| - index = req.rfind('.')
|
| - if index == -1:
|
| - alias = req
|
| - else:
|
| - alias = req[(index + 1):]
|
| -
|
| - # Don't scopify lowercase namespaces, because they may conflict with
|
| - # local variables.
|
| - if alias[0].isupper():
|
| - aliases_to_globals[alias] = req
|
| -
|
| - aliases_to_matchers = {}
|
| - globals_to_aliases = {}
|
| - for alias, symbol in aliases_to_globals.items():
|
| - globals_to_aliases[symbol] = alias
|
| - aliases_to_matchers[alias] = re.compile('\\b%s\\b' % symbol)
|
| -
|
| - # Insert a goog.scope that aliases all required symbols.
|
| - result = []
|
| -
|
| - START = 0
|
| - SEEN_REQUIRES = 1
|
| - IN_SCOPE = 2
|
| -
|
| - mode = START
|
| - aliases_used = set()
|
| - insertion_index = None
|
| - num_blank_lines = 0
|
| - for line in lines:
|
| - if mode == START:
|
| - result.append(line)
|
| -
|
| - if re.search(REQUIRES_RE, line):
|
| - mode = SEEN_REQUIRES
|
| -
|
| - elif mode == SEEN_REQUIRES:
|
| - if (line and
|
| - not re.search(REQUIRES_RE, line) and
|
| - not line.isspace()):
|
| - # There should be two blank lines before goog.scope
|
| - result += ['\n'] * 2
|
| - result.append('goog.scope(function() {\n')
|
| - insertion_index = len(result)
|
| - result += ['\n'] * num_blank_lines
|
| - mode = IN_SCOPE
|
| - elif line.isspace():
|
| - # Keep track of the number of blank lines before each block of code so
|
| - # that we can move them after the goog.scope line if necessary.
|
| - num_blank_lines += 1
|
| - else:
|
| - # Print the blank lines we saw before this code block
|
| - result += ['\n'] * num_blank_lines
|
| - num_blank_lines = 0
|
| - result.append(line)
|
| -
|
| - if mode == IN_SCOPE:
|
| - for symbol in requires:
|
| - if not symbol in globals_to_aliases:
|
| - continue
|
| -
|
| - alias = globals_to_aliases[symbol]
|
| - matcher = aliases_to_matchers[alias]
|
| - for match in matcher.finditer(line):
|
| - # Check to make sure we're not in a string.
|
| - # We do this by being as conservative as possible:
|
| - # if there are any quote or double quote characters
|
| - # before the symbol on this line, then bail out.
|
| - before_symbol = line[:match.start(0)]
|
| - if before_symbol.count('"') > 0 or before_symbol.count("'") > 0:
|
| - continue
|
| -
|
| - line = line.replace(match.group(0), alias)
|
| - aliases_used.add(alias)
|
| -
|
| - if line.isspace():
|
| - # Truncate all-whitespace lines
|
| - result.append('\n')
|
| - else:
|
| - result.append(line)
|
| -
|
| - if len(aliases_used):
|
| - aliases_used = [alias for alias in aliases_used]
|
| - aliases_used.sort()
|
| - aliases_used.reverse()
|
| - for alias in aliases_used:
|
| - symbol = aliases_to_globals[alias]
|
| - result.insert(insertion_index,
|
| - 'var %s = %s;\n' % (alias, symbol))
|
| - result.append('}); // goog.scope\n')
|
| - return result
|
| - else:
|
| - return None
|
| -
|
| -def TransformFileAt(path):
|
| - """Converts a file into javascript that uses goog.scope.
|
| -
|
| - Arguments:
|
| - path: A path to a file.
|
| - """
|
| - f = open(path)
|
| - lines = Transform(f.readlines())
|
| - if lines:
|
| - f = open(path, 'w')
|
| - for l in lines:
|
| - f.write(l)
|
| - f.close()
|
| -
|
| -if __name__ == '__main__':
|
| - args = sys.argv[1:]
|
| - if not len(args):
|
| - args = '.'
|
| -
|
| - for file_name in args:
|
| - if os.path.isdir(file_name):
|
| - for root, dirs, files in os.walk(file_name):
|
| - for name in files:
|
| - if name.endswith('.js') and \
|
| - not os.path.islink(os.path.join(root, name)):
|
| - TransformFileAt(os.path.join(root, name))
|
| - else:
|
| - if file_name.endswith('.js') and \
|
| - not os.path.islink(file_name):
|
| - TransformFileAt(file_name)
|
|
|