1
2def _src_to_xml(text):
3    return text.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt")
4
5def decodes(text):
6    if not text: return text
7    try:
8        return text.decode("utf-8")
9    except:
10        try:
11            return text.decode("latin-1")
12        except:
13            return str(text)
14
15class TextFile:
16    def __init__(self, filename = None):
17        self.filename = filename
18        self.src_text = None
19        self.xml_text = None
20    def parse(self, filename = None):
21        if filename is not None:
22            self.filename = filename
23        if self.filename is None:
24            return False
25        try:
26            fd = open(self.filename, "rb")
27            self.src_text = decodes(fd.read())
28            fd.close()
29            return True
30        except IOError as e:
31            pass
32        return False
33    def assert_src_text(self):
34        if self.src_text: return True
35        return self.parse()
36    def assert_xml_text(self):
37        if self.xml_text: return True
38        if not self.assert_src_text(): return False
39        self.xml_text = _src_to_xml(self.src_text)
40    def get_src_text(self):
41        self.assert_src_text()
42        return self.src_text
43    def get_xml_text(self):
44        self.assert_xml_text()
45        return self.xml_text
46    def get_filename(self):
47        return self.filename
48    def line_xml_text(self, offset):
49        self._line(self.xml_text, offset)
50    def line_src_text(self, offset):
51        self._line(self.src_text, offset)
52    def _line(self, text, offset):
53        line = 1
54        for x in xrange(0,offset):
55            if x == "\n":
56                line += 1
57        return line
58
59
60