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 string
19 import StringIO
20 import sgmllib
21
23 """A Python handle that adds functionality for saving lines.
24
25 Saves lines in a LIFO fashion.
26
27 Added methods:
28 saveline Save a line to be returned next time.
29 peekline Peek at the next line without consuming it.
30
31 """
33 self._handle = handle
34 self._saved = []
35
37 lines = self._saved + self._handle.readlines(*args,**keywds)
38 self._saved = []
39 return lines
40
42 if self._saved:
43 line = self._saved.pop(0)
44 else:
45 line = self._handle.readline(*args,**keywds)
46 return line
47
48 - def read(self, size=-1):
49 if size == -1:
50 saved = string.join(self._saved, "")
51 self._saved[:] = []
52 else:
53 saved = ''
54 while size > 0 and self._saved:
55 if len(self._saved[0]) <= size:
56 size = size - len(self._saved[0])
57 saved = saved + self._saved.pop(0)
58 else:
59 saved = saved + self._saved[0][:size]
60 self._saved[0] = self._saved[0][size:]
61 size = 0
62 return saved + self._handle.read(size)
63
65 if line:
66 self._saved = [line] + self._saved
67
69 if self._saved:
70 line = self._saved[0]
71 else:
72 line = self._handle.readline()
73 self.saveline(line)
74 return line
75
80
81 - def seek(self, *args):
82 self._saved = []
83 self._handle.seek(*args)
84
86 return getattr(self._handle, attr)
87
88
89
90
91 StringHandle = StringIO.StringIO
92
93
94
96 """A Python handle that automatically strips SGML tags from data.
97
98 """
100 """SGMLStripper(handle)
101
102 handle is a file handle to SGML-formatted data.
103
104 """
105 self._handle = handle
106 self._stripper = SGMLStripper()
107
108 - def read(self, *args, **keywds):
111
113 line = self._handle.readline(*args, **keywds)
114 return self._stripper.strip(line)
115
117 lines = self._handle.readlines(*args, **keywds)
118 for i in range(len(lines)):
119 lines[i] = self._stripper.strip(str)
120 return lines
121
123 return getattr(self._handle, attr)
124
125
133
136
138 """S.strip(str) -> string
139
140 Strip the SGML tags from str.
141
142 """
143 if not str:
144 return ''
145
146
147
148
149
150 is_newline = str[-1] in ['\n', '\r']
151
152 self._parser.data = ''
153 self._parser.feed(str)
154 if self._parser.data:
155 str = self._parser.data
156 elif is_newline:
157 str = '\n'
158 else:
159 str = ''
160 return str
161