Index: chrome/third_party/chromevox/third_party/closure-library/closure/bin/build/source.py |
diff --git a/chrome/third_party/chromevox/third_party/closure-library/closure/bin/build/source.py b/chrome/third_party/chromevox/third_party/closure-library/closure/bin/build/source.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..64e748587d452a217aa2f9cdcfd6c30fb9df57ce |
--- /dev/null |
+++ b/chrome/third_party/chromevox/third_party/closure-library/closure/bin/build/source.py |
@@ -0,0 +1,118 @@ |
+# Copyright 2009 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. |
+ |
+ |
+"""Scans a source JS file for its provided and required namespaces. |
+ |
+Simple class to scan a JavaScript file and express its dependencies. |
+""" |
+ |
+__author__ = 'nnaze@google.com' |
+ |
+ |
+import re |
+ |
+_BASE_REGEX_STRING = '^\s*goog\.%s\(\s*[\'"](.+)[\'"]\s*\)' |
+_PROVIDE_REGEX = re.compile(_BASE_REGEX_STRING % 'provide') |
+_REQUIRES_REGEX = re.compile(_BASE_REGEX_STRING % 'require') |
+ |
+ |
+class Source(object): |
+ """Scans a JavaScript source for its provided and required namespaces.""" |
+ |
+ # Matches a "/* ... */" comment. |
+ # Note: We can't definitively distinguish a "/*" in a string literal without a |
+ # state machine tokenizer. We'll assume that a line starting with whitespace |
+ # and "/*" is a comment. |
+ _COMMENT_REGEX = re.compile( |
+ r""" |
+ ^\s* # Start of a new line and whitespace |
+ /\* # Opening "/*" |
+ .*? # Non greedy match of any characters (including newlines) |
+ \*/ # Closing "*/""", |
+ re.MULTILINE | re.DOTALL | re.VERBOSE) |
+ |
+ def __init__(self, source): |
+ """Initialize a source. |
+ |
+ Args: |
+ source: str, The JavaScript source. |
+ """ |
+ |
+ self.provides = set() |
+ self.requires = set() |
+ |
+ self._source = source |
+ self._ScanSource() |
+ |
+ def GetSource(self): |
+ """Get the source as a string.""" |
+ return self._source |
+ |
+ @classmethod |
+ def _StripComments(cls, source): |
+ return cls._COMMENT_REGEX.sub('', source) |
+ |
+ @classmethod |
+ def _HasProvideGoogFlag(cls, source): |
+ """Determines whether the @provideGoog flag is in a comment.""" |
+ for comment_content in cls._COMMENT_REGEX.findall(source): |
+ if '@provideGoog' in comment_content: |
+ return True |
+ |
+ return False |
+ |
+ def _ScanSource(self): |
+ """Fill in provides and requires by scanning the source.""" |
+ |
+ stripped_source = self._StripComments(self.GetSource()) |
+ |
+ source_lines = stripped_source.splitlines() |
+ for line in source_lines: |
+ match = _PROVIDE_REGEX.match(line) |
+ if match: |
+ self.provides.add(match.group(1)) |
+ match = _REQUIRES_REGEX.match(line) |
+ if match: |
+ self.requires.add(match.group(1)) |
+ |
+ # Closure's base file implicitly provides 'goog'. |
+ # This is indicated with the @provideGoog flag. |
+ if self._HasProvideGoogFlag(self.GetSource()): |
+ |
+ if len(self.provides) or len(self.requires): |
+ raise Exception( |
+ 'Base file should not provide or require namespaces.') |
+ |
+ self.provides.add('goog') |
+ |
+ |
+def GetFileContents(path): |
+ """Get a file's contents as a string. |
+ |
+ Args: |
+ path: str, Path to file. |
+ |
+ Returns: |
+ str, Contents of file. |
+ |
+ Raises: |
+ IOError: An error occurred opening or reading the file. |
+ |
+ """ |
+ fileobj = open(path) |
+ try: |
+ return fileobj.read() |
+ finally: |
+ fileobj.close() |