2 weeks ago
Add small item.
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 """
4 GTKPygments
5 ~~~~~~~~~~~
7 proof of concept pygments to gtk widget renderer
9 :copyright: 2007 by Armin Ronacher.
10 :license: GNU GPL.
11 """
12 import pygtk
13 pygtk.require('2.0')
14 import gtk
15 import pango
16 from pygments.lexers import PythonLexer
17 from pygments.styles.pastie import PastieStyle
20 STYLE = PastieStyle
21 f = file(__file__)
22 try:
23 SOURCE = f.read()
24 finally:
25 f.close()
28 class GTKPygments(gtk.Window):
30 def __init__(self):
31 super(GTKPygments, self).__init__()
32 self.set_title('GTK Pygments')
34 win = gtk.ScrolledWindow()
35 self.add(win)
36 self.textview = gtk.TextView()
37 win.add(self.textview)
38 buf = gtk.TextBuffer()
40 styles = {}
41 for token, value in PythonLexer().get_tokens(SOURCE):
42 while not STYLE.styles_token(token) and token.parent:
43 token = token.parent
44 if token not in styles:
45 styles[token] = buf.create_tag()
46 start = buf.get_end_iter()
47 buf.insert_with_tags(start, value.encode('utf-8'), styles[token])
49 for token, tag in styles.iteritems():
50 style = STYLE.style_for_token(token)
51 if style['bgcolor']:
52 tag.set_property('background', '#' + style['bgcolor'])
53 if style['color']:
54 tag.set_property('foreground', '#' + style['color'])
55 if style['bold']:
56 tag.set_property('weight', pango.WEIGHT_BOLD)
57 if style['italic']:
58 tag.set_property('style', pango.STYLE_ITALIC)
59 if style['underline']:
60 tag.set_property('underline', pango.UNDERLINE_SINGLE)
62 self.connect('delete-event', lambda *a: gtk.main_quit())
64 self.textview.set_buffer(buf)
65 self.textview.set_editable(False)
66 self.textview.modify_font(pango.FontDescription('monospace'))
68 self.resize(800, 500)
69 self.show_all()
71 def run(self):
72 gtk.main()
75 if __name__ == '__main__':
76 GTKPygments().run()