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