def hash_style(style):
return tuple(sorted(style.items()))
style_pool = {}
defaultstyle = {}
def create_style(**kwds):
style = defaultstyle.copy()
style.update(kwds)
key = hash_style(style)
try:
return style_pool[key]
except KeyError:
style_pool[key] = style
return style
defaultstyle = create_style(textcolor='black', fontsize=10)
def updated_style(style, properties):
new = style.copy()
new.update(properties)
return create_style(**new)
class Characters:
style = None
def __init__(self, text, style=defaultstyle):
self.data = text
self.style = style
def __len__(self):
return len(self.data)
def get_style(self, i):
return self.style
def __repr__(self):
return "C(%s)" % repr(self.data)
def __len(self):
return len(self.data)
def split(self, i):
if i<0 or i>len(self):
raise IndexError(i)
l = Characters(self.data[:i], self.style)
r = Characters(self.data[i:], self.style)
return l, r
def set_properties(self, i1, i2, properties):
i1 = max(0, i1)
i2 = min(len(self), i2)
tmp, r = self.split(i2)
l, tmp = tmp.split(i1)
style = updated_style(self.style, properties)
c = Characters(tmp.data, style)
return Group([l, c, r])
def insert(self, i, texel):
if isinstance(texel, Characters) and texel.style is self.style:
text = self.data[:i]+texel.data+self.data[i:]
return Characters(text, self.style)
a, b = self.split(i)
return Group([a, texel, b])
class Group:
def __init__(self, content):
self.data = list(content)
length = 0
for texel in content:
length += len(texel)
self._length = length
def __len__(self):
return self._length
def __repr__(self):
return "G(%s)" % repr(self.data)
def get_style(self, i):
for texel in self.data:
n = len(texel)
if n>i:
return texel.get_style(i)
i -= n
def set_properties(self, i1, i2, properties):
r = []
i = 0
for texel in self.data:
n = len(texel)
if i1<n and i2>0:
r.append(texel.set_properties(i1, i2, properties))
else:
r.append(texel)
i1 -= n
i2 -= n
return Group(r)
def split(self, i):
if i<0 or i>len(self):
raise IndexError(i)
l = []
r = []
for texel in self.data:
n = len(texel)
if i<=0:
r.append(texel)
elif i>=n:
l.append(texel)
elif n>i:
a, b = texel.split(i)
l.append(a)
r.append(b)
i -= n
return Group(l), Group(r)
def insert(self, i, texel):
if i == len(self):
return Group(self.data+[texel])
data = []
for elem in self.data:
n = len(elem)
if i<0:
data.append(elem)
elif i>=n:
data.append(elem)
else:
data.append(elem.insert(i, texel))
i -= n
return Group(data)
C = Characters
G = Group
Diff to Previous Revision
--- revision 2 2011-12-08 21:19:14
+++ revision 3 2015-01-13 22:56:53
@@ -4,7 +4,6 @@
style_pool = {}
defaultstyle = {}
def create_style(**kwds):
- global style_pool
style = defaultstyle.copy()
style.update(kwds)
key = hash_style(style)