Package Bio :: Module MarkupEditor
[hide private]
[frames] | no frames]

Source Code for Module Bio.MarkupEditor

  1  """Simplify adding markup to a piece of text.""" 
  2   
  3  import warnings 
  4  warnings.warn("""\ 
  5  Bio.MarkupEditor is deprecated. 
  6  If you use the code in Bio.MarkupEditor, Please get in touch on 
  7  the Biopython mailing lists to prevent permanent removal of this 
  8  module.""", 
  9                DeprecationWarning) 
 10   
 11   
 12   
 13   
 14  from xml.sax import saxutils 
 15   
 16  # Helper functions to turn start/end tags into text 
17 -def _start_element(tag, attrs):
18 s = "<" + tag 19 for name, value in attrs.items(): 20 s += " %s=%s" % (name, saxutils.quoteattr(value)) 21 return s + ">"
22
23 -def _end_element(tag):
24 return "</%s>" % tag
25 26
27 -class MidPoint:
28 - def __init__(self):
29 self.left = [] 30 self.right = []
31
32 -class MarkupEditor:
33 - def __init__(self, text):
34 self.text = text 35 self._max = len(text) 36 self.midpoints = {}
37
38 - def _get(self, pos):
39 assert 0 <= pos <= self._max, \ 40 "position (%d) out of range; 0 <= x <= %d" % self._max 41 if self.midpoints.has_key(pos): 42 return self.midpoints[pos] 43 x = MidPoint() 44 self.midpoints[pos] = x 45 return x
46
47 - def insert_text(self, pos, text):
48 point = self._get(pos) 49 point.right.insert(0, saxutils.escape(text))
50
51 - def insert_raw_text(self, pos, text):
52 point = self._get(pos) 53 point.right.insert(0, text)
54
55 - def insert_element(self, leftpos, rightpos, tag, attrs = {}):
56 strleft = _start_element(tag, attrs) 57 strright = _end_element(tag) 58 if leftpos == rightpos: 59 point = self._get(leftpos) 60 point.right.insert(0, strleft + strright) 61 else: 62 assert leftpos < rightpos, (leftpos, rightpos) 63 left = self._get(leftpos) 64 right = self._get(rightpos) 65 66 left.right.insert(0, strleft) 67 right.left.append(strright)
68
69 - def insert_singleton(self, pos, tag, attrs = {}):
70 point = self._get(pos) 71 s = _start_element(tag, attrs) 72 point.right.insert(0, s)
73
74 - def to_file(self, outfile):
75 items = self.midpoints.items() 76 items.sort() 77 text = self.text 78 prevpos = 0 79 for pos, midpoint in items: 80 outfile.write(text[prevpos:pos]) 81 for s in midpoint.left: 82 outfile.write(s) 83 for s in midpoint.right: 84 outfile.write(s) 85 prevpos = pos 86 outfile.write(text[prevpos:])
87
88 -def _compare(markup, expect):
89 from cStringIO import StringIO 90 file = StringIO() 91 markup.to_file(file) 92 s = file.getvalue() 93 assert s == expect, (s, expect)
94
95 -def test():
96 markup = MarkupEditor("01234") 97 _compare(markup, "01234") 98 markup.insert_text(0, "A") 99 _compare(markup, "A01234") 100 markup.insert_text(5, "Z") 101 _compare(markup, "A01234Z") 102 markup.insert_text(5, "Y") 103 _compare(markup, "A01234YZ") 104 markup.insert_text(5, "<") 105 _compare(markup, "A01234&lt;YZ") 106 markup.insert_raw_text(1, "BCD") 107 _compare(markup, "A0BCD1234&lt;YZ") 108 markup.insert_raw_text(3, "<P>") 109 _compare(markup, "A0BCD12<P>34&lt;YZ") 110 markup.insert_element(1, 3, "a", {"tag": "value"}) 111 _compare(markup, 'A0<a tag="value">BCD12</a><P>34&lt;YZ') 112 markup.insert_element(1, 1, "Q", {"R": "S"}) 113 _compare(markup, 'A0<Q R="S"></Q><a tag="value">BCD12</a><P>34&lt;YZ') 114 markup.insert_singleton(3, "br") 115 _compare(markup, 'A0<Q R="S"></Q><a tag="value">BCD12</a><br><P>34&lt;YZ')
116 117 if __name__ == "__main__": 118 test() 119