93 lines
2.8 KiB
Python
93 lines
2.8 KiB
Python
|
'''
|
||
|
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)
|