1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
class TextStandoff:
def __init__(self, text, range):
self.entireText = text
self.range = range
def asPrimitives(self):
return (self.entireText, self.range)
@staticmethod
def fromPrimitives(args):
return TextStandoff(*args)
def isNull(self):
return self.range == (0, 0)
@property
def text(self):
start, end = self.range
return self.entireText[start:end]
@property
def length(self):
start, end = self.range
return end - start
@property
def end(self):
start, end = self.range
return end
@property
def start(self):
start, end = self.range
return start
def overlaps(self, standoff):
if self.start < standoff.end and standoff.start < self.end:
return True
else:
return False
def contains(self, standoff):
start, end = standoff
return self.start <= start and self.end >= end
def before(self, standoff):
if self.end <= standoff.start:
return True
else:
return False
def degreeOfOverlap(self, standoff):
"""
Returns the size of the overlapping range of two tags. Returns
zero if they do not overlap.
"""
start, end = standoff
if self.overlaps(standoff):
return min(end, self.end) - max(start, self.start)
else:
return 0
def __iter__(self):
return iter((self.start, self.end))
def toXml(self, standoff):
standoff.setAttribute("start", str(self.start))
standoff.setAttribute("end", str(self.end))
def __repr__(self):
return 'TextStandoff("%s", (%d, %d))' % (self.entireText, self.start, self.end)
def __str__(self):
return '("%s", (%d, %d))' % (self.text, self.start, self.end)
def __eq__(self, obj):
if isinstance(obj, TextStandoff):
if self.range == obj.range and self.entireText == obj.entireText:
return True
return False
def __hash__(self):
return hash(self.entireText) * 17 + hash(self.range)
|