Module lib.shell.editor_py
Syntax highlight for python in the editor
Expand source code
# Distributed under Pycameresp License
# Copyright (c) 2023 Remi BERTHOLET
# pylint:disable=consider-iterating-dictionary
""" Syntax highlight for python in the editor """
PYTHON_KEYWORDS = b"and as assert break class continue def del elif else except exec finally for from global if import in is lambda None not or pass print raise return try while self as join abs apply bool buffer callable chr cmp coerce compile complex delattr dir dict divmod eval execfile filter float getattr globals hasattr hash hex id input int intern isinstance issubclass len list locals long map max min oct open ord pow range raw_input reduce reload repr round setattr slice str tuple type unichr unicode vars xrange zip with yield True False async await"
NO_COLOR = b"\x1B[m"
STRING_COLOR = b"\x1B[31m"
COMMENT_COLOR = b"\x1B[32m"
NUMBER_COLOR = b"\x1B[33m"
KEYWORD_COLOR = b"\x1B[1;34m"
CLASS_COLOR = b"\x1B[1;35m"
FUNCTION_COLOR = b"\x1B[1;36m"
class Colorizer:
""" Syntax highlight for python """
def __init__(self):
""" Constructor """
keywords = PYTHON_KEYWORDS.split(b" ")
keywords.sort()
self.lexicon = {}
for keyword in keywords:
self.lexicon.setdefault(keyword[0],[]).append(keyword)
def colorize(self, text, out):
""" Colorize python file """
STATE_UNDEFINED = 0
STATE_KEYWORD = 1
STATE_NUMBER = 2
STATE_COMMENT = 3
STATE_DECIMAL = 4
STATE_EXPONENT = 5
STATE_BINARY = 6
STATE_OCTAL = 7
STATE_HEXA = 8
STATE_STRING = 9
STATE_STRING_CONTENT = 10
STATE_STRING_ESCAPE = 11
STATE_FUNCTION = 12
STATE_CLASS = 13
state = STATE_UNDEFINED
pos = 0
lastpos = 0
j = 0
previous_char = 0
for char in text:
charactere = char.to_bytes(1,"big")
# If nothind detected
if state == STATE_UNDEFINED:
word = b""
keywords = None
pos = -1
# If a keyword start
if char in self.lexicon.keys():
if not (0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F):
pos = j
state = STATE_KEYWORD
word = charactere
keywords = self.lexicon[char]
# If decimal number started
elif 0x31 <= char <= 0x39:
if 0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F:
pass
else:
state = STATE_DECIMAL
word = charactere
pos = j
# If base number started
elif char == 0x30:
if 0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F:
pass
else:
state = STATE_NUMBER
word = charactere
pos = j
# If comment detected
elif char == 0x23:
pos = j
state = STATE_COMMENT
out.write(text[lastpos:j]+COMMENT_COLOR+text[j:]+NO_COLOR)
lastpos = len(text)
break
# If string detected
elif char == 0x22 or char == 0x27:
state = STATE_STRING
word = charactere
pos = j
# If keyword started
elif state == STATE_KEYWORD:
# If a keyword continue
if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or char == 0x5F:
tmp_word = word + charactere
count = 0
for kwd in keywords:
if kwd.find(word) == 0:
count += 1
if count > 0:
word = tmp_word
else:
# If special string detected
if (char == 0x27 or char == 0x22) and len(word) == 1:
# Byte string
if word[0] == 0x62 or word[0] == 0x42:
word = charactere
pos = j
state = STATE_STRING
# Regular string
elif word[0] == 0x52 or word[0] == 0x72:
word = charactere
pos = j
state = STATE_STRING
# Unicode string
elif word[0] == 0x55 or word[0] == 0x75:
word = charactere
pos = j
state = STATE_STRING
else:
word = b""
state = STATE_UNDEFINED
keywords = None
else:
if word in keywords:
out.write(text[lastpos:pos]+KEYWORD_COLOR+word+NO_COLOR)
if word == b"def":
state = STATE_FUNCTION
lastpos = j
word = charactere
keywords = None
elif word == b"class":
state = STATE_CLASS
lastpos = j
word = charactere
keywords = None
else:
lastpos = j
word = b""
state = STATE_UNDEFINED
keywords = None
else:
word = b""
state = STATE_UNDEFINED
keywords = None
# If function name
elif state == STATE_FUNCTION:
if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or 0x30 <= char <= 0x39 or char == 0x5F or char == 0x20 or char == 0x09:
word += charactere
else:
out.write(text[lastpos:pos]+FUNCTION_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
word = b""
keywords = None
# If class name
elif state == STATE_CLASS:
if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or 0x30 <= char <= 0x39 or char == 0x5F or char == 0x20 or char == 0x09:
word += charactere
else:
out.write(text[lastpos:pos]+CLASS_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
word = b""
keywords = None
# If decimal detected
elif state == STATE_DECIMAL:
if char >= 0x30 and char <= 0x39 or char == 0x5F:
word += charactere
elif char == 0x2E:
if b"." not in word:
word += charactere
else:
state = STATE_UNDEFINED
elif char == 0x45 or char == 0x65:
word += charactere
state = STATE_EXPONENT
else:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
# If decimal with exponent
elif state == STATE_EXPONENT:
if char >= 0x30 and char <= 0x39:
word += charactere
elif char == 0x2B or char == 0x2D:
if b"+" in word or b"-" in word:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
else:
word += charactere
else:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
# If number detected
elif state == STATE_NUMBER:
# If hexa number detected
if char == 0x58 or char == 0x78:
word += charactere
state = STATE_HEXA
# If octal number detected
elif char == 0x4F or char == 0x6F:
word += charactere
state = STATE_OCTAL
# If binary number detected
elif char == 0x42 or char == 0x62:
word += charactere
state = STATE_BINARY
else:
if char == 0x2E:
state = STATE_DECIMAL
word += charactere
elif 0x30 <= char <= 0x39 or 0x41 <= char <= 0x46 or 0x61 <= char <= 0x66 or char == 0x5F:
state = STATE_UNDEFINED
word = b""
else:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
# If hexa number
elif state == STATE_HEXA:
# If hexa detected
if 0x30 <= char <= 0x39 or 0x41 <= char <= 0x46 or 0x61 <= char <= 0x66:
word += charactere
# If not hexa detected
elif 0x47 <= char <= 0x5A or 0x67 <= char <= 0x7A:
state = STATE_UNDEFINED
# If the number ended
else:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
# If octal number
elif state == STATE_OCTAL:
# If hexa detected
if 0x30 <= char <= 0x37:
word += charactere
# If the number ended
else:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
# If binary number
elif state == STATE_BINARY:
# If hexa detected
if 0x30 <= char <= 0x31:
word += charactere
# If the number ended
else:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
# If string started
elif state == STATE_STRING:
if char == word[0]:
word += charactere
if len(word) == 3:
state = STATE_STRING_CONTENT
else:
if len(word) == 2:
out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR)
lastpos = j
state = STATE_UNDEFINED
elif char == 0x5C:
word += charactere
state = STATE_STRING_ESCAPE
else:
word += charactere
state = STATE_STRING_CONTENT
# If escape in string
elif state == STATE_STRING_ESCAPE:
word += charactere
state = STATE_STRING_CONTENT
# If string content
elif state == STATE_STRING_CONTENT:
# String terminated maybe
if word[0] == char:
word += charactere
if len(word) >= 6:
if word[:3] == b'"""' or word[:3] == b"'''":
if word[:3] == word[-3:]:
out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR)
lastpos = j+1
state = STATE_UNDEFINED
elif word[0] == word[-1]:
out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR)
lastpos = j+1
state = STATE_UNDEFINED
elif len(word) >= 2:
if word[0] == word[-1]:
out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR)
lastpos = j+1
state = STATE_UNDEFINED
elif char == 0x5C:
word += charactere
state = STATE_STRING_ESCAPE
else:
word += charactere
previous_char = char
j += 1
if state in [STATE_NUMBER, STATE_HEXA, STATE_OCTAL, STATE_BINARY, STATE_DECIMAL, STATE_EXPONENT]:
out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR)
elif state == STATE_KEYWORD:
if word in keywords:
out.write(text[lastpos:pos]+KEYWORD_COLOR+word+NO_COLOR)
else:
out.write(text[lastpos:])
elif lastpos < len(text):
out.write(text[lastpos:])
Classes
class Colorizer-
Syntax highlight for python
Constructor
Expand source code
class Colorizer: """ Syntax highlight for python """ def __init__(self): """ Constructor """ keywords = PYTHON_KEYWORDS.split(b" ") keywords.sort() self.lexicon = {} for keyword in keywords: self.lexicon.setdefault(keyword[0],[]).append(keyword) def colorize(self, text, out): """ Colorize python file """ STATE_UNDEFINED = 0 STATE_KEYWORD = 1 STATE_NUMBER = 2 STATE_COMMENT = 3 STATE_DECIMAL = 4 STATE_EXPONENT = 5 STATE_BINARY = 6 STATE_OCTAL = 7 STATE_HEXA = 8 STATE_STRING = 9 STATE_STRING_CONTENT = 10 STATE_STRING_ESCAPE = 11 STATE_FUNCTION = 12 STATE_CLASS = 13 state = STATE_UNDEFINED pos = 0 lastpos = 0 j = 0 previous_char = 0 for char in text: charactere = char.to_bytes(1,"big") # If nothind detected if state == STATE_UNDEFINED: word = b"" keywords = None pos = -1 # If a keyword start if char in self.lexicon.keys(): if not (0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F): pos = j state = STATE_KEYWORD word = charactere keywords = self.lexicon[char] # If decimal number started elif 0x31 <= char <= 0x39: if 0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F: pass else: state = STATE_DECIMAL word = charactere pos = j # If base number started elif char == 0x30: if 0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F: pass else: state = STATE_NUMBER word = charactere pos = j # If comment detected elif char == 0x23: pos = j state = STATE_COMMENT out.write(text[lastpos:j]+COMMENT_COLOR+text[j:]+NO_COLOR) lastpos = len(text) break # If string detected elif char == 0x22 or char == 0x27: state = STATE_STRING word = charactere pos = j # If keyword started elif state == STATE_KEYWORD: # If a keyword continue if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or char == 0x5F: tmp_word = word + charactere count = 0 for kwd in keywords: if kwd.find(word) == 0: count += 1 if count > 0: word = tmp_word else: # If special string detected if (char == 0x27 or char == 0x22) and len(word) == 1: # Byte string if word[0] == 0x62 or word[0] == 0x42: word = charactere pos = j state = STATE_STRING # Regular string elif word[0] == 0x52 or word[0] == 0x72: word = charactere pos = j state = STATE_STRING # Unicode string elif word[0] == 0x55 or word[0] == 0x75: word = charactere pos = j state = STATE_STRING else: word = b"" state = STATE_UNDEFINED keywords = None else: if word in keywords: out.write(text[lastpos:pos]+KEYWORD_COLOR+word+NO_COLOR) if word == b"def": state = STATE_FUNCTION lastpos = j word = charactere keywords = None elif word == b"class": state = STATE_CLASS lastpos = j word = charactere keywords = None else: lastpos = j word = b"" state = STATE_UNDEFINED keywords = None else: word = b"" state = STATE_UNDEFINED keywords = None # If function name elif state == STATE_FUNCTION: if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or 0x30 <= char <= 0x39 or char == 0x5F or char == 0x20 or char == 0x09: word += charactere else: out.write(text[lastpos:pos]+FUNCTION_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED word = b"" keywords = None # If class name elif state == STATE_CLASS: if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or 0x30 <= char <= 0x39 or char == 0x5F or char == 0x20 or char == 0x09: word += charactere else: out.write(text[lastpos:pos]+CLASS_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED word = b"" keywords = None # If decimal detected elif state == STATE_DECIMAL: if char >= 0x30 and char <= 0x39 or char == 0x5F: word += charactere elif char == 0x2E: if b"." not in word: word += charactere else: state = STATE_UNDEFINED elif char == 0x45 or char == 0x65: word += charactere state = STATE_EXPONENT else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If decimal with exponent elif state == STATE_EXPONENT: if char >= 0x30 and char <= 0x39: word += charactere elif char == 0x2B or char == 0x2D: if b"+" in word or b"-" in word: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED else: word += charactere else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If number detected elif state == STATE_NUMBER: # If hexa number detected if char == 0x58 or char == 0x78: word += charactere state = STATE_HEXA # If octal number detected elif char == 0x4F or char == 0x6F: word += charactere state = STATE_OCTAL # If binary number detected elif char == 0x42 or char == 0x62: word += charactere state = STATE_BINARY else: if char == 0x2E: state = STATE_DECIMAL word += charactere elif 0x30 <= char <= 0x39 or 0x41 <= char <= 0x46 or 0x61 <= char <= 0x66 or char == 0x5F: state = STATE_UNDEFINED word = b"" else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If hexa number elif state == STATE_HEXA: # If hexa detected if 0x30 <= char <= 0x39 or 0x41 <= char <= 0x46 or 0x61 <= char <= 0x66: word += charactere # If not hexa detected elif 0x47 <= char <= 0x5A or 0x67 <= char <= 0x7A: state = STATE_UNDEFINED # If the number ended else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If octal number elif state == STATE_OCTAL: # If hexa detected if 0x30 <= char <= 0x37: word += charactere # If the number ended else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If binary number elif state == STATE_BINARY: # If hexa detected if 0x30 <= char <= 0x31: word += charactere # If the number ended else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If string started elif state == STATE_STRING: if char == word[0]: word += charactere if len(word) == 3: state = STATE_STRING_CONTENT else: if len(word) == 2: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED elif char == 0x5C: word += charactere state = STATE_STRING_ESCAPE else: word += charactere state = STATE_STRING_CONTENT # If escape in string elif state == STATE_STRING_ESCAPE: word += charactere state = STATE_STRING_CONTENT # If string content elif state == STATE_STRING_CONTENT: # String terminated maybe if word[0] == char: word += charactere if len(word) >= 6: if word[:3] == b'"""' or word[:3] == b"'''": if word[:3] == word[-3:]: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j+1 state = STATE_UNDEFINED elif word[0] == word[-1]: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j+1 state = STATE_UNDEFINED elif len(word) >= 2: if word[0] == word[-1]: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j+1 state = STATE_UNDEFINED elif char == 0x5C: word += charactere state = STATE_STRING_ESCAPE else: word += charactere previous_char = char j += 1 if state in [STATE_NUMBER, STATE_HEXA, STATE_OCTAL, STATE_BINARY, STATE_DECIMAL, STATE_EXPONENT]: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) elif state == STATE_KEYWORD: if word in keywords: out.write(text[lastpos:pos]+KEYWORD_COLOR+word+NO_COLOR) else: out.write(text[lastpos:]) elif lastpos < len(text): out.write(text[lastpos:])Methods
def colorize(self, text, out)-
Colorize python file
Expand source code
def colorize(self, text, out): """ Colorize python file """ STATE_UNDEFINED = 0 STATE_KEYWORD = 1 STATE_NUMBER = 2 STATE_COMMENT = 3 STATE_DECIMAL = 4 STATE_EXPONENT = 5 STATE_BINARY = 6 STATE_OCTAL = 7 STATE_HEXA = 8 STATE_STRING = 9 STATE_STRING_CONTENT = 10 STATE_STRING_ESCAPE = 11 STATE_FUNCTION = 12 STATE_CLASS = 13 state = STATE_UNDEFINED pos = 0 lastpos = 0 j = 0 previous_char = 0 for char in text: charactere = char.to_bytes(1,"big") # If nothind detected if state == STATE_UNDEFINED: word = b"" keywords = None pos = -1 # If a keyword start if char in self.lexicon.keys(): if not (0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F): pos = j state = STATE_KEYWORD word = charactere keywords = self.lexicon[char] # If decimal number started elif 0x31 <= char <= 0x39: if 0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F: pass else: state = STATE_DECIMAL word = charactere pos = j # If base number started elif char == 0x30: if 0x41 <= previous_char <= 0x5A or 0x61 <= previous_char <= 0x7A or 0x30 <= previous_char <= 0x39 or previous_char == 0x5F: pass else: state = STATE_NUMBER word = charactere pos = j # If comment detected elif char == 0x23: pos = j state = STATE_COMMENT out.write(text[lastpos:j]+COMMENT_COLOR+text[j:]+NO_COLOR) lastpos = len(text) break # If string detected elif char == 0x22 or char == 0x27: state = STATE_STRING word = charactere pos = j # If keyword started elif state == STATE_KEYWORD: # If a keyword continue if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or char == 0x5F: tmp_word = word + charactere count = 0 for kwd in keywords: if kwd.find(word) == 0: count += 1 if count > 0: word = tmp_word else: # If special string detected if (char == 0x27 or char == 0x22) and len(word) == 1: # Byte string if word[0] == 0x62 or word[0] == 0x42: word = charactere pos = j state = STATE_STRING # Regular string elif word[0] == 0x52 or word[0] == 0x72: word = charactere pos = j state = STATE_STRING # Unicode string elif word[0] == 0x55 or word[0] == 0x75: word = charactere pos = j state = STATE_STRING else: word = b"" state = STATE_UNDEFINED keywords = None else: if word in keywords: out.write(text[lastpos:pos]+KEYWORD_COLOR+word+NO_COLOR) if word == b"def": state = STATE_FUNCTION lastpos = j word = charactere keywords = None elif word == b"class": state = STATE_CLASS lastpos = j word = charactere keywords = None else: lastpos = j word = b"" state = STATE_UNDEFINED keywords = None else: word = b"" state = STATE_UNDEFINED keywords = None # If function name elif state == STATE_FUNCTION: if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or 0x30 <= char <= 0x39 or char == 0x5F or char == 0x20 or char == 0x09: word += charactere else: out.write(text[lastpos:pos]+FUNCTION_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED word = b"" keywords = None # If class name elif state == STATE_CLASS: if 0x41 <= char <= 0x5A or 0x61 <= char <= 0x7A or 0x30 <= char <= 0x39 or char == 0x5F or char == 0x20 or char == 0x09: word += charactere else: out.write(text[lastpos:pos]+CLASS_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED word = b"" keywords = None # If decimal detected elif state == STATE_DECIMAL: if char >= 0x30 and char <= 0x39 or char == 0x5F: word += charactere elif char == 0x2E: if b"." not in word: word += charactere else: state = STATE_UNDEFINED elif char == 0x45 or char == 0x65: word += charactere state = STATE_EXPONENT else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If decimal with exponent elif state == STATE_EXPONENT: if char >= 0x30 and char <= 0x39: word += charactere elif char == 0x2B or char == 0x2D: if b"+" in word or b"-" in word: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED else: word += charactere else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If number detected elif state == STATE_NUMBER: # If hexa number detected if char == 0x58 or char == 0x78: word += charactere state = STATE_HEXA # If octal number detected elif char == 0x4F or char == 0x6F: word += charactere state = STATE_OCTAL # If binary number detected elif char == 0x42 or char == 0x62: word += charactere state = STATE_BINARY else: if char == 0x2E: state = STATE_DECIMAL word += charactere elif 0x30 <= char <= 0x39 or 0x41 <= char <= 0x46 or 0x61 <= char <= 0x66 or char == 0x5F: state = STATE_UNDEFINED word = b"" else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If hexa number elif state == STATE_HEXA: # If hexa detected if 0x30 <= char <= 0x39 or 0x41 <= char <= 0x46 or 0x61 <= char <= 0x66: word += charactere # If not hexa detected elif 0x47 <= char <= 0x5A or 0x67 <= char <= 0x7A: state = STATE_UNDEFINED # If the number ended else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If octal number elif state == STATE_OCTAL: # If hexa detected if 0x30 <= char <= 0x37: word += charactere # If the number ended else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If binary number elif state == STATE_BINARY: # If hexa detected if 0x30 <= char <= 0x31: word += charactere # If the number ended else: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED # If string started elif state == STATE_STRING: if char == word[0]: word += charactere if len(word) == 3: state = STATE_STRING_CONTENT else: if len(word) == 2: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j state = STATE_UNDEFINED elif char == 0x5C: word += charactere state = STATE_STRING_ESCAPE else: word += charactere state = STATE_STRING_CONTENT # If escape in string elif state == STATE_STRING_ESCAPE: word += charactere state = STATE_STRING_CONTENT # If string content elif state == STATE_STRING_CONTENT: # String terminated maybe if word[0] == char: word += charactere if len(word) >= 6: if word[:3] == b'"""' or word[:3] == b"'''": if word[:3] == word[-3:]: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j+1 state = STATE_UNDEFINED elif word[0] == word[-1]: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j+1 state = STATE_UNDEFINED elif len(word) >= 2: if word[0] == word[-1]: out.write(text[lastpos:pos]+STRING_COLOR+word+NO_COLOR) lastpos = j+1 state = STATE_UNDEFINED elif char == 0x5C: word += charactere state = STATE_STRING_ESCAPE else: word += charactere previous_char = char j += 1 if state in [STATE_NUMBER, STATE_HEXA, STATE_OCTAL, STATE_BINARY, STATE_DECIMAL, STATE_EXPONENT]: out.write(text[lastpos:pos]+NUMBER_COLOR+word+NO_COLOR) elif state == STATE_KEYWORD: if word in keywords: out.write(text[lastpos:pos]+KEYWORD_COLOR+word+NO_COLOR) else: out.write(text[lastpos:]) elif lastpos < len(text): out.write(text[lastpos:])