<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Better QPlainTextEdit With Line Numbers</title>
	<atom:link href="http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/feed/" rel="self" type="application/rss+xml" />
	<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/</link>
	<description>My little blog</description>
	<lastBuildDate>Mon, 09 Aug 2010 13:21:43 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<item>
		<title>By: Serge</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-222</link>
		<dc:creator>Serge</dc:creator>
		<pubDate>Mon, 09 Aug 2010 13:21:43 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-222</guid>
		<description>Could someone please convert this to C++?</description>
		<content:encoded><![CDATA[<p>Could someone please convert this to C++?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: iharob</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-164</link>
		<dc:creator>iharob</dc:creator>
		<pubDate>Sat, 26 Jun 2010 15:41:07 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-164</guid>
		<description>This one is OK!!! but it&#039;s kind of slow when there are  several brackets in the same block... if you get a better idea ill be grateful... This implementation of QTextBlockUserData is actually from the QtQuarterly. As you see, the key bindings for compiling a document, opening, saving and stuff, are already defined by an event filter but the only emit signals and do nothing else.</description>
		<content:encoded><![CDATA[<p>This one is OK!!! but it&#8217;s kind of slow when there are  several brackets in the same block&#8230; if you get a better idea ill be grateful&#8230; This implementation of QTextBlockUserData is actually from the QtQuarterly. As you see, the key bindings for compiling a document, opening, saving and stuff, are already defined by an event filter but the only emit signals and do nothing else.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: iharob</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-163</link>
		<dc:creator>iharob</dc:creator>
		<pubDate>Sat, 26 Jun 2010 15:36:53 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-163</guid>
		<description>&lt;pre lang=&quot;python&quot;&gt;
from PyQt4.QtGui import QPlainTextEdit, QWidget, QVBoxLayout, QApplication, \
                        QFileDialog, QMessageBox, QTextBrowser, QDockWidget, \
                        QMainWindow, QIcon, QHBoxLayout, QPainter, QGraphicsWidget, \
                        QFontMetrics, QFrame, QTextEdit, QTextFormat, \
                        QTextBlockUserData, QColor, QFont, QTextCursor, \
                        QSyntaxHighlighter, QTextCharFormat
from PyQt4.QtCore import QString, SIGNAL as SIG, Qt, QEvent, QVariant,\
                         QRect, QRegExp, QThread
import sys, os, re
from subprocess import Popen, PIPE

NUMBER_BAR_COLOR = QColor(180, 215, 140)

BRACKET_MATCHED = QColor(&#039;blue&#039;)
BRACKET_UNMATCHED = QColor(&#039;red&#039;)

CURRENT_LINE_HL  = QColor(200, 205, 0, 70)

class BracketsInfo:
    def __init__(self, character, position):
        self.character = character
        self.position  = position

class TextBlockData(QTextBlockUserData):
    def __init__(self, parent = None):
        super(TextBlockData, self).__init__()
        self.braces = []
        self.valid = False

    def insert_brackets_info(self, info):
        self.valid = True
        self.braces.append(info)

    def isValid(self):
        return self.valid

class LaTeX(QSyntaxHighlighter):
    command = QRegExp(r&#039;\\(\w+)?&#039;)
    cmd_fmt = QTextCharFormat()
    cmd_fmt.setForeground(QColor(&#039;darkRed&#039;))

    comment = QRegExp(r&#039;%(.*)?&#039;)
    cmnt_fmt = QTextCharFormat()
    cmnt_fmt.setForeground(QColor(&#039;gray&#039;))
    
    keywords = QRegExp(r&#039;\\begin&#124;\\end&#124;\\label&#124;\\ref&#124;\\(sub)?(sub)?section&#039;)
    keyword_fmt = QTextCharFormat()
    keyword_fmt.setForeground(QColor(&#039;red&#039;))

    rules = [(command, cmd_fmt),
             (comment, cmnt_fmt),
             (keywords, keyword_fmt)]

    def __init__(self, parent):
        super(LaTeX, self).__init__(parent)

    def highlightBlock(self, text):
        braces = QRegExp(&#039;(\{&#124;\}&#124;\(&#124;\)&#124;\[&#124;\])&#039;)
        math_delimiters = QRegExp(r&#039;(\\begin{equation\*?}&#124;&#039; +\
                                   r&#039;\\begin{align\*?}&#124;&#039; +\
                                   r&#039;\\begin{displaymath\*?})&#039;)
        begin_end = QRegExp(r&#039;(\\begin{&#124;\\end{&#124;\\ref&#124;\\label)&#039;)
        block_data = TextBlockData()

        index = braces.indexIn(text)
      
        while index &gt;= 0:
            matched_brace = str(braces.capturedTexts()[0])
            info = BracketsInfo(matched_brace, index)
            block_data.insert_brackets_info(info)
            index = braces.indexIn(text, index + 1)

        self.setCurrentBlockUserData(block_data)

        for regex, fmt in LaTeX.rules:
            start = regex.indexIn(text, 0)
            while start &gt;= 0:
                length = regex.matchedLength()
                self.setFormat(start, length, fmt)
                start = regex.indexIn(text, start + length)

        self.setCurrentBlockState(0)

class NumberBar(QWidget):
    def __init__(self, parent = None):
        super(NumberBar, self).__init__(parent)
        self.edit = parent
        layout = QVBoxLayout()
        self.setLayout(layout)
        self.edit.blockCountChanged.connect(self.update_width)
        self.edit.updateRequest.connect(self.update_on_scroll)
        self.update_width(&#039;1&#039;)

    def update_on_scroll(self, rect, scroll):
        if self.isVisible():
            if scroll:
                self.scroll(0, scroll)
            else:
                self.update()

    def update_width(self, string):
        width = self.fontMetrics().width(unicode(string)) + 20
        if self.width() != width:
            self.setFixedWidth(width)

    def paintEvent(self, event):
        if self.isVisible():
            block = self.edit.firstVisibleBlock()
            height = self.fontMetrics().height()
            number = block.blockNumber()
            painter = QPainter(self)
            painter.fillRect(event.rect(), NUMBER_BAR_COLOR)
            font = painter.font()

            current_block = self.edit.textCursor().block().blockNumber() + 1

            condition = True
            while block.isValid() and condition:
                block_geometry = self.edit.blockBoundingGeometry(block)
                offset = self.edit.contentOffset()
                block_top = block_geometry.translated(offset).top()
                number += 1

                rect = QRect(0, block_top, self.width() - 5, height)

                if number == current_block:
                    font.setBold(True)
                else:
                    font.setBold(False)

                painter.setFont(font)
                painter.drawText(rect, Qt.AlignRight, &#039;%i&#039;%number)

                if block_top &gt; event.rect().bottom():
                    condition = False

                block = block.next()

            painter.end()

class QLaTeXEdit(QWidget):
    def __init__(self, parent = None):
        super(QLaTeXEdit, self).__init__(parent)
        # Editor Widget ...
        self.edit = QPlainTextEdit()
        self.edit.setFrameStyle(QFrame.NoFrame)
        self.extra_selections = []
        # Line Numbers ...
        self.numbers = NumberBar(self.edit)
        # Syntax Highlighter ...
        self.highlighter = LaTeX(self.edit.document())

        # Laying out...
        layout = QHBoxLayout()
        layout.setSpacing(1.5)
        layout.addWidget(self.numbers)
        layout.addWidget(self.edit)
        self.setLayout(layout)
        # Event Filter ...
        self.installEventFilter(self)
        self.edit.cursorPositionChanged.connect(self.check_brackets)
        
        # Brackets ExtraSelection ...
        self.left_selected_bracket  = QTextEdit.ExtraSelection()
        self.right_selected_bracket = QTextEdit.ExtraSelection()

    def set_numbers_visible(self, value = True):
        self.numbers.setVisible(False)

    def match_left(self, block, character, start, found):
        map = {&#039;{&#039;: &#039;}&#039;, &#039;(&#039;: &#039;)&#039;, &#039;[&#039;: &#039;]&#039;}

        while block.isValid():
            data = block.userData()
            if data is not None:
                braces = data.braces
                N = len(braces)

                for k in range(start, N):
                    if braces[k].character == character:
                        found += 1

                    if braces[k].character == map[character]:
                        if not found:
                            return braces[k].position + block.position()
                        else:
                            found -= 1

                block = block.next()
                start = 0

    def match_right(self, block, character, start, found):
        map = {&#039;}&#039;: &#039;{&#039;, &#039;)&#039;: &#039;(&#039;, &#039;]&#039;: &#039;[&#039;}
        
        while block.isValid():
            data = block.userData()

            if data is not None:
                braces = data.braces
                
                if start is None:
                    start = len(braces)
                for k in range(start - 1, -1, -1):
                    if braces[k].character == character:
                        found += 1
                    if braces[k].character == map[character]:
                        if found == 0:
                            return braces[k].position + block.position()
                        else:
                            found -= 1
            block = block.previous()
            start = None

    def check_brackets(self):
        left, right = QTextEdit.ExtraSelection(),\
                      QTextEdit.ExtraSelection()

        cursor = self.edit.textCursor()
        block = cursor.block()
        data = block.userData()
        previous, next = None, None

        if data is not None:
            position = cursor.position()
            block_position = cursor.block().position()
            braces = data.braces
            N = len(braces)

            for k in range(0, N):
                if braces[k].position == position - block_position or\
                   braces[k].position == position - block_position - 1:
                    previous = braces[k].position + block_position
                    if braces[k].character in [&#039;{&#039;, &#039;(&#039;, &#039;[&#039;]:
                        next = self.match_left(block,
                                               braces[k].character,
                                               k + 1, 0)
                    elif braces[k].character in [&#039;}&#039;, &#039;)&#039;, &#039;]&#039;]:
                        next = self.match_right(block,
                                                braces[k].character,
                                                k, 0)
                    if next is None:
                        next = -1

        if next is not None and next &gt; 0:
            if next = 0 and next &gt;= 0:
            format = QTextCharFormat()

            cursor.setPosition(previous)
            cursor.movePosition(QTextCursor.NextCharacter,
                                QTextCursor.KeepAnchor)
            
            format.setForeground(BRACKET_MATCHED)
            format.setBackground(QColor(&#039;white&#039;))
            self.left_selected_bracket.format = format
            self.left_selected_bracket.cursor = cursor

            cursor.setPosition(next)
            cursor.movePosition(QTextCursor.NextCharacter,
                                QTextCursor.KeepAnchor)
            
            format.setForeground(BRACKET_MATCHED)
            format.setBackground(QColor(&#039;white&#039;))
            self.right_selected_bracket.format = format
            self.right_selected_bracket.cursor = cursor

    def paintEvent(self, event):
        highlighted_line = QTextEdit.ExtraSelection()
        highlighted_line.format.setBackground(CURRENT_LINE_HL)
        highlighted_line.format.setProperty(QTextFormat\
                                                 .FullWidthSelection,
                                                  QVariant(True))
        highlighted_line.cursor = self.edit.textCursor()
        highlighted_line.cursor.clearSelection()
        self.edit.setExtraSelections([highlighted_line,
                                      self.left_selected_bracket,
                                      self.right_selected_bracket])

    def document(self):
        return self.edit.document

    def getPlainText(self):
        return unicode(self.edit.toPlainText())

    def isModified(self):
        return self.edit.document().isModified()

    def setModified(self, modified):
        self.edit.document().setModified(modified)

    def setLineWrapMode(self, mode):
        self.edit.setLineWrapMode(mode)

    def clear(self):
        self.edit.clear()

    def setPlainText(self, *args, **kwargs):
        self.edit.setPlainText(*args, **kwargs)

    def setDocumentTitle(self, *args, **kwargs):
        self.edit.setDocumentTitle(*args, **kwargs)

    def eventFilter(self, object, event):
        if event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Return:
                QPlainTextEdit.event(self, event)
                print &#039;return pressed&#039;
                return True
            if event.key() == Qt.Key_F6:
                self.emit(SIG(&#039;pdflatex&#039;))
                return True
            if event.key() == Qt.Key_F7:
                self.emit(SIG(&#039;pdfshow&#039;))
                return True
            if event.key() == Qt.Key_S and\
               event.modifiers() == Qt.ControlModifier:
                self.emit(SIG(&#039;save_document&#039;))
                return True
            if event.key() == Qt.Key_O and\
               event.modifiers() == Qt.ControlModifier:
                self.emit(SIG(&#039;open_document&#039;))
                return True
            if event.key() == Qt.Key_N and\
               event.modifiers() == Qt.ControlModifier:
                self.emit(SIG(&#039;new_document&#039;))
                return True
            if event.key() == Qt.Key_W and\
               event.modifiers() == Qt.ControlModifier:
                self.emit(SIG(&#039;close_document&#039;))
                return True
            else:
                return False
        return False

    def set_number_bar_visible(self, value):
        self.numbers.setVisible(value)

if __name__ == &#039;__main__&#039;:
    app = QApplication(sys.argv)
    win = QLaTeXEdit()
    win.show()
    app.exec_()
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtGui</span> <span style="color: #ff7700;font-weight:bold;">import</span> QPlainTextEdit, QWidget, QVBoxLayout, QApplication, \
                        QFileDialog, QMessageBox, QTextBrowser, QDockWidget, \
                        QMainWindow, QIcon, QHBoxLayout, QPainter, QGraphicsWidget, \
                        QFontMetrics, QFrame, QTextEdit, QTextFormat, \
                        QTextBlockUserData, QColor, QFont, QTextCursor, \
                        QSyntaxHighlighter, QTextCharFormat
<span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtCore</span> <span style="color: #ff7700;font-weight:bold;">import</span> QString, SIGNAL <span style="color: #ff7700;font-weight:bold;">as</span> SIG, Qt, QEvent, QVariant,\
                         QRect, QRegExp, QThread
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">re</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">subprocess</span> <span style="color: #ff7700;font-weight:bold;">import</span> Popen, PIPE
&nbsp;
NUMBER_BAR_COLOR = QColor<span style="color: black;">&#40;</span><span style="color: #ff4500;">180</span>, <span style="color: #ff4500;">215</span>, <span style="color: #ff4500;">140</span><span style="color: black;">&#41;</span>
&nbsp;
BRACKET_MATCHED = QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'blue'</span><span style="color: black;">&#41;</span>
BRACKET_UNMATCHED = QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'red'</span><span style="color: black;">&#41;</span>
&nbsp;
CURRENT_LINE_HL  = QColor<span style="color: black;">&#40;</span><span style="color: #ff4500;">200</span>, <span style="color: #ff4500;">205</span>, <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">70</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> BracketsInfo:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, character, position<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">character</span> = character
        <span style="color: #008000;">self</span>.<span style="color: black;">position</span>  = position
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> TextBlockData<span style="color: black;">&#40;</span>QTextBlockUserData<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>TextBlockData, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">braces</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">valid</span> = <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> insert_brackets_info<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, info<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">valid</span> = <span style="color: #008000;">True</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">braces</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span>info<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> isValid<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">valid</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> LaTeX<span style="color: black;">&#40;</span>QSyntaxHighlighter<span style="color: black;">&#41;</span>:
    command = QRegExp<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>(<span style="color: #000099; font-weight: bold;">\w</span>+)?'</span><span style="color: black;">&#41;</span>
    cmd_fmt = QTextCharFormat<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    cmd_fmt.<span style="color: black;">setForeground</span><span style="color: black;">&#40;</span>QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'darkRed'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    comment = QRegExp<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'%(.*)?'</span><span style="color: black;">&#41;</span>
    cmnt_fmt = QTextCharFormat<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    cmnt_fmt.<span style="color: black;">setForeground</span><span style="color: black;">&#40;</span>QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'gray'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    keywords = QRegExp<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>begin|<span style="color: #000099; font-weight: bold;">\\</span>end|<span style="color: #000099; font-weight: bold;">\\</span>label|<span style="color: #000099; font-weight: bold;">\\</span>ref|<span style="color: #000099; font-weight: bold;">\\</span>(sub)?(sub)?section'</span><span style="color: black;">&#41;</span>
    keyword_fmt = QTextCharFormat<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    keyword_fmt.<span style="color: black;">setForeground</span><span style="color: black;">&#40;</span>QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'red'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    rules = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>command, cmd_fmt<span style="color: black;">&#41;</span>,
             <span style="color: black;">&#40;</span>comment, cmnt_fmt<span style="color: black;">&#41;</span>,
             <span style="color: black;">&#40;</span>keywords, keyword_fmt<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>LaTeX, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span>parent<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> highlightBlock<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, text<span style="color: black;">&#41;</span>:
        braces = QRegExp<span style="color: black;">&#40;</span><span style="color: #483d8b;">'(<span style="color: #000099; font-weight: bold;">\{</span>|<span style="color: #000099; font-weight: bold;">\}</span>|<span style="color: #000099; font-weight: bold;">\(</span>|<span style="color: #000099; font-weight: bold;">\)</span>|<span style="color: #000099; font-weight: bold;">\[</span>|<span style="color: #000099; font-weight: bold;">\]</span>)'</span><span style="color: black;">&#41;</span>
        math_delimiters = QRegExp<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'(<span style="color: #000099; font-weight: bold;">\\</span>begin{equation<span style="color: #000099; font-weight: bold;">\*</span>?}|'</span> +\
                                   r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>begin{align<span style="color: #000099; font-weight: bold;">\*</span>?}|'</span> +\
                                   r<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>begin{displaymath<span style="color: #000099; font-weight: bold;">\*</span>?})'</span><span style="color: black;">&#41;</span>
        begin_end = QRegExp<span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'(<span style="color: #000099; font-weight: bold;">\\</span>begin{|<span style="color: #000099; font-weight: bold;">\\</span>end{|<span style="color: #000099; font-weight: bold;">\\</span>ref|<span style="color: #000099; font-weight: bold;">\\</span>label)'</span><span style="color: black;">&#41;</span>
        block_data = TextBlockData<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        index = braces.<span style="color: black;">indexIn</span><span style="color: black;">&#40;</span>text<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> index <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span>= <span style="color: #ff4500;">0</span>:
            matched_brace = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>braces.<span style="color: black;">capturedTexts</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
            info = BracketsInfo<span style="color: black;">&#40;</span>matched_brace, index<span style="color: black;">&#41;</span>
            block_data.<span style="color: black;">insert_brackets_info</span><span style="color: black;">&#40;</span>info<span style="color: black;">&#41;</span>
            index = braces.<span style="color: black;">indexIn</span><span style="color: black;">&#40;</span>text, index + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">setCurrentBlockUserData</span><span style="color: black;">&#40;</span>block_data<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> regex, fmt <span style="color: #ff7700;font-weight:bold;">in</span> LaTeX.<span style="color: black;">rules</span>:
            start = regex.<span style="color: black;">indexIn</span><span style="color: black;">&#40;</span>text, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">while</span> start <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span>= <span style="color: #ff4500;">0</span>:
                length = regex.<span style="color: black;">matchedLength</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">setFormat</span><span style="color: black;">&#40;</span>start, length, fmt<span style="color: black;">&#41;</span>
                start = regex.<span style="color: black;">indexIn</span><span style="color: black;">&#40;</span>text, start + length<span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">setCurrentBlockState</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> NumberBar<span style="color: black;">&#40;</span>QWidget<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>NumberBar, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span>parent<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span> = parent
        layout = QVBoxLayout<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">setLayout</span><span style="color: black;">&#40;</span>layout<span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">blockCountChanged</span>.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">update_width</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">updateRequest</span>.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">update_on_scroll</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">update_width</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> update_on_scroll<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, rect, scroll<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">isVisible</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> scroll:
                <span style="color: #008000;">self</span>.<span style="color: black;">scroll</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, scroll<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">update</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> update_width<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span>:
        width = <span style="color: #008000;">self</span>.<span style="color: black;">fontMetrics</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">width</span><span style="color: black;">&#40;</span><span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">string</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">20</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">width</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= width:
            <span style="color: #008000;">self</span>.<span style="color: black;">setFixedWidth</span><span style="color: black;">&#40;</span>width<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> paintEvent<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">isVisible</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            block = <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">firstVisibleBlock</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            height = <span style="color: #008000;">self</span>.<span style="color: black;">fontMetrics</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">height</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            number = block.<span style="color: black;">blockNumber</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            painter = QPainter<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
            painter.<span style="color: black;">fillRect</span><span style="color: black;">&#40;</span>event.<span style="color: black;">rect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, NUMBER_BAR_COLOR<span style="color: black;">&#41;</span>
            font = painter.<span style="color: black;">font</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            current_block = <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">textCursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">block</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">blockNumber</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">1</span>
&nbsp;
            condition = <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">while</span> block.<span style="color: black;">isValid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> condition:
                block_geometry = <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">blockBoundingGeometry</span><span style="color: black;">&#40;</span>block<span style="color: black;">&#41;</span>
                offset = <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">contentOffset</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                block_top = block_geometry.<span style="color: black;">translated</span><span style="color: black;">&#40;</span>offset<span style="color: black;">&#41;</span>.<span style="color: black;">top</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                number += <span style="color: #ff4500;">1</span>
&nbsp;
                rect = QRect<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, block_top, <span style="color: #008000;">self</span>.<span style="color: black;">width</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">5</span>, height<span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> number == current_block:
                    font.<span style="color: black;">setBold</span><span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                    font.<span style="color: black;">setBold</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
&nbsp;
                painter.<span style="color: black;">setFont</span><span style="color: black;">&#40;</span>font<span style="color: black;">&#41;</span>
                painter.<span style="color: black;">drawText</span><span style="color: black;">&#40;</span>rect, Qt.<span style="color: black;">AlignRight</span>, <span style="color: #483d8b;">'%i'</span><span style="color: #66cc66;">%</span>number<span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> block_top <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span> event.<span style="color: black;">rect</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">bottom</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                    condition = <span style="color: #008000;">False</span>
&nbsp;
                block = block.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            painter.<span style="color: black;">end</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> QLaTeXEdit<span style="color: black;">&#40;</span>QWidget<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, parent = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">super</span><span style="color: black;">&#40;</span>QLaTeXEdit, <span style="color: #008000;">self</span><span style="color: black;">&#41;</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span>parent<span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># Editor Widget ...</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span> = QPlainTextEdit<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">setFrameStyle</span><span style="color: black;">&#40;</span>QFrame.<span style="color: black;">NoFrame</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">extra_selections</span> = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #808080; font-style: italic;"># Line Numbers ...</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">numbers</span> = NumberBar<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">edit</span><span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># Syntax Highlighter ...</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">highlighter</span> = LaTeX<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">document</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Laying out...</span>
        layout = QHBoxLayout<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        layout.<span style="color: black;">setSpacing</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1.5</span><span style="color: black;">&#41;</span>
        layout.<span style="color: black;">addWidget</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">numbers</span><span style="color: black;">&#41;</span>
        layout.<span style="color: black;">addWidget</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">edit</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">setLayout</span><span style="color: black;">&#40;</span>layout<span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># Event Filter ...</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">installEventFilter</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">cursorPositionChanged</span>.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">check_brackets</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Brackets ExtraSelection ...</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">left_selected_bracket</span>  = QTextEdit.<span style="color: black;">ExtraSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">right_selected_bracket</span> = QTextEdit.<span style="color: black;">ExtraSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_numbers_visible<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value = <span style="color: #008000;">True</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">numbers</span>.<span style="color: black;">setVisible</span><span style="color: black;">&#40;</span><span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> match_left<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, block, character, start, found<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">map</span> = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'{'</span>: <span style="color: #483d8b;">'}'</span>, <span style="color: #483d8b;">'('</span>: <span style="color: #483d8b;">')'</span>, <span style="color: #483d8b;">'['</span>: <span style="color: #483d8b;">']'</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> block.<span style="color: black;">isValid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            data = block.<span style="color: black;">userData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> data <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
                braces = data.<span style="color: black;">braces</span>
                N = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>braces<span style="color: black;">&#41;</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">for</span> k <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>start, N<span style="color: black;">&#41;</span>:
                    <span style="color: #ff7700;font-weight:bold;">if</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span> == character:
                        found += <span style="color: #ff4500;">1</span>
&nbsp;
                    <span style="color: #ff7700;font-weight:bold;">if</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span> == <span style="color: #008000;">map</span><span style="color: black;">&#91;</span>character<span style="color: black;">&#93;</span>:
                        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> found:
                            <span style="color: #ff7700;font-weight:bold;">return</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">position</span> + block.<span style="color: black;">position</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                        <span style="color: #ff7700;font-weight:bold;">else</span>:
                            found -= <span style="color: #ff4500;">1</span>
&nbsp;
                block = block.<span style="color: black;">next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                start = <span style="color: #ff4500;">0</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> match_right<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, block, character, start, found<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">map</span> = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'}'</span>: <span style="color: #483d8b;">'{'</span>, <span style="color: #483d8b;">')'</span>: <span style="color: #483d8b;">'('</span>, <span style="color: #483d8b;">']'</span>: <span style="color: #483d8b;">'['</span><span style="color: black;">&#125;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">while</span> block.<span style="color: black;">isValid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            data = block.<span style="color: black;">userData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">if</span> data <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
                braces = data.<span style="color: black;">braces</span>
&nbsp;
                <span style="color: #ff7700;font-weight:bold;">if</span> start <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                    start = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>braces<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">for</span> k <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>start - <span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
                    <span style="color: #ff7700;font-weight:bold;">if</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span> == character:
                        found += <span style="color: #ff4500;">1</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span> == <span style="color: #008000;">map</span><span style="color: black;">&#91;</span>character<span style="color: black;">&#93;</span>:
                        <span style="color: #ff7700;font-weight:bold;">if</span> found == <span style="color: #ff4500;">0</span>:
                            <span style="color: #ff7700;font-weight:bold;">return</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">position</span> + block.<span style="color: black;">position</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                        <span style="color: #ff7700;font-weight:bold;">else</span>:
                            found -= <span style="color: #ff4500;">1</span>
            block = block.<span style="color: black;">previous</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            start = <span style="color: #008000;">None</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> check_brackets<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        left, right = QTextEdit.<span style="color: black;">ExtraSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,\
                      QTextEdit.<span style="color: black;">ExtraSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        cursor = <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">textCursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        block = cursor.<span style="color: black;">block</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        data = block.<span style="color: black;">userData</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        previous, next = <span style="color: #008000;">None</span>, <span style="color: #008000;">None</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> data <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span>:
            position = cursor.<span style="color: black;">position</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            block_position = cursor.<span style="color: black;">block</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">position</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            braces = data.<span style="color: black;">braces</span>
            N = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>braces<span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #ff7700;font-weight:bold;">for</span> k <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, N<span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">position</span> == position - block_position <span style="color: #ff7700;font-weight:bold;">or</span>\
                   braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">position</span> == position - block_position - <span style="color: #ff4500;">1</span>:
                    previous = braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">position</span> + block_position
                    <span style="color: #ff7700;font-weight:bold;">if</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'{'</span>, <span style="color: #483d8b;">'('</span>, <span style="color: #483d8b;">'['</span><span style="color: black;">&#93;</span>:
                        next = <span style="color: #008000;">self</span>.<span style="color: black;">match_left</span><span style="color: black;">&#40;</span>block,
                                               braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span>,
                                               k + <span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
                    <span style="color: #ff7700;font-weight:bold;">elif</span> braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'}'</span>, <span style="color: #483d8b;">')'</span>, <span style="color: #483d8b;">']'</span><span style="color: black;">&#93;</span>:
                        next = <span style="color: #008000;">self</span>.<span style="color: black;">match_right</span><span style="color: black;">&#40;</span>block,
                                                braces<span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span>.<span style="color: black;">character</span>,
                                                k, <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
                    <span style="color: #ff7700;font-weight:bold;">if</span> next <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #008000;">None</span>:
                        next = -<span style="color: #ff4500;">1</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> next <span style="color: #ff7700;font-weight:bold;">is</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">and</span> next <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span> <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> next = <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> next <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span>= <span style="color: #ff4500;">0</span>:
            format = QTextCharFormat<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            cursor.<span style="color: black;">setPosition</span><span style="color: black;">&#40;</span>previous<span style="color: black;">&#41;</span>
            cursor.<span style="color: black;">movePosition</span><span style="color: black;">&#40;</span>QTextCursor.<span style="color: black;">NextCharacter</span>,
                                QTextCursor.<span style="color: black;">KeepAnchor</span><span style="color: black;">&#41;</span>
&nbsp;
            format.<span style="color: black;">setForeground</span><span style="color: black;">&#40;</span>BRACKET_MATCHED<span style="color: black;">&#41;</span>
            format.<span style="color: black;">setBackground</span><span style="color: black;">&#40;</span>QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'white'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">left_selected_bracket</span>.<span style="color: black;">format</span> = format
            <span style="color: #008000;">self</span>.<span style="color: black;">left_selected_bracket</span>.<span style="color: black;">cursor</span> = cursor
&nbsp;
            cursor.<span style="color: black;">setPosition</span><span style="color: black;">&#40;</span>next<span style="color: black;">&#41;</span>
            cursor.<span style="color: black;">movePosition</span><span style="color: black;">&#40;</span>QTextCursor.<span style="color: black;">NextCharacter</span>,
                                QTextCursor.<span style="color: black;">KeepAnchor</span><span style="color: black;">&#41;</span>
&nbsp;
            format.<span style="color: black;">setForeground</span><span style="color: black;">&#40;</span>BRACKET_MATCHED<span style="color: black;">&#41;</span>
            format.<span style="color: black;">setBackground</span><span style="color: black;">&#40;</span>QColor<span style="color: black;">&#40;</span><span style="color: #483d8b;">'white'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            <span style="color: #008000;">self</span>.<span style="color: black;">right_selected_bracket</span>.<span style="color: black;">format</span> = format
            <span style="color: #008000;">self</span>.<span style="color: black;">right_selected_bracket</span>.<span style="color: black;">cursor</span> = cursor
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> paintEvent<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        highlighted_line = QTextEdit.<span style="color: black;">ExtraSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        highlighted_line.<span style="color: black;">format</span>.<span style="color: black;">setBackground</span><span style="color: black;">&#40;</span>CURRENT_LINE_HL<span style="color: black;">&#41;</span>
        highlighted_line.<span style="color: black;">format</span>.<span style="color: black;">setProperty</span><span style="color: black;">&#40;</span>QTextFormat\
                                                 .<span style="color: black;">FullWidthSelection</span>,
                                                  QVariant<span style="color: black;">&#40;</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        highlighted_line.<span style="color: black;">cursor</span> = <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">textCursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        highlighted_line.<span style="color: black;">cursor</span>.<span style="color: black;">clearSelection</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">setExtraSelections</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>highlighted_line,
                                      <span style="color: #008000;">self</span>.<span style="color: black;">left_selected_bracket</span>,
                                      <span style="color: #008000;">self</span>.<span style="color: black;">right_selected_bracket</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> document<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">document</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> getPlainText<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">toPlainText</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> isModified<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">document</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">isModified</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> setModified<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, modified<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">document</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">setModified</span><span style="color: black;">&#40;</span>modified<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> setLineWrapMode<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, mode<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">setLineWrapMode</span><span style="color: black;">&#40;</span>mode<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> clear<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">clear</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> setPlainText<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">setPlainText</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> setDocumentTitle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">edit</span>.<span style="color: black;">setDocumentTitle</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>args, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> eventFilter<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, <span style="color: #008000;">object</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == QEvent.<span style="color: black;">KeyPress</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_Return</span>:
                QPlainTextEdit.<span style="color: black;">event</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'return pressed'</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_F6</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">emit</span><span style="color: black;">&#40;</span>SIG<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pdflatex'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_F7</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">emit</span><span style="color: black;">&#40;</span>SIG<span style="color: black;">&#40;</span><span style="color: #483d8b;">'pdfshow'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_S</span> <span style="color: #ff7700;font-weight:bold;">and</span>\
               event.<span style="color: black;">modifiers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">ControlModifier</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">emit</span><span style="color: black;">&#40;</span>SIG<span style="color: black;">&#40;</span><span style="color: #483d8b;">'save_document'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_O</span> <span style="color: #ff7700;font-weight:bold;">and</span>\
               event.<span style="color: black;">modifiers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">ControlModifier</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">emit</span><span style="color: black;">&#40;</span>SIG<span style="color: black;">&#40;</span><span style="color: #483d8b;">'open_document'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_N</span> <span style="color: #ff7700;font-weight:bold;">and</span>\
               event.<span style="color: black;">modifiers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">ControlModifier</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">emit</span><span style="color: black;">&#40;</span>SIG<span style="color: black;">&#40;</span><span style="color: #483d8b;">'new_document'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">key</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">Key_W</span> <span style="color: #ff7700;font-weight:bold;">and</span>\
               event.<span style="color: black;">modifiers</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == Qt.<span style="color: black;">ControlModifier</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">emit</span><span style="color: black;">&#40;</span>SIG<span style="color: black;">&#40;</span><span style="color: #483d8b;">'close_document'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">True</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> set_number_bar_visible<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, value<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">numbers</span>.<span style="color: black;">setVisible</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    app = QApplication<span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span>
    win = QLaTeXEdit<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    win.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    app.<span style="color: black;">exec_</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
	</item>
	<item>
		<title>By: iharob</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-162</link>
		<dc:creator>iharob</dc:creator>
		<pubDate>Thu, 24 Jun 2010 00:08:35 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-162</guid>
		<description>Thank you again, now for your quick reply! It might be better if you remove the code... I promise that once i finish the basic editor i&#039;ll post the code again, but i was actually too happy cause the code worked fine that didnt give my self a chance to test it... and it is not completely correct... Sorry for my bad english.</description>
		<content:encoded><![CDATA[<p>Thank you again, now for your quick reply! It might be better if you remove the code&#8230; I promise that once i finish the basic editor i&#8217;ll post the code again, but i was actually too happy cause the code worked fine that didnt give my self a chance to test it&#8230; and it is not completely correct&#8230; Sorry for my bad english.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-161</link>
		<dc:creator>John</dc:creator>
		<pubDate>Wed, 23 Jun 2010 23:02:14 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-161</guid>
		<description>&lt;pre lang=&quot;python&quot;&gt;
code...
&lt;/pre&gt;

I add it for you in the code comment.</description>
		<content:encoded><![CDATA[<p>&lt;pre lang=&#8221;python&#8221;&gt;<br />
code&#8230;<br />
&lt;/pre&gt;</p>
<p>I add it for you in the code comment.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: iharob</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-160</link>
		<dc:creator>iharob</dc:creator>
		<pubDate>Wed, 23 Jun 2010 20:20:33 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-160</guid>
		<description>sorry!!! the code has some errors! I am working on it... Id like to know how to post highlighted/indented code here!!!</description>
		<content:encoded><![CDATA[<p>sorry!!! the code has some errors! I am working on it&#8230; Id like to know how to post highlighted/indented code here!!!</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: iharob</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-159</link>
		<dc:creator>iharob</dc:creator>
		<pubDate>Wed, 23 Jun 2010 19:05:59 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-159</guid>
		<description>Thank YOU !!! This is the basis of a latex editor im trying to will ... I Added bracket matching to your code....

code removed by request of the author.</description>
		<content:encoded><![CDATA[<p>Thank YOU !!! This is the basis of a latex editor im trying to will &#8230; I Added bracket matching to your code&#8230;.</p>
<p>code removed by request of the author.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: John</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-81</link>
		<dc:creator>John</dc:creator>
		<pubDate>Mon, 17 May 2010 01:59:51 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-81</guid>
		<description>The docs do say it return a list... However, it doesn&#039;t return an indexable list. The posted code works correctly. Using hi_selection[0] will result in:

&lt;pre&gt;
TypeError: &#039;ExtraSelection&#039; object does not support indexing
&lt;/pre&gt;</description>
		<content:encoded><![CDATA[<p>The docs do say it return a list&#8230; However, it doesn&#8217;t return an indexable list. The posted code works correctly. Using hi_selection[0] will result in:</p>
<pre>
TypeError: 'ExtraSelection' object does not support indexing
</pre>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dave Berk</title>
		<link>http://john.nachtimwald.com/2009/08/19/better-qplaintextedit-with-line-numbers/comment-page-1/#comment-32</link>
		<dc:creator>Dave Berk</dc:creator>
		<pubDate>Fri, 12 Mar 2010 09:30:16 +0000</pubDate>
		<guid isPermaLink="false">http://john.nachtimwald.com/?p=195#comment-32</guid>
		<description>Hi. Thanks for the code. It is really helpful.

One question: In the highlight function, shouldn&#039;t the line 

            hi_selection.format.setBackground(self.palette().alternateBase())

be

            hi_selection[0].format.setBackground(self.palette().alternateBase())

since 

QTextEdit.ExtraSelection()

is supposed to return a QList??

Thanks</description>
		<content:encoded><![CDATA[<p>Hi. Thanks for the code. It is really helpful.</p>
<p>One question: In the highlight function, shouldn&#8217;t the line </p>
<p>            hi_selection.format.setBackground(self.palette().alternateBase())</p>
<p>be</p>
<p>            hi_selection[0].format.setBackground(self.palette().alternateBase())</p>
<p>since </p>
<p>QTextEdit.ExtraSelection()</p>
<p>is supposed to return a QList??</p>
<p>Thanks</p>
]]></content:encoded>
	</item>
</channel>
</rss>
