OSDN Git Service

Support link. See HyperText of pygtk-demo.
[fukui-no-namari/fukui-no-namari.git] / src / Hage1 / barehtmlparser.py
1 # Copyright (C) 2006 by Aiwota Programmer
2 # aiwotaprog@tetteke.tk
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 from HTMLParserEx import HTMLParserEx
19 import htmlentitydefs
20
21
22 class BareHTMLParser(HTMLParserEx):
23     """Parses html by the minimal necessity
24
25     to_out_func format is:
26     def some_func(untied_data, is_bold, href):
27     where untied_data is non markuped string
28     and is_bold is whether untied_data is bold or not
29     and href is url anchor if exists
30
31     strip spaces at the head and end of line, but first line's head is unable.
32     """
33
34     def __init__(self, to_out_func):
35         HTMLParserEx.__init__(self)
36         self.to_out_func = to_out_func
37         self.bold = False
38         self.href = None
39         self.buffer = ""
40
41     def reset_func(self, to_out_func):
42         self.to_out_func = to_out_func
43
44     def to_out(self, data):
45         n = len(self.buffer)
46         if n > 0 and self.buffer[n-1] == "\n":
47             data = data.lstrip(" ")
48         self.buffer = self.buffer + data
49
50     def flush(self):
51         if self.buffer:
52             self.to_out_func(self.buffer, self.bold, self.href)
53             self.buffer = ""
54
55     def newline(self):
56         self.buffer = self.buffer.rstrip(" ")
57         self.to_out("\n")
58
59     # override
60     # flush after closing
61     def close(self):
62         HTMLParserEx.close(self)
63         self.flush()
64
65     # override handle_*
66     
67     def handle_starttag(self, tag, attr):
68         if tag == "b":
69             self.flush()
70             self.bold = True
71         elif tag == "br":
72             self.newline()
73         elif tag == "a":
74             self.flush()
75             for item in attr:
76                 if item[0] == "href":
77                     self.href = item[1]
78
79     def handle_endtag(self, tag):
80         if tag == "b":
81             self.flush()
82             self.bold = False
83         elif tag == "a":
84             self.flush()
85             self.href = None
86
87     def handle_data(self, data):
88         self.to_out(data)
89
90     def handle_charref(self, ref):
91         data = None
92         try:
93             data = unichr(int(ref))
94         except:
95             data = "&#"+ref+";"
96         self.to_out(data)
97
98     def handle_entityref(self, name):
99         if name in htmlentitydefs.name2codepoint:
100             codepoint = htmlentitydefs.name2codepoint[name]
101             self.to_out(unichr(codepoint))
102         else:
103             self.to_out("&"+name+";")