Welcome, guest | Sign In | My Account | Store | Cart
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)

History