| ''' | |
| Copyright 2011 Google Inc. | |
| Use of this source code is governed by a BSD-style license that can be | |
| found in the LICENSE file. | |
| ''' | |
| import datetime | |
| import re | |
| def CreateParser(filepath): | |
| """Returns a Parser as appropriate for the file at this filepath. | |
| """ | |
| if (filepath.endswith('.cpp') or | |
| filepath.endswith('.h') or | |
| filepath.endswith('.c')): | |
| return CParser() | |
| else: | |
| return None | |
| class Parser(object): | |
| """Base class for all language-specific parsers. | |
| """ | |
| def __init__(self): | |
| self._copyright_pattern = re.compile('copyright', re.IGNORECASE) | |
| self._attribute_pattern = re.compile( | |
| 'copyright.*\D(\d{4})\W*(\w.*[\w.])', re.IGNORECASE) | |
| def FindCopyrightBlock(self, comment_blocks): | |
| """Given a list of comment block strings, return the one that seems | |
| like the most likely copyright block. | |
| Returns None if comment_blocks was empty, or if we couldn't find | |
| a comment block that contains copyright info.""" | |
| if not comment_blocks: | |
| return None | |
| for block in comment_blocks: | |
| if self._copyright_pattern.search(block): | |
| return block | |
| def GetCopyrightBlockAttributes(self, comment_block): | |
| """Given a comment block, return a tuple of attributes: (year, holder). | |
| If comment_block is None, or none of the attributes are found, | |
| this will return (None, None).""" | |
| if not comment_block: | |
| return (None, None) | |
| matches = self._attribute_pattern.findall(comment_block) | |
| if not matches: | |
| return (None, None) | |
| first_match = matches[0] | |
| return (first_match[0], first_match[1]) | |
| class CParser(Parser): | |
| """Parser that knows how to parse C/C++ files. | |
| """ | |
| DEFAULT_YEAR = datetime.date.today().year | |
| DEFAULT_HOLDER = 'Google Inc.' | |
| COPYRIGHT_BLOCK_FORMAT = ''' | |
| /* | |
| * Copyright %s %s | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| ''' | |
| def __init__(self): | |
| super(CParser, self).__init__() | |
| self._comment_pattern = re.compile('/\*.*?\*/', re.DOTALL) | |
| def FindAllCommentBlocks(self, file_contents): | |
| """Returns a list of all comment blocks within these file contents. | |
| """ | |
| return self._comment_pattern.findall(file_contents) | |
| def CreateCopyrightBlock(self, year, holder): | |
| """Returns a copyright block suitable for this language, with the | |
| given attributes. | |
| @param year year in which to hold copyright (defaults to DEFAULT_YEAR) | |
| @param holder holder of copyright (defaults to DEFAULT_HOLDER) | |
| """ | |
| if not year: | |
| year = self.DEFAULT_YEAR | |
| if not holder: | |
| holder = self.DEFAULT_HOLDER | |
| return self.COPYRIGHT_BLOCK_FORMAT % (year, holder) |