summaryrefslogtreecommitdiffstats
path: root/htmlbuffer.py
diff options
context:
space:
mode:
authorMatt Wilson <msw@redhat.com>2001-10-25 13:51:24 +0000
committerMatt Wilson <msw@redhat.com>2001-10-25 13:51:24 +0000
commitce667c682e4d1ee1f27332f37c759e41b6985dc2 (patch)
treee1e46c2c11209672c6b976021d93756a89b51a0f /htmlbuffer.py
parentb830761912a5ca1183ae12dfafeeba2183c72c7b (diff)
downloadanaconda-ce667c682e4d1ee1f27332f37c759e41b6985dc2.tar.gz
anaconda-ce667c682e4d1ee1f27332f37c759e41b6985dc2.tar.xz
anaconda-ce667c682e4d1ee1f27332f37c759e41b6985dc2.zip
make at least a simple unordered list work, scroll to the top of the help when refreshing - help text looks pretty good now (with CVS GTK+)
Diffstat (limited to 'htmlbuffer.py')
-rw-r--r--htmlbuffer.py117
1 files changed, 77 insertions, 40 deletions
diff --git a/htmlbuffer.py b/htmlbuffer.py
index eb9e0baf1..229c3e3f5 100644
--- a/htmlbuffer.py
+++ b/htmlbuffer.py
@@ -23,91 +23,127 @@ import re
class HTMLBuffer(HTMLParser.HTMLParser):
ignoreTags = ('title',)
- noTagTags = ('html', 'body', 'div', 'head')
- newlineTags = ('p', 'h1', 'h2')
+ noTagTags = ('html', 'div', 'head')
+ newlineTags = ('p', 'h1', 'h2', 'li')
whiteSpaceNuker = re.compile(r"""\s+""", re.MULTILINE)
def __init__(self):
self.buffer = gtk.TextBuffer(None)
self.ignoreData = 0
+ self.inList = 0
self.currentTag = ''
+ self.startOfP = 0
HTMLParser.HTMLParser.__init__(self)
+ if gtk.gdk.screen_width() >= 800:
+ baseSize = 12
+ else:
+ baseSize = 10
+
+ tag = self.buffer.create_tag('body')
+ tag.set_property('font', 'Sans %d' % (baseSize,))
+
tag = self.buffer.create_tag('p')
- tag.set_property('font', 'Sans 14')
+ tag.set_property('pixels-above-lines', '5')
+ tag.set_property('pixels-below-lines', '5')
+
tag = self.buffer.create_tag('tt')
- tag.set_property('font', 'Monospace 14')
+ tag.set_property('font', 'Monospace %d' % (baseSize,))
+
tag = self.buffer.create_tag('a')
- tag.set_property('font', 'Sans 14')
+ tag.set_property('font', 'Sans %d' % (baseSize,))
+
tag = self.buffer.create_tag('h1')
- tag.set_property('font', 'Sans 24')
+ tag.set_property('font', 'Sans %d' % (baseSize + 10,))
tag.set_property('weight', pango.WEIGHT_BOLD)
+
tag = self.buffer.create_tag('h2')
- tag.set_property('font', 'Sans 18')
+ tag.set_property('font', 'Sans %d' % (baseSize + 4,))
tag.set_property('weight', pango.WEIGHT_BOLD)
+
tag = self.buffer.create_tag('b')
tag.set_property('weight', pango.WEIGHT_BOLD)
+
tag = self.buffer.create_tag('i')
tag.set_property('style', pango.STYLE_ITALIC)
+ tag = self.buffer.create_tag('ul')
+ tag.set_property('left-margin', 20)
+ # reset spacing in paragraphs incase this list is inside <p>
+ tag.set_property('pixels-above-lines', '0')
+ tag.set_property('pixels-below-lines', '0')
+
+ tag = self.buffer.create_tag('li')
+ tag.set_property('indent', -9)
+
self.iter = self.buffer.get_iter_at_offset(0)
- self.offsets = [0]
+ self.offsets = {}
def get_buffer(self):
return self.buffer
- # structure markup
+ def pushTag(self, tag, offset):
+ if self.offsets.has_key(tag):
+ self.offsets[tag].append(offset)
+ else:
+ self.offsets[tag] = [offset]
+
+ def popTag(self, tag):
+ if not self.offsets.has_key(tag):
+ raise RuntimeError, "impossible"
+ return self.offsets[tag].pop()
+
+ # structure markup
def handle_starttag(self, tag, attrs):
if tag in self.ignoreTags:
self.ignoreData += 1
return
- if tag in self.newlineTags:
- self.buffer.insert(self.iter, '\n')
- if tag == 'p':
- self.buffer.insert(self.iter, '\n\t')
self.currentTag = tag
- self.offsets.append(self.iter.get_offset())
-
- def handle_startendtag(self, tag, attrs):
- print (("startendtag", tag, attrs))
+ if tag in self.noTagTags:
+ return
+ self.pushTag(tag, self.iter.get_offset())
+ if tag == 'li':
+ self.inList += 1
+ self.buffer.insert(self.iter, u'\u2022 ')
+ elif tag == 'p':
+ self.startOfP = 1
def handle_endtag(self, tag):
if tag in self.ignoreTags:
self.ignoreData -= 1
return
+ if tag == 'li':
+ self.inList -= 1
if tag in self.noTagTags:
return
- start = self.buffer.get_iter_at_offset(self.offsets.pop())
+ offset = self.popTag(tag)
+ current = self.iter.get_offset()
+ if tag in self.newlineTags and offset != current:
+ if tag == 'p' and self.inList:
+ offset -= 2
+ # put a newline at the beginning
+ start = self.buffer.get_iter_at_offset(offset)
+ self.buffer.insert(start, '\n')
+ offset += 1
+ current += 1
+ self.iter = self.buffer.get_iter_at_offset(current)
+ start = self.buffer.get_iter_at_offset(offset)
self.buffer.apply_tag_by_name(tag, start, self.iter)
# all other markup
-
- def handle_comment(self, data):
- print (("comment", data))
-
- def handle_charref(self, data):
- print (("charref", data))
-
def handle_data(self, data):
if self.ignoreData == 0:
- data = data.replace('\n', '')
+ data = data.replace('\n', ' ')
data = self.whiteSpaceNuker.sub(' ', data)
- if not data:
- return
+ if self.startOfP:
+ if data.startswith(' '):
+ data = data[1:]
+ self.startOfP = 0
# print '|%s|' % (data,)
self.buffer.insert(self.iter, data)
- def handle_decl(self, data):
- print (("decl", data))
-
- def handle_entityref(self, data):
- print (("entityref", data))
-
- def handle_pi(self, data):
- print (("pi", data))
-
- def unknown_decl(self, decl):
- print (("unknown decl", decl))
-
if __name__ == '__main__':
+ def quit(*args):
+ gtk.main_quit()
+
import sys
f = open(sys.argv[1], 'r')
buffer = HTMLBuffer()
@@ -123,6 +159,7 @@ if __name__ == '__main__':
sw = gtk.ScrolledWindow()
sw.add(view)
win = gtk.Window()
+ win.connect('destroy', quit)
win.add(sw)
win.show_all()
win.set_usize(300, 300)