forked from IPKM/nmreval
bugfixes (#191)
added basic syntax check; closes #148 Co-authored-by: Dominik Demuth <dominik.demuth@physik.tu-darmstadt.de> Reviewed-on: IPKM/nmreval#191
This commit is contained in:
@ -72,7 +72,8 @@ class PythonHighlighter(QtGui.QSyntaxHighlighter):
|
||||
(r'\bdef\b\s*(\w+)', 1, STYLES['defclass']),
|
||||
# 'class' followed by an identifier
|
||||
(r'\bclass\b\s*(\w+)', 1, STYLES['defclass']),
|
||||
# @ followed by a word
|
||||
|
||||
# decorator @ followed by a word
|
||||
(r'\s*@(\w+)\s*', 0, STYLES['property']),
|
||||
|
||||
# Numeric literals
|
||||
@ -80,7 +81,6 @@ class PythonHighlighter(QtGui.QSyntaxHighlighter):
|
||||
(r'\b[+-]?0[xX][\dA-Fa-f]+[lL]?\b', 0, STYLES['numbers']),
|
||||
(r'\b[+-]?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b', 0, STYLES['numbers']),
|
||||
|
||||
|
||||
# Double-quoted string, possibly containing escape sequences
|
||||
(r'[rf]?"[^"\\]*(\\.[^"\\]*)*"', 0, STYLES['string']),
|
||||
# Single-quoted string, possibly containing escape sequences
|
||||
@ -185,7 +185,6 @@ class CodeEditor(QtWidgets.QPlainTextEdit):
|
||||
self.update_width_linenumber(0)
|
||||
|
||||
self.highlight = PythonHighlighter(self.document())
|
||||
self.textChanged.connect(self._check_syntax)
|
||||
|
||||
def keyPressEvent(self, evt):
|
||||
if evt.key() == QtCore.Qt.Key_Tab:
|
||||
@ -263,22 +262,48 @@ class CodeEditor(QtWidgets.QPlainTextEdit):
|
||||
|
||||
self.setExtraSelections(extra_selections)
|
||||
|
||||
def color_line(self, color):
|
||||
# is_valid, exception = self._check_syntax()
|
||||
# if is_valid == 1:
|
||||
doc = self.document()
|
||||
print(doc.findBlockByLineNumber(color))
|
||||
|
||||
class EditorWidget(QtWidgets.QWidget):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent=parent)
|
||||
|
||||
layout = QtWidgets.QVBoxLayout()
|
||||
layout.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
self.editor = CodeEditor(self)
|
||||
layout.addWidget(self.editor)
|
||||
|
||||
self.error_label = QtWidgets.QLabel(self)
|
||||
|
||||
font = QtGui.QFont()
|
||||
font.setBold(True)
|
||||
font.setWeight(75)
|
||||
self.error_label.setFont(font)
|
||||
|
||||
self.error_label.setVisible(False)
|
||||
|
||||
layout.addWidget(self.error_label)
|
||||
|
||||
self.setLayout(layout)
|
||||
|
||||
for attr in ['appendPlainText', 'toPlainText', 'insertPlainText', 'setPlainText']:
|
||||
setattr(self, attr, getattr(self.editor, attr))
|
||||
|
||||
self.editor.textChanged.connect(self._check_syntax)
|
||||
|
||||
def _check_syntax(self) -> (int, tuple[typing.Any]):
|
||||
is_valid = True
|
||||
|
||||
# Compile into an AST and check for syntax errors.
|
||||
try:
|
||||
_ = parse(self.toPlainText(), filename='<string>')
|
||||
except SyntaxError as e:
|
||||
print('SyntaxError', e, e.args[0], e.lineno, e.offset, e.text)
|
||||
self.color_line(e.lineno)
|
||||
return 1, (e.lineno, e.offset)
|
||||
except Exception as e:
|
||||
print('Unexpected error', e)
|
||||
return 2, (e.args[0],)
|
||||
|
||||
return 0, tuple()
|
||||
except SyntaxError as e:
|
||||
self.error_label.setText(f'Syntax error in line {e.lineno}: {e.args[0]}')
|
||||
is_valid = False
|
||||
|
||||
except Exception as e:
|
||||
self.error_label.setText(f'Unexpected error: {e.args[0]}')
|
||||
is_valid = False
|
||||
|
||||
self.error_label.setVisible(not is_valid)
|
||||
|
@ -3,7 +3,7 @@ from __future__ import annotations
|
||||
from pathlib import Path
|
||||
|
||||
from ..Qt import QtWidgets, QtCore, QtGui
|
||||
from ..lib.codeeditor import CodeEditor
|
||||
from ..lib.codeeditor import EditorWidget
|
||||
|
||||
|
||||
class QUsermodelEditor(QtWidgets.QMainWindow):
|
||||
@ -26,7 +26,7 @@ class QUsermodelEditor(QtWidgets.QMainWindow):
|
||||
layout.setContentsMargins(3, 3, 3, 3)
|
||||
layout.setSpacing(3)
|
||||
|
||||
self.edit_field = CodeEditor(self.centralwidget)
|
||||
self.edit_field = EditorWidget(self.centralwidget)
|
||||
font = QtGui.QFont('default')
|
||||
font.setStyleHint(font.Monospace)
|
||||
font.setPointSize(10)
|
||||
|
Reference in New Issue
Block a user