%PDF- %PDF-
Direktori : /proc/thread-self/root/usr/lib/calibre/calibre/gui2/tweak_book/diff/ |
Current File : //proc/thread-self/root/usr/lib/calibre/calibre/gui2/tweak_book/diff/highlight.py |
#!/usr/bin/env python3 __license__ = 'GPL v3' __copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>' import os from qt.core import QTextDocument, QTextCursor, QPlainTextDocumentLayout from calibre.gui2.tweak_book import tprefs from calibre.gui2.tweak_book.editor.text import get_highlighter as calibre_highlighter, SyntaxHighlighter from calibre.gui2.tweak_book.editor.themes import get_theme, highlight_to_char_format from calibre.gui2.tweak_book.editor.syntax.utils import format_for_pygments_token, NULL_FMT from polyglot.builtins import iteritems class QtHighlighter(QTextDocument): def __init__(self, parent, text, hlclass): QTextDocument.__init__(self, parent) self.l = QPlainTextDocumentLayout(self) self.setDocumentLayout(self.l) self.highlighter = hlclass() self.highlighter.apply_theme(get_theme(tprefs['editor_theme'])) self.highlighter.set_document(self) self.setPlainText(text) def copy_lines(self, lo, hi, cursor): ''' Copy specified lines from the syntax highlighted buffer into the destination cursor, preserving all formatting created by the syntax highlighter. ''' self.highlighter.join() num = hi - lo if num > 0: block = self.findBlockByNumber(lo) while num > 0: num -= 1 cursor.insertText(block.text()) dest_block = cursor.block() c = QTextCursor(dest_block) try: afs = block.layout().additionalFormats() except AttributeError: afs = () for af in afs: start = dest_block.position() + af.start c.setPosition(start), c.setPosition(start + af.length, QTextCursor.MoveMode.KeepAnchor) c.setCharFormat(af.format) cursor.insertBlock() cursor.setCharFormat(NULL_FMT) block = block.next() class NullHighlighter: def __init__(self, text): self.lines = text.splitlines() def copy_lines(self, lo, hi, cursor): for i in range(lo, hi): cursor.insertText(self.lines[i]) cursor.insertBlock() def pygments_lexer(filename): try: from pygments.lexers import get_lexer_for_filename from pygments.util import ClassNotFound except ImportError: return None glff = lambda n: get_lexer_for_filename(n, stripnl=False) try: return glff(filename) except ClassNotFound: if filename.lower().endswith('.recipe'): return glff('a.py') return None class PygmentsHighlighter: def __init__(self, text, lexer): theme, cache = get_theme(tprefs['editor_theme']), {} theme = {k:highlight_to_char_format(v) for k, v in iteritems(theme)} theme[None] = NULL_FMT def fmt(token): return format_for_pygments_token(theme, cache, token) from pygments import lex lines = self.lines = [[]] current_line = lines[0] for token, val in lex(text, lexer): for v in val.splitlines(True): current_line.append((fmt(token), v)) if v[-1] in '\n\r': lines.append([]) current_line = lines[-1] continue def copy_lines(self, lo, hi, cursor): for i in range(lo, hi): for fmt, text in self.lines[i]: cursor.insertText(text, fmt) cursor.setCharFormat(NULL_FMT) def get_highlighter(parent, text, syntax): hlclass = calibre_highlighter(syntax) if hlclass is SyntaxHighlighter: filename = os.path.basename(parent.headers[-1][1]) lexer = pygments_lexer(filename) if lexer is None: return NullHighlighter(text) return PygmentsHighlighter(text, lexer) return QtHighlighter(parent, text, hlclass)