1
2
3
4
5
6 """Code for more fancy file handles.
7
8
9 Classes:
10 UndoHandle File object decorator with support for undo-like operations.
11 StringHandle Wraps a file object around a string.
12 SGMLHandle File object that automatically strips SGML tags from data.
13
14 SGMLStripper Object that strips SGML.
15
16 """
17 import os
18 import StringIO
19 import sgmllib
20
22 """A Python handle that adds functionality for saving lines.
23
24 Saves lines in a LIFO fashion.
25
26 Added methods:
27 saveline Save a line to be returned next time.
28 peekline Peek at the next line without consuming it.
29
30 """
32 self._handle = handle
33 self._saved = []
34
37
43
45 lines = self._saved + self._handle.readlines(*args,**keywds)
46 self._saved = []
47 return lines
48
50 if self._saved:
51 line = self._saved.pop(0)
52 else:
53 line = self._handle.readline(*args,**keywds)
54 return line
55
56 - def read(self, size=-1):
57 if size == -1:
58 saved = "".join(self._saved)
59 self._saved[:] = []
60 else:
61 saved = ''
62 while size > 0 and self._saved:
63 if len(self._saved[0]) <= size:
64 size = size - len(self._saved[0])
65 saved = saved + self._saved.pop(0)
66 else:
67 saved = saved + self._saved[0][:size]
68 self._saved[0] = self._saved[0][size:]
69 size = 0
70 return saved + self._handle.read(size)
71
73 if line:
74 self._saved = [line] + self._saved
75
77 if self._saved:
78 line = self._saved[0]
79 else:
80 line = self._handle.readline()
81 self.saveline(line)
82 return line
83
88
89 - def seek(self, *args):
90 self._saved = []
91 self._handle.seek(*args)
92
94 return getattr(self._handle, attr)
95
96
97
98
99 StringHandle = StringIO.StringIO
100
101
102
104 """A Python handle that automatically strips SGML tags from data.
105
106 """
108 """SGMLStripper(handle)
109
110 handle is a file handle to SGML-formatted data.
111
112 """
113 self._handle = handle
114 self._stripper = SGMLStripper()
115
116 - def read(self, *args, **keywds):
119
121 line = self._handle.readline(*args, **keywds)
122 return self._stripper.strip(line)
123
125 lines = self._handle.readlines(*args, **keywds)
126 for i in range(len(lines)):
127 lines[i] = self._stripper.strip(str)
128 return lines
129
131 return getattr(self._handle, attr)
132
133
141
144
146 """S.strip(str) -> string
147
148 Strip the SGML tags from str.
149
150 """
151 if not str:
152 return ''
153
154
155
156
157
158 is_newline = str[-1] in ['\n', '\r']
159
160 self._parser.data = ''
161 self._parser.feed(str)
162 if self._parser.data:
163 str = self._parser.data
164 elif is_newline:
165 str = '\n'
166 else:
167 str = ''
168 return str
169