1
0
Fork 0
mirror of https://github.com/shlomif/PySolFC.git synced 2025-04-05 00:02:29 -04:00
This commit is contained in:
Shlomi Fish 2017-04-17 13:49:43 +03:00
parent 899dfe677f
commit a8984338bf
2 changed files with 74 additions and 68 deletions

View file

@ -1,6 +1,6 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- mode: python; coding: utf-8; -*- # -*- mode: python; coding: utf-8; -*-
# ---------------------------------------------------------------------------## # ---------------------------------------------------------------------------
# #
# Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer # Copyright (C) 1998-2003 Markus Franz Xaver Johannes Oberhumer
# Copyright (C) 2003 Mt. Hood Playing Card Co. # Copyright (C) 2003 Mt. Hood Playing Card Co.
@ -19,33 +19,38 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
# #
# ---------------------------------------------------------------------------## # ---------------------------------------------------------------------------
__all__ = ['HTMLViewer'] __all__ = ['HTMLViewer']
# imports # imports
import os, sys, re, types import os
import htmllib, formatter import sys
import htmllib
import formatter
import traceback import traceback
from pysollib.mygettext import _, n_ from pysollib.mygettext import _
import gtk, pango, gobject import gtk
import pango
import gobject
from gtk import gdk from gtk import gdk
# PySol imports
from pysollib.mfxutil import Struct, openURL
from pysollib.settings import TITLE
# Toolkit imports
from tkwidget import MfxMessageDialog
if __name__ == '__main__': if __name__ == '__main__':
d = os.path.abspath(os.path.join(sys.path[0], '..', '..')) d = os.path.abspath(os.path.join(sys.path[0], '..', '..'))
sys.path.append(d) sys.path.append(d)
import gettext import gettext
gettext.install('pysol', d, unicode=True) gettext.install('pysol', d, unicode=True)
# PySol imports if sys.version_info > (3,):
from pysollib.mfxutil import Struct, openURL unicode = str
from pysollib.settings import TITLE
# Toolkit imports
from tkutil import bind, unbind_destroy, loadImage
from tkwidget import MfxMessageDialog
REMOTE_PROTOCOLS = ('ftp:', 'gopher:', 'http:', 'mailto:', 'news:', 'telnet:') REMOTE_PROTOCOLS = ('ftp:', 'gopher:', 'http:', 'mailto:', 'news:', 'telnet:')
@ -68,14 +73,13 @@ class tkHTMLWriter(formatter.NullWriter):
self.font_mark = None self.font_mark = None
self.indent = '' self.indent = ''
def write(self, data): def write(self, data):
data = unicode(data) data = unicode(data)
self.text.insert(self.text.get_end_iter(), data, len(data)) self.text.insert(self.text.get_end_iter(), data, len(data))
def anchor_bgn(self, href, name, type): def anchor_bgn(self, href, name, type):
if href: if href:
##self.text.update_idletasks() # update display during parsing # self.text.update_idletasks() # update display during parsing
self.anchor = (href, name, type) self.anchor = (href, name, type)
self.anchor_mark = self.text.get_end_iter().get_offset() self.anchor_mark = self.text.get_end_iter().get_offset()
@ -95,7 +99,7 @@ class tkHTMLWriter(formatter.NullWriter):
tag.set_property('foreground', '#660099') tag.set_property('foreground', '#660099')
start = self.text.get_iter_at_offset(self.anchor_mark) start = self.text.get_iter_at_offset(self.anchor_mark)
end = self.text.get_end_iter() end = self.text.get_end_iter()
##print 'apply_tag href >>', start.get_offset(), end.get_offset() # print 'apply_tag href >>', start.get_offset(), end.get_offset()
self.text.apply_tag(tag, start, end) self.text.apply_tag(tag, start, end)
self.anchor = None self.anchor = None
@ -103,15 +107,15 @@ class tkHTMLWriter(formatter.NullWriter):
def new_font(self, font): def new_font(self, font):
# end the current font # end the current font
if self.font: if self.font:
##print 'end_font(%s)' % `self.font` # print 'end_font(%s)' % `self.font`
start = self.text.get_iter_at_offset(self.font_mark) start = self.text.get_iter_at_offset(self.font_mark)
end = self.text.get_end_iter() end = self.text.get_end_iter()
##print 'apply_tag font >>', start.get_offset(), end.get_offset() # print 'apply_tag font >>', start.get_offset(), end.get_offset()
self.text.apply_tag_by_name(self.font, start, end) self.text.apply_tag_by_name(self.font, start, end)
self.font = None self.font = None
# start the new font # start the new font
if font: if font:
##print 'start_font(%s)' % `font` # print 'start_font(%s)' % `font`
self.font_mark = self.text.get_end_iter().get_offset() self.font_mark = self.text.get_end_iter().get_offset()
if font[0] in self.viewer.fontmap: if font[0] in self.viewer.fontmap:
self.font = font[0] self.font = font[0]
@ -128,14 +132,14 @@ class tkHTMLWriter(formatter.NullWriter):
self.indent = ' ' * level self.indent = ' ' * level
def send_label_data(self, data): def send_label_data(self, data):
##self.write(self.indent + data + ' ') # self.write(self.indent + data + ' ')
self.write(self.indent) self.write(self.indent)
if data == '*': # <li> if data == '*': # <li>
img = self.viewer.symbols_img.get('disk') img = self.viewer.symbols_img.get('disk')
if img: if img:
self.text.insert_pixbuf(self.text.get_end_iter(), img) self.text.insert_pixbuf(self.text.get_end_iter(), img)
else: else:
self.write('*') ##unichr(0x2022) self.write('*') # unichr(0x2022)
else: else:
self.write(data) self.write(data)
self.write(' ') self.write(' ')
@ -147,7 +151,7 @@ class tkHTMLWriter(formatter.NullWriter):
self.write('\n') self.write('\n')
def send_hor_rule(self, *args): def send_hor_rule(self, *args):
##~ width = int(int(self.text['width']) * 0.9) # ~ width = int(int(self.text['width']) * 0.9)
width = 70 width = 70
self.write('_' * width) self.write('_' * width)
self.write('\n') self.write('\n')
@ -179,7 +183,8 @@ class tkHTMLParser(htmllib.HTMLParser):
self.ddpop() self.ddpop()
def handle_image(self, src, alt, ismap, align, width, height): def handle_image(self, src, alt, ismap, align, width, height):
self.formatter.writer.viewer.showImage(src, alt, ismap, align, width, height) self.formatter.writer.viewer.showImage(
src, alt, ismap, align, width, height)
# ************************************************************************ # ************************************************************************
@ -196,17 +201,17 @@ class HTMLViewer:
self.home = home self.home = home
self.url = None self.url = None
self.history = Struct( self.history = Struct(
list = [], list=[],
index = 0, index=0,
) )
self.visited_urls = [] self.visited_urls = []
self.images = {} self.images = {}
self.anchor_tags = {} self.anchor_tags = {}
# create buttons # create buttons
button_width = 8
vbox = gtk.VBox() vbox = gtk.VBox()
parent.table.attach(vbox, parent.table.attach(
vbox,
0, 1, 0, 1, 0, 1, 0, 1,
gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL | gtk.SHRINK, gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL | gtk.SHRINK,
0, 0) 0, 0)
@ -217,7 +222,8 @@ class HTMLViewer:
('homeButton', _('Index'), self.goHome), ('homeButton', _('Index'), self.goHome),
('backButton', _('Back'), self.goBack), ('backButton', _('Back'), self.goBack),
('forwardButton', _('Forward'), self.goForward), ('forwardButton', _('Forward'), self.goForward),
('closeButton', _('Close'), self.destroy) ): ('closeButton', _('Close'), self.destroy)
):
button = gtk.Button(label) button = gtk.Button(label)
button.show() button.show()
button.connect('clicked', callback) button.connect('clicked', callback)
@ -268,15 +274,14 @@ class HTMLViewer:
# cursor # cursor
self.defcursor = gdk.XTERM self.defcursor = gdk.XTERM
self.handcursor = gdk.HAND2 self.handcursor = gdk.HAND2
##self.textview.realize() # self.textview.realize()
##window = self.textview.get_window(gtk.TEXT_WINDOW_TEXT) # window = self.textview.get_window(gtk.TEXT_WINDOW_TEXT)
##window.set_cursor(gdk.Cursor(self.defcursor)) # window.set_cursor(gdk.Cursor(self.defcursor))
parent.set_default_size(600, 440) parent.set_default_size(600, 440)
parent.show_all() parent.show_all()
gobject.idle_add(gtk.main) gobject.idle_add(gtk.main)
def motion_notify_event(self, widget, event): def motion_notify_event(self, widget, event):
x, y, _ = widget.window.get_pointer() x, y, _ = widget.window.get_pointer()
x, y = widget.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y) x, y = widget.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, x, y)
@ -288,16 +293,16 @@ class HTMLViewer:
break break
if is_over_anchor: if is_over_anchor:
if not self._changed_cursor: if not self._changed_cursor:
##print 'set cursor hand' # print 'set cursor hand'
window = widget.get_window(gtk.TEXT_WINDOW_TEXT) window = widget.get_window(gtk.TEXT_WINDOW_TEXT)
window.set_cursor(gdk.Cursor(self.handcursor)) window.set_cursor(gdk.Cursor(self.handcursor))
self._changed_cursor = True self._changed_cursor = True
self.statusbar.pop(0) self.statusbar.pop(0)
href = url = self.normurl(href) href = self.normurl(href)
self.statusbar.push(0, href) self.statusbar.push(0, href)
else: else:
if self._changed_cursor: if self._changed_cursor:
##print 'set cursor xterm' # print 'set cursor xterm'
window = widget.get_window(gtk.TEXT_WINDOW_TEXT) window = widget.get_window(gtk.TEXT_WINDOW_TEXT)
window.set_cursor(gdk.Cursor(self.defcursor)) window.set_cursor(gdk.Cursor(self.defcursor))
self._changed_cursor = False self._changed_cursor = False
@ -306,14 +311,14 @@ class HTMLViewer:
def leave_event(self, widget, event): def leave_event(self, widget, event):
if self._changed_cursor: if self._changed_cursor:
##print 'set cursor xterm' # print 'set cursor xterm'
window = widget.get_window(gtk.TEXT_WINDOW_TEXT) window = widget.get_window(gtk.TEXT_WINDOW_TEXT)
window.set_cursor(gdk.Cursor(self.defcursor)) window.set_cursor(gdk.Cursor(self.defcursor))
self._changed_cursor = False self._changed_cursor = False
self.statusbar.pop(0) self.statusbar.pop(0)
def anchor_event(self, tag, textview, event, iter, href): def anchor_event(self, tag, textview, event, iter, href):
#print 'anchor_event:', args # print 'anchor_event:', args
if event.type == gdk.BUTTON_PRESS and event.button == 1: if event.type == gdk.BUTTON_PRESS and event.button == 1:
self.updateHistoryXYView() self.updateHistoryXYView()
self.display(href) self.display(href)
@ -324,9 +329,8 @@ class HTMLViewer:
if gdk.keyval_name(e.keyval) == 'Escape': if gdk.keyval_name(e.keyval) == 'Escape':
self.destroy() self.destroy()
def createFontMap(self): def createFontMap(self):
try: ## if app try: # if app
default_font = self.app.getFont('sans') default_font = self.app.getFont('sans')
fixed_font = self.app.getFont('fixed') fixed_font = self.app.getFont('fixed')
except: except:
@ -335,15 +339,16 @@ class HTMLViewer:
fixed_font = ('courier', 12) fixed_font = ('courier', 12)
size = default_font[1] size = default_font[1]
sign = 1 sign = 1
if size < 0: sign = -1 if size < 0:
sign = -1
self.fontmap = { self.fontmap = {
'h1' : (default_font[0], size + 12*sign, 'bold'), 'h1': (default_font[0], size + 12*sign, 'bold'),
'h2' : (default_font[0], size + 8*sign, 'bold'), 'h2': (default_font[0], size + 8*sign, 'bold'),
'h3' : (default_font[0], size + 6*sign, 'bold'), 'h3': (default_font[0], size + 6*sign, 'bold'),
'h4' : (default_font[0], size + 4*sign, 'bold'), 'h4': (default_font[0], size + 4*sign, 'bold'),
'h5' : (default_font[0], size + 2*sign, 'bold'), 'h5': (default_font[0], size + 2*sign, 'bold'),
'h6' : (default_font[0], size + 1*sign, 'bold'), 'h6': (default_font[0], size + 1*sign, 'bold'),
'bold' : (default_font[0], size, 'bold'), 'bold': (default_font[0], size, 'bold'),
} }
for tag_name in self.fontmap.keys(): for tag_name in self.fontmap.keys():
@ -417,13 +422,13 @@ class HTMLViewer:
url = os.path.normpath(url) url = os.path.normpath(url)
return open(url, 'rb'), url return open(url, 'rb'), url
def display(self, url, add=1, relpath=1, position=(0,0)): def display(self, url, add=1, relpath=1, position=(0, 0)):
##print 'display:', url, position # print 'display:', url, position
# for some reason we have to stop the PySol demo # for some reason we have to stop the PySol demo
# (is this a multithread problem with Tkinter ?) # (is this a multithread problem with Tkinter ?)
try: try:
##self.app.game.stopDemo() # self.app.game.stopDemo()
##self.app.game._cancelDrag() # self.app.game._cancelDrag()
pass pass
except: except:
pass pass
@ -456,12 +461,15 @@ to open the following URL:
data = file.read() data = file.read()
file.close() file.close()
file = None file = None
except Exception, ex: except Exception as ex:
if file: file.close() if file:
self.errorDialog(_('Unable to service request:\n') + url + '\n\n' + str(ex)) file.close()
self.errorDialog(
_('Unable to service request:\n') + url + '\n\n' + str(ex))
return return
except: except:
if file: file.close() if file:
file.close()
self.errorDialog(_('Unable to service request:\n') + url) self.errorDialog(_('Unable to service request:\n') + url)
return return
@ -471,7 +479,7 @@ to open the following URL:
if add: if add:
self.addHistory(self.url, position=position) self.addHistory(self.url, position=position)
##print self.history.index, self.history.list # print self.history.index, self.history.list
if self.history.index > 1: if self.history.index > 1:
self.backButton.set_sensitive(True) self.backButton.set_sensitive(True)
else: else:
@ -494,8 +502,7 @@ to open the following URL:
self.parent.set_title(parser.title) self.parent.set_title(parser.title)
def addHistory(self, url, position=(0, 0)):
def addHistory(self, url, position=(0,0)):
if url not in self.visited_urls: if url not in self.visited_urls:
self.visited_urls.append(url) self.visited_urls.append(url)
if self.history.index > 0: if self.history.index > 0:
@ -503,7 +510,7 @@ to open the following URL:
if u == url: if u == url:
self.updateHistoryXYView() self.updateHistoryXYView()
return return
del self.history.list[self.history.index : ] del self.history.list[self.history.index:]
self.history.list.append((url, position)) self.history.list.append((url, position))
self.history.index = self.history.index + 1 self.history.index = self.history.index + 1
@ -533,9 +540,10 @@ to open the following URL:
self.display(self.home, relpath=0) self.display(self.home, relpath=0)
def errorDialog(self, msg): def errorDialog(self, msg):
d = MfxMessageDialog(self.parent, title=TITLE+' HTML Problem', MfxMessageDialog(
text=msg, bitmap='warning', self.parent, title=TITLE+' HTML Problem',
strings=(_('&OK'),), default=0) text=msg, bitmap='warning',
strings=(_('&OK'),), default=0)
def getImage(self, fn): def getImage(self, fn):
if fn in self.images: if fn in self.images:
@ -555,7 +563,6 @@ to open the following URL:
self.textbuffer.insert_pixbuf(iter, img) self.textbuffer.insert_pixbuf(iter, img)
# ************************************************************************ # ************************************************************************
# * # *
# ************************************************************************ # ************************************************************************
@ -578,7 +585,6 @@ def tkhtml_main(args):
gtk.main() gtk.main()
return 0 return 0
if __name__ == '__main__': if __name__ == '__main__':
sys.exit(tkhtml_main(sys.argv)) sys.exit(tkhtml_main(sys.argv))

View file

@ -10,7 +10,7 @@ use String::ShellQuote qw/ shell_quote /;
# my $cmd = shell_quote( 'flake8', '.' ); # my $cmd = shell_quote( 'flake8', '.' );
my $cmd = shell_quote( 'flake8', my $cmd = shell_quote( 'flake8',
grep { not($_ eq './pysollib/pysoltk.py') } glob('./pysollib/*.py ./pysollib/[cm]*/*.py ./pysollib/pysolgtk/{[a-s]*,t[a-i]*,tkc*}.py') ); grep { not($_ eq './pysollib/pysoltk.py') } glob('./pysollib/*.py ./pysollib/[cm]*/*.py ./pysollib/pysolgtk/{[a-s]*,t[a-i]*,tk[a-h]*}.py') );
# TEST # TEST
eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." ); eq_or_diff( scalar(`$cmd`), '', "flake8 is happy with the code." );