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@google.com (Robert Walker)',
20              'ajp@google.com (Andy Perelson)')
21
22
23class 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