@QtQml.QmlElement
class SyntaxHighlight(QtCore.QObject):
    documentChanged = QtCore.Signal()
    languageChanged = QtCore.Signal()

    def __init__(self):
        super().__init__()
        self._doc: Optional[QtGui.QTextDocument] = None
        self._highlighter: Optional[QtGui.QSyntaxHighlighter] = None
        self._language: str = ""

    def _getDoc(self) -> QtQuick.QQuickItem:
        return self._doc

    def _setDoc(self, doc: QtQuick.QQuickTextDocument) -> None:
        if doc != self._doc and isinstance(doc, QtQuick.QQuickTextDocument):
            if self._doc and self._highlighter:
                self._highlighter.setDocument(None)
            self._doc = doc
            self._update()

    document = QtCore.Property(QtQuick.QQuickTextDocument, fget=_getDoc,
                               fset=_setDoc, notify=documentChanged)

    def _getLang(self) -> str:
        return self._language

    def _setLang(self, language: str) -> None:
        if language != self._language:
            self._language = language
            self._update()

    language = QtCore.Property(str, fget=_getLang, fset=_setLang,
                               notify=languageChanged)

    def _update(self) -> None:
        if (doc := self._doc) and (lang := self._language):
            lang = lang.lower().strip()
            if lang in syntax_classes:
                class_spec = syntax_classes[lang]
                cls = find_highlighter_class(class_spec)
                hiliter = cls(doc.textDocument())
                self._highlighter = hiliter
            else:
                print(f"Unknown language {lang}")