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