diff --git a/pysollib/tile/tkhtml.py b/pysollib/tile/tkhtml.py index e5d91001..7728e8ef 100644 --- a/pysollib/tile/tkhtml.py +++ b/pysollib/tile/tkhtml.py @@ -45,174 +45,7 @@ from pysollib.ui.tktile.tkutil import bind, unbind_destroy from tkwidget import MfxMessageDialog from statusbar import HtmlStatusbar - -REMOTE_PROTOCOLS = ("ftp:", "gopher:", "http:", "mailto:", "news:", "telnet:") - - -# ************************************************************************ -# * -# ************************************************************************ - -class tkHTMLWriter(formatter.NullWriter): - def __init__(self, text, viewer, app): - formatter.NullWriter.__init__(self) - - self.text = text - self.viewer = viewer - - ## - if app: - font = app.getFont("sans") - fixed = app.getFont("fixed") - else: - font = ('helvetica', 12) - fixed = ('courier', 12) - size = font[1] - sign = 1 - if size < 0: sign = -1 - self.fontmap = { - "h1" : (font[0], size + 12*sign, "bold"), - "h2" : (font[0], size + 8*sign, "bold"), - "h3" : (font[0], size + 6*sign, "bold"), - "h4" : (font[0], size + 4*sign, "bold"), - "h5" : (font[0], size + 2*sign, "bold"), - "h6" : (font[0], size + 1*sign, "bold"), - "bold" : (font[0], size, "bold"), - "italic" : (font[0], size, "italic"), - "pre" : fixed, - } - - self.text.config(cursor=self.viewer.defcursor, font=font) - for f in self.fontmap.keys(): - self.text.tag_config(f, font=self.fontmap[f]) - - self.anchor = None - self.anchor_mark = None - self.font = None - self.font_mark = None - self.indent = "" - - def createCallback(self, href): - class Functor: - def __init__(self, viewer, arg): - self.viewer = viewer - self.arg = arg - def __call__(self, *args): - self.viewer.updateHistoryXYView() - return self.viewer.display(self.arg) - return Functor(self.viewer, href) - - def write(self, data): - self.text.insert("insert", data) - - def anchor_bgn(self, href, name, type): - if href: - ##self.text.update_idletasks() # update display during parsing - self.anchor = (href, name, type) - self.anchor_mark = self.text.index("insert") - - def anchor_end(self): - if self.anchor: - url = self.anchor[0] - tag = "href_" + url - self.text.tag_add(tag, self.anchor_mark, "insert") - self.text.tag_bind(tag, "<1>", self.createCallback(url)) - self.text.tag_bind(tag, "", lambda e: self.anchor_enter(url)) - self.text.tag_bind(tag, "", self.anchor_leave) - fg = 'blue' - u = self.viewer.normurl(url, with_protocol=False) - if u in self.viewer.visited_urls: - fg = '#660099' - self.text.tag_config(tag, foreground=fg, underline=1) - self.anchor = None - - def anchor_enter(self, url): - url = self.viewer.normurl(url) - self.viewer.statusbar.updateText(url=url) - self.text.config(cursor=self.viewer.handcursor) - - def anchor_leave(self, *args): - self.viewer.statusbar.updateText(url='') - self.text.config(cursor=self.viewer.defcursor) - - def new_font(self, font): - # end the current font - if self.font: - ##print "end_font(%s)" % `self.font` - self.text.tag_add(self.font, self.font_mark, "insert") - self.font = None - # start the new font - if font: - ##print "start_font(%s)" % `font` - self.font_mark = self.text.index("insert") - if font[0] in self.fontmap: - self.font = font[0] - elif font[3]: - self.font = "pre" - elif font[2]: - self.font = "bold" - elif font[1]: - self.font = "italic" - else: - self.font = None - - def new_margin(self, margin, level): - self.indent = " " * level - - def send_label_data(self, data): - ##self.write(self.indent + data + " ") - self.write(self.indent) - if data == '*': #
  • - img = self.viewer.symbols_img.get('disk') - if img: - self.text.image_create(index='insert', image=img, - padx=0, pady=0) - else: - self.write('*') - else: - self.write(data) - self.write(' ') - - def send_paragraph(self, blankline): - self.write('\n' * blankline) - - def send_line_break(self): - self.write('\n') - - def send_hor_rule(self, *args): - width = int(int(self.text["width"]) * 0.9) - self.write("_" * width) - self.write("\n") - - def send_literal_data(self, data): - self.write(data) - - def send_flowing_data(self, data): - self.write(data) - - -# ************************************************************************ -# * -# ************************************************************************ - -class tkHTMLParser(htmllib.HTMLParser): - def anchor_bgn(self, href, name, type): - self.formatter.flush_softspace() - htmllib.HTMLParser.anchor_bgn(self, href, name, type) - self.formatter.writer.anchor_bgn(href, name, type) - - def anchor_end(self): - if self.anchor: - self.anchor = None - self.formatter.writer.anchor_end() - - def do_dt(self, attrs): - self.formatter.end_paragraph(1) - self.ddpop() - - def handle_image(self, src, alt, ismap, align, width, height): - self.formatter.writer.viewer.showImage(src, alt, ismap, align, width, height) - +from pysollib.ui.tktile.tkhtml import REMOTE_PROTOCOLS, tkHTMLWriter, tkHTMLParser # ************************************************************************ # * diff --git a/pysollib/tk/tkhtml.py b/pysollib/tk/tkhtml.py index 9117e096..1f466a77 100644 --- a/pysollib/tk/tkhtml.py +++ b/pysollib/tk/tkhtml.py @@ -44,174 +44,7 @@ from pysollib.ui.tktile.tkutil import bind, unbind_destroy from tkwidget import MfxMessageDialog from statusbar import HtmlStatusbar - -REMOTE_PROTOCOLS = ("ftp:", "gopher:", "http:", "mailto:", "news:", "telnet:") - - -# ************************************************************************ -# * -# ************************************************************************ - -class tkHTMLWriter(formatter.NullWriter): - def __init__(self, text, viewer, app): - formatter.NullWriter.__init__(self) - - self.text = text - self.viewer = viewer - - ## - if app: - font = app.getFont("sans") - fixed = app.getFont("fixed") - else: - font = ('helvetica', 12) - fixed = ('courier', 12) - size = font[1] - sign = 1 - if size < 0: sign = -1 - self.fontmap = { - "h1" : (font[0], size + 12*sign, "bold"), - "h2" : (font[0], size + 8*sign, "bold"), - "h3" : (font[0], size + 6*sign, "bold"), - "h4" : (font[0], size + 4*sign, "bold"), - "h5" : (font[0], size + 2*sign, "bold"), - "h6" : (font[0], size + 1*sign, "bold"), - "bold" : (font[0], size, "bold"), - "italic" : (font[0], size, "italic"), - "pre" : fixed, - } - - self.text.config(cursor=self.viewer.defcursor, font=font) - for f in self.fontmap.keys(): - self.text.tag_config(f, font=self.fontmap[f]) - - self.anchor = None - self.anchor_mark = None - self.font = None - self.font_mark = None - self.indent = "" - - def createCallback(self, href): - class Functor: - def __init__(self, viewer, arg): - self.viewer = viewer - self.arg = arg - def __call__(self, *args): - self.viewer.updateHistoryXYView() - return self.viewer.display(self.arg) - return Functor(self.viewer, href) - - def write(self, data): - self.text.insert("insert", data) - - def anchor_bgn(self, href, name, type): - if href: - ##self.text.update_idletasks() # update display during parsing - self.anchor = (href, name, type) - self.anchor_mark = self.text.index("insert") - - def anchor_end(self): - if self.anchor: - url = self.anchor[0] - tag = "href_" + url - self.text.tag_add(tag, self.anchor_mark, "insert") - self.text.tag_bind(tag, "<1>", self.createCallback(url)) - self.text.tag_bind(tag, "", lambda e: self.anchor_enter(url)) - self.text.tag_bind(tag, "", self.anchor_leave) - fg = 'blue' - u = self.viewer.normurl(url, with_protocol=False) - if u in self.viewer.visited_urls: - fg = '#660099' - self.text.tag_config(tag, foreground=fg, underline=1) - self.anchor = None - - def anchor_enter(self, url): - url = self.viewer.normurl(url) - self.viewer.statusbar.updateText(url=url) - self.text.config(cursor=self.viewer.handcursor) - - def anchor_leave(self, *args): - self.viewer.statusbar.updateText(url='') - self.text.config(cursor=self.viewer.defcursor) - - def new_font(self, font): - # end the current font - if self.font: - ##print "end_font(%s)" % `self.font` - self.text.tag_add(self.font, self.font_mark, "insert") - self.font = None - # start the new font - if font: - ##print "start_font(%s)" % `font` - self.font_mark = self.text.index("insert") - if font[0] in self.fontmap: - self.font = font[0] - elif font[3]: - self.font = "pre" - elif font[2]: - self.font = "bold" - elif font[1]: - self.font = "italic" - else: - self.font = None - - def new_margin(self, margin, level): - self.indent = " " * level - - def send_label_data(self, data): - ##self.write(self.indent + data + " ") - self.write(self.indent) - if data == '*': #
  • - img = self.viewer.symbols_img.get('disk') - if img: - self.text.image_create(index='insert', image=img, - padx=0, pady=0) - else: - self.write('*') - else: - self.write(data) - self.write(' ') - - def send_paragraph(self, blankline): - self.write('\n' * blankline) - - def send_line_break(self): - self.write('\n') - - def send_hor_rule(self, *args): - width = int(int(self.text["width"]) * 0.9) - self.write("_" * width) - self.write("\n") - - def send_literal_data(self, data): - self.write(data) - - def send_flowing_data(self, data): - self.write(data) - - -# ************************************************************************ -# * -# ************************************************************************ - -class tkHTMLParser(htmllib.HTMLParser): - def anchor_bgn(self, href, name, type): - self.formatter.flush_softspace() - htmllib.HTMLParser.anchor_bgn(self, href, name, type) - self.formatter.writer.anchor_bgn(href, name, type) - - def anchor_end(self): - if self.anchor: - self.anchor = None - self.formatter.writer.anchor_end() - - def do_dt(self, attrs): - self.formatter.end_paragraph(1) - self.ddpop() - - def handle_image(self, src, alt, ismap, align, width, height): - self.formatter.writer.viewer.showImage(src, alt, ismap, align, width, height) - +from pysollib.ui.tktile.tkhtml import REMOTE_PROTOCOLS, tkHTMLWriter, tkHTMLParser # ************************************************************************ # * diff --git a/pysollib/ui/tktile/tkhtml.py b/pysollib/ui/tktile/tkhtml.py new file mode 100644 index 00000000..91bb94b5 --- /dev/null +++ b/pysollib/ui/tktile/tkhtml.py @@ -0,0 +1,191 @@ +#!/usr/bin/env python +# -*- mode: python; coding: utf-8; -*- +##---------------------------------------------------------------------------## +## +## Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer +## Copyright (C) 2003 Mt. Hood Playing Card Co. +## Copyright (C) 2005-2009 Skomoroh +## +## This program is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see . +## +##---------------------------------------------------------------------------## + +import htmllib, formatter + +REMOTE_PROTOCOLS = ("ftp:", "gopher:", "http:", "mailto:", "news:", "telnet:") + +# ************************************************************************ +# * +# ************************************************************************ + +class tkHTMLWriter(formatter.NullWriter): + def __init__(self, text, viewer, app): + formatter.NullWriter.__init__(self) + + self.text = text + self.viewer = viewer + + ## + if app: + font = app.getFont("sans") + fixed = app.getFont("fixed") + else: + font = ('helvetica', 12) + fixed = ('courier', 12) + size = font[1] + sign = 1 + if size < 0: sign = -1 + self.fontmap = { + "h1" : (font[0], size + 12*sign, "bold"), + "h2" : (font[0], size + 8*sign, "bold"), + "h3" : (font[0], size + 6*sign, "bold"), + "h4" : (font[0], size + 4*sign, "bold"), + "h5" : (font[0], size + 2*sign, "bold"), + "h6" : (font[0], size + 1*sign, "bold"), + "bold" : (font[0], size, "bold"), + "italic" : (font[0], size, "italic"), + "pre" : fixed, + } + + self.text.config(cursor=self.viewer.defcursor, font=font) + for f in self.fontmap.keys(): + self.text.tag_config(f, font=self.fontmap[f]) + + self.anchor = None + self.anchor_mark = None + self.font = None + self.font_mark = None + self.indent = "" + + def createCallback(self, href): + class Functor: + def __init__(self, viewer, arg): + self.viewer = viewer + self.arg = arg + def __call__(self, *args): + self.viewer.updateHistoryXYView() + return self.viewer.display(self.arg) + return Functor(self.viewer, href) + + def write(self, data): + self.text.insert("insert", data) + + def anchor_bgn(self, href, name, type): + if href: + ##self.text.update_idletasks() # update display during parsing + self.anchor = (href, name, type) + self.anchor_mark = self.text.index("insert") + + def anchor_end(self): + if self.anchor: + url = self.anchor[0] + tag = "href_" + url + self.text.tag_add(tag, self.anchor_mark, "insert") + self.text.tag_bind(tag, "<1>", self.createCallback(url)) + self.text.tag_bind(tag, "", lambda e: self.anchor_enter(url)) + self.text.tag_bind(tag, "", self.anchor_leave) + fg = 'blue' + u = self.viewer.normurl(url, with_protocol=False) + if u in self.viewer.visited_urls: + fg = '#660099' + self.text.tag_config(tag, foreground=fg, underline=1) + self.anchor = None + + def anchor_enter(self, url): + url = self.viewer.normurl(url) + self.viewer.statusbar.updateText(url=url) + self.text.config(cursor=self.viewer.handcursor) + + def anchor_leave(self, *args): + self.viewer.statusbar.updateText(url='') + self.text.config(cursor=self.viewer.defcursor) + + def new_font(self, font): + # end the current font + if self.font: + ##print "end_font(%s)" % `self.font` + self.text.tag_add(self.font, self.font_mark, "insert") + self.font = None + # start the new font + if font: + ##print "start_font(%s)" % `font` + self.font_mark = self.text.index("insert") + if font[0] in self.fontmap: + self.font = font[0] + elif font[3]: + self.font = "pre" + elif font[2]: + self.font = "bold" + elif font[1]: + self.font = "italic" + else: + self.font = None + + def new_margin(self, margin, level): + self.indent = " " * level + + def send_label_data(self, data): + ##self.write(self.indent + data + " ") + self.write(self.indent) + if data == '*': #
  • + img = self.viewer.symbols_img.get('disk') + if img: + self.text.image_create(index='insert', image=img, + padx=0, pady=0) + else: + self.write('*') + else: + self.write(data) + self.write(' ') + + def send_paragraph(self, blankline): + self.write('\n' * blankline) + + def send_line_break(self): + self.write('\n') + + def send_hor_rule(self, *args): + width = int(int(self.text["width"]) * 0.9) + self.write("_" * width) + self.write("\n") + + def send_literal_data(self, data): + self.write(data) + + def send_flowing_data(self, data): + self.write(data) + + +# ************************************************************************ +# * +# ************************************************************************ + +class tkHTMLParser(htmllib.HTMLParser): + def anchor_bgn(self, href, name, type): + self.formatter.flush_softspace() + htmllib.HTMLParser.anchor_bgn(self, href, name, type) + self.formatter.writer.anchor_bgn(href, name, type) + + def anchor_end(self): + if self.anchor: + self.anchor = None + self.formatter.writer.anchor_end() + + def do_dt(self, attrs): + self.formatter.end_paragraph(1) + self.ddpop() + + def handle_image(self, src, alt, ismap, align, width, height): + self.formatter.writer.viewer.showImage(src, alt, ismap, align, width, height) + diff --git a/scripts/gen_individual_importing_tests.py b/scripts/gen_individual_importing_tests.py index d1a888d8..68dd7428 100644 --- a/scripts/gen_individual_importing_tests.py +++ b/scripts/gen_individual_importing_tests.py @@ -186,6 +186,7 @@ for module_name in [ 'pysollib.ui.tktile.solverdialog', 'pysollib.ui.tktile.tkcanvas', 'pysollib.ui.tktile.tkconst', +'pysollib.ui.tktile.tkhtml', 'pysollib.ui.tktile.tkutil', 'pysollib.ui.tktile.tkwrap', 'pysollib.util',