aboutsummaryrefslogtreecommitdiffstats
path: root/examples/xmlpatterns/schema/schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'examples/xmlpatterns/schema/schema.py')
-rw-r--r--examples/xmlpatterns/schema/schema.py286
1 files changed, 0 insertions, 286 deletions
diff --git a/examples/xmlpatterns/schema/schema.py b/examples/xmlpatterns/schema/schema.py
deleted file mode 100644
index d3c22c184..000000000
--- a/examples/xmlpatterns/schema/schema.py
+++ /dev/null
@@ -1,286 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets, QtXmlPatterns
-
-import schema_rc
-from ui_schema import Ui_SchemaMainWindow
-
-
-try:
- # Python v2.
- unicode
-
- def encode_utf8(ba):
- return unicode(ba, encoding='utf8')
-
- def decode_utf8(qs):
- return QtCore.QByteArray(str(qs))
-
-except NameError:
- # Python v3.
-
- def encode_utf8(ba):
- return str(ba.data(), encoding='utf8')
-
- def decode_utf8(qs):
- return QtCore.QByteArray(bytes(qs, encoding='utf8'))
-
-
-class XmlSyntaxHighlighter(QtGui.QSyntaxHighlighter):
-
- def __init__(self, parent=None):
- super(XmlSyntaxHighlighter, self).__init__(parent)
-
- self.highlightingRules = []
-
- # Tag format.
- format = QtGui.QTextCharFormat()
- format.setForeground(QtCore.Qt.darkBlue)
- format.setFontWeight(QtGui.QFont.Bold)
- pattern = QtCore.QRegularExpression(r'(<[a-zA-Z:]+\b|<\?[a-zA-Z:]+\b|\?>|>|/>|</[a-zA-Z:]+>)')
- assert pattern.isValid()
- self.highlightingRules.append((pattern, format))
-
- # Attribute format.
- format = QtGui.QTextCharFormat()
- format.setForeground(QtCore.Qt.darkGreen)
- pattern = QtCore.QRegularExpression('[a-zA-Z:]+=')
- assert pattern.isValid()
- self.highlightingRules.append((pattern, format))
-
- # Attribute content format.
- format = QtGui.QTextCharFormat()
- format.setForeground(QtCore.Qt.red)
- pattern = QtCore.QRegularExpression("(\"[^\"]*\"|'[^']*')")
- assert pattern.isValid()
- self.highlightingRules.append((pattern, format))
-
- # Comment format.
- self.commentFormat = QtGui.QTextCharFormat()
- self.commentFormat.setForeground(QtCore.Qt.lightGray)
- self.commentFormat.setFontItalic(True)
-
- self.commentStartExpression = QtCore.QRegularExpression("<!--")
- assert self.commentStartExpression.isValid()
- self.commentEndExpression = QtCore.QRegularExpression("-->")
- assert self.commentEndExpression.isValid()
-
- def highlightBlock(self, text):
- for pattern, format in self.highlightingRules:
- match = pattern.match(text)
- while match.hasMatch():
- index = match.capturedStart()
- length = match.capturedLength(0)
- self.setFormat(index, length, format)
- match = pattern.match(text, index + length)
-
- self.setCurrentBlockState(0)
-
- startIndex = 0
- if self.previousBlockState() != 1:
- match = self.commentStartExpression.match(text)
- startIndex = match.capturedStart(0) if match.hasMatch() else -1
-
- while startIndex >= 0:
- match = self.commentEndExpression.match(text, startIndex)
- endIndex = match.capturedStart(0) if match.hasMatch() else -1
- if match.hasMatch():
- endIndex = match.capturedStart(0)
- length = match.capturedLength(0)
- commentLength = endIndex - startIndex + length
- else:
- self.setCurrentBlockState(1)
- commentLength = text.length() - startIndex
-
- self.setFormat(startIndex, commentLength, self.commentFormat)
- match = self.commentStartExpression.match(text, startIndex + commentLength)
- startIndex = match.capturedStart(0) if match.hasMatch() else -1
-
-
-class MessageHandler(QtXmlPatterns.QAbstractMessageHandler):
-
- def __init__(self):
- super(MessageHandler, self).__init__()
-
- self.m_description = ""
- self.m_sourceLocation = QtXmlPatterns.QSourceLocation()
-
- def statusMessage(self):
- return self.m_description
-
- def line(self):
- return self.m_sourceLocation.line()
-
- def column(self):
- return self.m_sourceLocation.column()
-
- def handleMessage(self, type, description, identifier, sourceLocation):
- self.m_description = description
- self.m_sourceLocation = sourceLocation
-
-
-class MainWindow(QtWidgets.QMainWindow, Ui_SchemaMainWindow):
-
- def __init__(self):
- QtWidgets.QMainWindow.__init__(self)
-
- self.setupUi(self)
-
- XmlSyntaxHighlighter(self.schemaView.document())
- XmlSyntaxHighlighter(self.instanceEdit.document())
-
- self.schemaSelection.addItem("Contact Schema")
- self.schemaSelection.addItem("Recipe Schema")
- self.schemaSelection.addItem("Order Schema")
-
- self.instanceSelection.addItem("Valid Contact Instance")
- self.instanceSelection.addItem("Invalid Contact Instance")
-
- self.schemaSelection.currentIndexChanged[int].connect(self.schemaSelected)
- self.instanceSelection.currentIndexChanged[int].connect(self.instanceSelected)
- self.validateButton.clicked.connect(self.validate)
- self.instanceEdit.textChanged.connect(self.textChanged)
-
- self.validationStatus.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
-
- self.schemaSelected(0)
- self.instanceSelected(0)
-
- def schemaSelected(self, index):
- self.instanceSelection.clear()
-
- if index == 0:
- self.instanceSelection.addItem("Valid Contact Instance")
- self.instanceSelection.addItem("Invalid Contact Instance")
- elif index == 1:
- self.instanceSelection.addItem("Valid Recipe Instance")
- self.instanceSelection.addItem("Invalid Recipe Instance")
- elif index == 2:
- self.instanceSelection.addItem("Valid Order Instance")
- self.instanceSelection.addItem("Invalid Order Instance")
-
- self.textChanged()
-
- schemaFile = QtCore.QFile(':/schema_%d.xsd' % index)
- schemaFile.open(QtCore.QIODevice.ReadOnly)
- schemaData = schemaFile.readAll()
- self.schemaView.setPlainText(encode_utf8(schemaData))
-
- self.validate()
-
- def instanceSelected(self, index):
- if index == -1:
- return
-
- index += 2 * self.schemaSelection.currentIndex()
- instanceFile = QtCore.QFile(':/instance_%d.xml' % index)
- instanceFile.open(QtCore.QIODevice.ReadOnly)
- instanceData = instanceFile.readAll()
- self.instanceEdit.setPlainText(encode_utf8(instanceData))
-
- self.validate()
-
- def validate(self):
- schemaData = decode_utf8(self.schemaView.toPlainText())
- instanceData = decode_utf8(self.instanceEdit.toPlainText())
-
- messageHandler = MessageHandler()
-
- schema = QtXmlPatterns.QXmlSchema()
- schema.setMessageHandler(messageHandler)
- schema.load(schemaData, QtCore.QUrl())
-
- errorOccurred = False
- if not schema.isValid():
- errorOccurred = True
- else:
- validator = QtXmlPatterns.QXmlSchemaValidator(schema)
- if not validator.validate(instanceData):
- errorOccurred = True
-
- if errorOccurred:
- self.validationStatus.setText(messageHandler.statusMessage())
- self.moveCursor(messageHandler.line(), messageHandler.column())
- background = QtCore.Qt.red
- else:
- self.validationStatus.setText("validation successful")
- background = QtCore.Qt.green
-
- styleSheet = 'QLabel {background: %s; padding: 3px}' % QtGui.QColor(background).lighter(160).name()
- self.validationStatus.setStyleSheet(styleSheet)
-
- def textChanged(self):
- self.instanceEdit.setExtraSelections([])
-
- def moveCursor(self, line, column):
- self.instanceEdit.moveCursor(QtGui.QTextCursor.Start)
-
- for i in range(1, line):
- self.instanceEdit.moveCursor(QtGui.QTextCursor.Down)
-
- for i in range(1, column):
- self.instanceEdit.moveCursor(QtGui.QTextCursor.Right)
-
- extraSelections = []
- selection = QtWidgets.QTextEdit.ExtraSelection()
-
- lineColor = QtGui.QColor(QtCore.Qt.red).lighter(160)
- selection.format.setBackground(lineColor)
- selection.format.setProperty(QtGui.QTextFormat.FullWidthSelection, True)
- selection.cursor = self.instanceEdit.textCursor()
- selection.cursor.clearSelection()
- extraSelections.append(selection)
-
- self.instanceEdit.setExtraSelections(extraSelections)
-
- self.instanceEdit.setFocus()
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- window = MainWindow()
- window.show()
- sys.exit(app.exec_())