4 def yychunk_line(root, fin):
7 element.set_text(root, -1, element.get_text(root, -1) + line)
11 def yychunk_block(root, fin, count):
12 block = fin.read(count)
14 element.set_text(root, -1, element.get_text(root, -1) + line)
16 block = fin.read(count)
18 def replace_with_element(root, pos0, off0, pos1, off1, child):
20 pos0, off0 = element.to_start_relative(root, pos0, off0)
22 pos1, off1 = element.to_start_relative(root, pos1, off1)
26 temp = element.get_text(root, pos1)
27 root[pos0:pos1] = [child]
28 element.set_text(root, pos0 + 1, temp[off1:])
30 temp = element.get_text(root, pos0)
31 element.set_text(root, pos0, temp[:off0])
33 def replace_with_text(root, mark, i, j, text):
34 (pos0, off0) = mark[i]
35 (pos1, off1) = mark[j]
39 temp = element.get_tail(root, pos1)
40 del root[pos0 + 1:pos1 + 1]
44 element.get_tail(root, pos0)[:off0] + text + temp[off1:]
48 mark[i + 1:j + 1] = [mark[j]]
51 delta_off = off0 + len(text) - off1
53 (pos2, off2) = mark[k]
56 mark[k] = (pos2 + delta_pos, off2 + delta_off)
60 (pos2, off2) = mark[k]
61 mark[k] = (pos2 + delta_pos, off2)
64 def replace_with_content(root, mark, i, j, child):
65 text = element.get_tail(child, -1)
67 replace_with_text(root, mark, i, j, text)
69 (pos0, off0) = mark[i]
70 (pos1, off1) = mark[j]
74 temp = element.get_tail(root, pos1)
75 root[pos0 + 1:pos1 + 1] = child[:]
76 tail = element.get_tail(root, pos0 + len(child))
77 element.set_tail(root, pos0 + len(child), tail + temp[off1:])
79 temp = element.get_tail(root, pos0)
80 element.set_tail(root, pos0, temp[:off0] + text)
83 mark[i + 1:j + 1] = [mark[j]]
85 delta_pos = len(child) - count
86 delta_off = len(tail) - off1
88 (pos2, off2) = mark[k]
91 mark[k] = (pos2 + delta_pos, off2 + delta_off)
95 (pos2, off2) = mark[k]
96 mark[k] = (pos2 + delta_pos, off2)
99 def extract_element(root, mark, i, j, factory, *args, **kwargs):
100 (pos0, off0) = mark[i]
101 (pos1, off1) = mark[j]
105 result = factory(*args, **kwargs)
106 result[:] = [i.copy() for i in root[pos0 + 1:pos1 + 1]]
107 tail = element.get_tail(root, pos1)
109 element.set_tail(result, -1, tail[off0:off1])
111 element.set_tail(result, count - 1, tail[:off1])
112 tail = element.get_tail(root, pos0)
113 element.set_tail(result, -1, tail[off0:])
116 def extract_text(root, mark, i, j):
117 (pos0, off0) = mark[i]
118 (pos1, off1) = mark[j]
119 #result = [element.get_tail(root, i) for i in range(pos0, pos1 + 1)]
120 #result[-1] = result[-1][:off1]
121 #result[0] = result[0][off0:]
122 #return ''.join(result)
124 return element.get_tail(root, pos0)[off0:off1]
126 def apply_markup(root, pos0, off0, pos1, off1, factory, *args, **kwargs):
128 pos0, off0 = element.to_start_relative(root, pos0, off0)
130 pos1, off1 = element.to_start_relative(root, pos1, off1)
134 child = factory(*args, **kwargs)
135 child[:] = root[pos0:pos1]
137 tail = element.get_text(root, pos1)
138 # at present, if count > 0, child[-1] is shared with root[pos1 - 1],
139 # so we cannot change child[-1].tail until after the replacement
141 replace_with_element(root, pos0, off0, pos1, off1, child)
142 element.set_text(child, 0, tail[off0:off1])
144 temp = element.get_text(root, pos0)
145 replace_with_element(root, pos0, off0, pos1, off1, child)
146 element.set_text(child, count, tail[:off1])
147 element.set_text(child, 0, temp[off0:])
150 def dump(root, mark):
155 assert i >= len(mark) or mark[i][0] >= pos
156 tail = element.get_tail(root, pos)
158 while off < len(tail) or (i < len(mark) and mark[i][0] == pos):
159 end = len(tail) if i >= len(mark) or mark[i][0] != pos else mark[i][1]
161 result += tail[off:end].replace('\n', '(lf)').replace('\t', '(tab)')
163 if i < len(mark) and mark[i][0] == pos:
164 result += '({0:d})'.format(i)
169 result += '({0:s}{1:d})'.format(root[pos].tag, pos)
170 assert i >= len(mark)
172 sys.stdout.write('{0:s}\n'.format(result[-159:])) #79:]))