# -*- coding: utf-8 -*- """ python-part of PygmentsHighlighter code/ideas taken from IPython, but IPython doesn't work with PythonQt... Authors: "Melven Zoellner" """ # allow to import pygments-stuff from current path import sys from __main__ import PYMODULES sys.path.append(PYMODULES+'/pygments/') sys.path.insert(0,PYMODULES) # Third-party imports import pygments from pygments.lexers import PythonLexer from pygments.formatters import HtmlFormatter # PythonQt imports from PythonQt import QtGui class PygmentsHighlighter(object): """ highlight python code with a QSyntaxHighlighter, callable class (e.g. function with a state) to """ def __init__(self): """ constructor """ self._lexer = PythonLexer() self._formatter = HtmlFormatter() self._document = QtGui.QTextDocument() self._document.setDefaultStyleSheet(self._formatter.get_style_defs()) self._format_cache = dict() def __call__(self, code): """ makes this class callable, actually do the highlightning """ index = 0 for token, text in self._lexer.get_tokens(code): length = len(text) char_format = self._get_format(token) pygmentsHighlighter._setFormat(index, length, char_format) index += length def _get_format(self, token): """ get the QTextCharFormat for a token """ if token in self._format_cache: return self._format_cache[token] # get format from document code, html = self._formatter._format_lines([(token, u'dummy')]).next() self._document.setHtml(html) char_format = QtGui.QTextCursor(self._document).charFormat() # cache result self._format_cache[token] = char_format return char_format # create class instance, can be called with highlightCode(code) highlightCode = PygmentsHighlighter()