Baz Walter a écrit :
projetmbc wrote:
Baz Walter a écrit :
hello christophe

i expanded my earlier example to include folding. this is a complete config files lexer based on the lexer for properties files in src/LexOthers.cpp.

Thanks for this. Santa Claus exists... ;-)

I'll look at and study your code to see how to do my simple lexer.

Did you allow me to use your code in a future free tutorial on the use of QScintilla ? I'll cite your name.


your welcome. feel free to use it as you wish

regards
baz walter
Here is another simple lexer to higlight some sepcifc words and lines.

It's time to sleep.
Christophe.

import sys
from PyQt4.QtCore import SIGNAL, SLOT, QString
from PyQt4.QtGui import QApplication, QMainWindow, QColor, QFont
from PyQt4.Qsci import QsciScintilla, QsciLexerCustom

# The most important and hard part of this code was given by Baz WALTER on the 
PyQt list.

if sys.hexversion < 0x020600F0:
    print('python 2.6 or greater is required by this program')
    sys.exit(1)

_sample = """
This example shows how to highlight some specific lines or words.

+ A first level title bold and red
    + A secund level title bold and blue with a yellow background
Some text with green in green but also bold and underlined.
The digits are gray with an orange backround. You don't believe it, look at 
that : 1 , 2 , ... , 123456789...

It's very uggly but it shows how to do more pretty "highlighters".
"""


class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.setWindowTitle('Custom Lexer For Config Files')
        self.setGeometry(50, 200, 400, 400)
        self.editor = QsciScintilla(self)
        self.editor.setUtf8(True)

# LINES' NUMBER IN THE MARGIN
        self.editor.setMarginLineNumbers(1,True)
        self.editor.setMarginWidth(1, QString("-------"))
                # OK for 3 digits. This was found by direct tests...
# WRAPING
        self.editor.setWrapMode(True)

        self.setCentralWidget(self.editor)
        self.lexer = ConfigLexer(self.editor)
        self.editor.setLexer(self.lexer)
        self.editor.setText(_sample)


class ConfigLexer(QsciLexerCustom):
    def __init__(self, parent):
        QsciLexerCustom.__init__(self, parent)
        self._styles = { 
            0: 'Default',
            1: 'FirstLevelTitle',
            2: 'SecundLevelTitle',
            3: 'Green',
            4: 'Digits'
            }
        for key,value in self._styles.iteritems():
            setattr(self, value, key)

    def language(self):
        return 'Config Files'

    def description(self, style):
        return self._styles.get(style, '')

    def defaultColor(self, style):
        if style == self.Default:
            return QColor('#000000')
        elif style == self.FirstLevelTitle:
            return QColor('#FF0000')
        elif style == self.SecundLevelTitle:
            return QColor('#0000FF')
        elif style == self.Green:
            return QColor('#00FF00')
        elif style == self.Digits:
            return QColor('#AAAAAA')
        return QsciLexerCustom.defaultColor(self, style)

    def defaultFont(self, style):
        font = QsciLexerCustom.defaultFont(self, style)

        if style == self.FirstLevelTitle or style == self.SecundLevelTitle:
            font.setBold(True)
        elif style == self.Green:
            font.setBold(True)
            font.setUnderline(True)
            
        return font

    def defaultPaper(self, style):
# Here we change the color of the background.
# We want to colorize all the background of the line.
# This is done by using the following method defaultEolFill() .
        if style == self.SecundLevelTitle:
            return QColor('#FFFF99')
        elif style == self.Digits:
            return QColor('#FFCC66')

        return QsciLexerCustom.defaultPaper(self, style)

    def defaultEolFill(self, style):
# This allowed to colorize all the background of a line.
        if style == self.SecundLevelTitle:
            return True
        return QsciLexerCustom.defaultEolFill(self, style)

    def styleText(self, start, end):
        editor = self.editor()
        if editor is None:
            return

        SCI = editor.SendScintilla
        set_style = self.setStyling

        source = ''
        if end > editor.length():
            end = editor.length()
        if end > start:
            source = bytearray(end - start)
            SCI(QsciScintilla.SCI_GETTEXTRANGE, start, end, source)
        if not source:
            return

        self.startStyling(start, 0x1f)

        index = SCI(QsciScintilla.SCI_LINEFROMPOSITION, start)
               
        for line in source.splitlines(True):
# Try to uncomment the following line to see in the console
# how Scintiallla works. You have to think in terms of isolated
# lines rather than globally on the whole text.
#            print line

            length = len(line)

            if line.startswith('+'):
                newState = self.FirstLevelTitle
            elif line.startswith('\t+') or line.startswith('    +'):
                newState = self.SecundLevelTitle
            else:
                pos = SCI(QsciScintilla.SCI_GETLINEENDPOSITION, index) - length 
+ 1
                i = 0
                while i < length:
                    wordLength = 1

                    self.startStyling(i + pos, 0x1f)
                    if chr(line[i]) in '0123456789':
                        newState = self.Digits
                    else:
                        if line[i:].startswith('green'):
                            newState = self.Green
                            wordLength = len('green')
                        else:
                            newState = self.Default
                    i += wordLength
                    set_style(wordLength, newState)
                newState = None

            if newState:
                set_style(length, newState)

            index += 1

if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.connect(app, SIGNAL('lastWindowClosed()'), app, SLOT('quit()'))
    win = MainWindow()
    win.show()
    sys.exit(app.exec_()) 
_______________________________________________
PyQt mailing list    [email protected]
http://www.riverbankcomputing.com/mailman/listinfo/pyqt

Reply via email to