12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python 22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# 32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2008 The Closure Linter Authors. All Rights Reserved. 42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# 52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Licensed under the Apache License, Version 2.0 (the "License"); 62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# you may not use this file except in compliance with the License. 72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# You may obtain a copy of the License at 82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# 92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# http://www.apache.org/licenses/LICENSE-2.0 102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# 112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Unless required by applicable law or agreed to in writing, software 122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distributed under the License is distributed on an "AS-IS" BASIS, 132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# See the License for the specific language governing permissions and 152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# limitations under the License. 162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis"""Classes to represent positions within strings.""" 182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis__author__ = ('robbyw@google.com (Robert Walker)', 202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 'ajp@google.com (Andy Perelson)') 212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 232da489cd246702bee5938545b18a6f710ed214bcJamie Gennisclass Position(object): 242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Object representing a segment of a string. 252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Attributes: 272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis start: The index in to the string where the segment starts. 282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis length: The length of the string segment. 292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def __init__(self, start, length): 322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Initialize the position object. 332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis start: The start index. 362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis length: The number of characters to include. 372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis self.start = start 392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis self.length = length 402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def Get(self, string): 422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Returns this range of the given string. 432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis string: The string to slice. 462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis The string within the range specified by this object. 492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return string[self.start:self.start + self.length] 512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def Set(self, target, source): 532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Sets this range within the target string to the source string. 542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis target: The target string. 572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis source: The source string. 582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis The resulting string 612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return target[:self.start] + source + target[self.start + self.length:] 632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def AtEnd(string): 652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Create a Position representing the end of the given string. 662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis string: The string to represent the end of. 692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis The created Position object. 722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return Position(len(string), 0) 742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis AtEnd = staticmethod(AtEnd) 752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def IsAtEnd(self, string): 772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Returns whether this position is at the end of the given string. 782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis string: The string to test for the end of. 812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Whether this position is at the end of the given string. 842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return self.start == len(string) and self.length == 0 862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def AtBeginning(): 882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Create a Position representing the beginning of any string. 892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis The created Position object. 922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return Position(0, 0) 942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis AtBeginning = staticmethod(AtBeginning) 952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def IsAtBeginning(self): 972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Returns whether this position is at the beginning of any string. 982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Whether this position is at the beginning of any string. 1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return self.start == 0 and self.length == 0 1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def All(string): 1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Create a Position representing the entire string. 1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis string: The string to represent the entirety of. 1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 1112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis The created Position object. 1122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 1132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return Position(0, len(string)) 1142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis All = staticmethod(All) 1152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis def Index(index): 1172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """Returns a Position object for the specified index. 1182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Args: 1202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis index: The index to select, inclusively. 1212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis 1222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Returns: 1232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis The created Position object. 1242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis """ 1252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis return Position(index, 1) 1262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis Index = staticmethod(Index) 127