diff options
author | Matt Wilson <msw@redhat.com> | 2001-10-25 13:51:24 +0000 |
---|---|---|
committer | Matt Wilson <msw@redhat.com> | 2001-10-25 13:51:24 +0000 |
commit | ce667c682e4d1ee1f27332f37c759e41b6985dc2 (patch) | |
tree | e1e46c2c11209672c6b976021d93756a89b51a0f /htmlbuffer.py | |
parent | b830761912a5ca1183ae12dfafeeba2183c72c7b (diff) | |
download | anaconda-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.py | 117 |
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) |