| ''' |
| 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) |