Package TEES :: Package Utils :: Module Range
[hide private]

Source Code for Module TEES.Utils.Range

  1  """ 
  2  Character offset tools. 
  3  """ 
  4  __version__ = "$Revision: 1.11 $" 
  5   
  6  import types 
  7   
8 -def merge(range1, range2):
9 mergedRange = [0,0] 10 assert(overlap(range1, range2)) 11 if range1[0] < range2[0]: 12 mergedRange[0] = range1[0] 13 else: 14 mergedRange[0] = range2[0] 15 if range1[1] > range2[1]: 16 mergedRange[1] = range1[1] 17 else: 18 mergedRange[1] = range2[1] 19 return (mergedRange[0],mergedRange[1])
20
21 -def charOffsetToSingleTuple(charOffset):
22 tuples = charOffsetToTuples(charOffset) 23 assert(len(tuples) == 1) 24 return tuples[0]
25
26 -def charOffsetToTuples(charOffset):
27 """ Splits a comma separated list of character offsets into tuples of integers. 28 29 Keyword arguments: 30 charOffset -- a string in the format "0-2,5-20" 31 32 Returns: 33 A list of tuples of two integers each 34 """ 35 tuples = [] 36 ranges = charOffset.split(",") 37 for r in ranges: 38 numbers = r.split("-") 39 tuples.append( (int(numbers[0]),int(numbers[1])) ) 40 return tuples
41
42 -def contains(range1, range2):
43 if range1[0] <= range2[0] and range1[1] >= range2[1]: 44 return True 45 else: 46 return False
47
48 -def length(range):
49 return range[1] - range[0] # + 1
50
51 -def mismatch(range1, range2):
52 l1 = length(range1) 53 l2 = length(range2) 54 if contains(range1, range2): 55 return l1 - l2 56 elif contains(range2, range1): 57 return l2 - l1 58 elif overlap(range1, range2): 59 if range1[1] >= range2[0]: 60 return length( (range1[0], range2[1]) ) 61 else: # range2[0] >= range1[1] 62 return length( (range2[0], range1[1]) ) 63 else: 64 return l1 + l2
65
66 -def overlap(range1, range2):
67 """ Checks whether two ranges (f.e. character offsets overlap) 68 69 This snippet by Steven D'Aprano is from the forum of 70 www.thescripts.com. 71 72 Keyword arguments: 73 range1 -- a tuple where range1[0] <= range1[1] 74 range1 -- a tuple where range2[0] <= range2[1] 75 76 Returns: 77 True (ranges overlap) or False (no overlap) 78 """ 79 assert(range1[0] <= range1[1]), (range1, range2) 80 assert(range2[0] <= range2[1]), (range1, range2) 81 # Fully overlapping cases: 82 # x1 <= y1 <= y2 <= x2 83 # y1 <= x1 <= x2 <= y2 84 # Partially overlapping cases: 85 # x1 <= y1 <= x2 <= y2 86 # y1 <= x1 <= y2 <= x2 87 # Non-overlapping cases: 88 # x1 <= x2 < y1 <= y2 89 # y1 <= y2 < x1 <= x2 90 return not (range1[1] <= range2[0] or range2[1] <= range1[0])
91
92 -def tuplesToCharOffset(tuples):
93 if len(tuples) == 2 and type(tuples[0]) == types.IntType and type(tuples[1]) == types.IntType: 94 tuples = [tuples] 95 charOffset = "" 96 isFirst = True 97 for tuple in tuples: 98 if not isFirst: 99 charOffset += "," 100 charOffset += str(tuple[0]) + "-" + str(tuple[1]) 101 isFirst = False 102 return charOffset
103