Home | History | Annotate | Download | only in common
      1 #!/usr/bin/env python
      2 #
      3 # Copyright 2008 The Closure Linter Authors. All Rights Reserved.
      4 #
      5 # Licensed under the Apache License, Version 2.0 (the "License");
      6 # you may not use this file except in compliance with the License.
      7 # You may obtain a copy of the License at
      8 #
      9 #      http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 # Unless required by applicable law or agreed to in writing, software
     12 # distributed under the License is distributed on an "AS-IS" BASIS,
     13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 # See the License for the specific language governing permissions and
     15 # limitations under the License.
     16 
     17 """Classes to represent positions within strings."""
     18 
     19 __author__ = ('robbyw (at] google.com (Robert Walker)',
     20               'ajp (at] google.com (Andy Perelson)')
     21 
     22 
     23 class Position(object):
     24   """Object representing a segment of a string.
     25 
     26   Attributes:
     27     start: The index in to the string where the segment starts.
     28     length: The length of the string segment.
     29   """
     30 
     31   def __init__(self, start, length):
     32     """Initialize the position object.
     33 
     34     Args:
     35       start: The start index.
     36       length: The number of characters to include.
     37     """
     38     self.start = start
     39     self.length = length
     40 
     41   def Get(self, string):
     42     """Returns this range of the given string.
     43 
     44     Args:
     45       string: The string to slice.
     46 
     47     Returns:
     48       The string within the range specified by this object.
     49     """
     50     return string[self.start:self.start + self.length]
     51 
     52   def Set(self, target, source):
     53     """Sets this range within the target string to the source string.
     54 
     55     Args:
     56       target: The target string.
     57       source: The source string.
     58 
     59     Returns:
     60       The resulting string
     61     """
     62     return target[:self.start] + source + target[self.start + self.length:]
     63 
     64   def AtEnd(string):
     65     """Create a Position representing the end of the given string.
     66 
     67     Args:
     68       string: The string to represent the end of.
     69 
     70     Returns:
     71       The created Position object.
     72     """
     73     return Position(len(string), 0)
     74   AtEnd = staticmethod(AtEnd)
     75 
     76   def IsAtEnd(self, string):
     77     """Returns whether this position is at the end of the given string.
     78 
     79     Args:
     80       string: The string to test for the end of.
     81 
     82     Returns:
     83       Whether this position is at the end of the given string.
     84     """
     85     return self.start == len(string) and self.length == 0
     86 
     87   def AtBeginning():
     88     """Create a Position representing the beginning of any string.
     89 
     90     Returns:
     91       The created Position object.
     92     """
     93     return Position(0, 0)
     94   AtBeginning = staticmethod(AtBeginning)
     95 
     96   def IsAtBeginning(self):
     97     """Returns whether this position is at the beginning of any string.
     98 
     99     Returns:
    100       Whether this position is at the beginning of any string.
    101     """
    102     return self.start == 0 and self.length == 0
    103 
    104   def All(string):
    105     """Create a Position representing the entire string.
    106 
    107     Args:
    108       string: The string to represent the entirety of.
    109 
    110     Returns:
    111       The created Position object.
    112     """
    113     return Position(0, len(string))
    114   All = staticmethod(All)
    115 
    116   def Index(index):
    117     """Returns a Position object for the specified index.
    118 
    119     Args:
    120       index: The index to select, inclusively.
    121 
    122     Returns:
    123       The created Position object.
    124     """
    125     return Position(index, 1)
    126   Index = staticmethod(Index)
    127