512 """ |
511 """ |
513 if qVersion() < "5.0.0" or not self.__pyqt5Available: |
512 if qVersion() < "5.0.0" or not self.__pyqt5Available: |
514 # only available for Qt5 |
513 # only available for Qt5 |
515 return |
514 return |
516 |
515 |
517 regex = self.regexpTextEdit.toPlainText() |
516 regexp = self.regexpTextEdit.toPlainText() |
518 text = self.textTextEdit.toPlainText() |
517 text = self.textTextEdit.toPlainText() |
519 if regex and text: |
518 if regexp and text: |
520 options = QRegularExpression.NoPatternOption |
519 options = [] |
521 if self.caseInsensitiveCheckBox.isChecked(): |
520 if self.caseInsensitiveCheckBox.isChecked(): |
522 options |= QRegularExpression.CaseInsensitiveOption |
521 options.append("CaseInsensitiveOption") |
523 if self.multilineCheckBox.isChecked(): |
522 if self.multilineCheckBox.isChecked(): |
524 options |= QRegularExpression.MultilineOption |
523 options.append("MultilineOption") |
525 if self.dotallCheckBox.isChecked(): |
524 if self.dotallCheckBox.isChecked(): |
526 options |= QRegularExpression.DotMatchesEverythingOption |
525 options.append("DotMatchesEverythingOption") |
527 if self.extendedCheckBox.isChecked(): |
526 if self.extendedCheckBox.isChecked(): |
528 options |= QRegularExpression.ExtendedPatternSyntaxOption |
527 options.append("ExtendedPatternSyntaxOption") |
529 if self.greedinessCheckBox.isChecked(): |
528 if self.greedinessCheckBox.isChecked(): |
530 options |= QRegularExpression.InvertedGreedinessOption |
529 options.append("InvertedGreedinessOption") |
531 if self.unicodeCheckBox.isChecked(): |
530 if self.unicodeCheckBox.isChecked(): |
532 options |= QRegularExpression.UseUnicodePropertiesOption |
531 options.append("UseUnicodePropertiesOption") |
533 if self.captureCheckBox.isChecked(): |
532 if self.captureCheckBox.isChecked(): |
534 options |= QRegularExpression.DontCaptureOption |
533 options.append("DontCaptureOption") |
535 |
534 |
536 re = QRegularExpression(regex, options) |
535 if self.__sendCommand("execute", options=options, regexp=regexp, |
537 if not re.isValid(): |
536 text=text, startpos=startpos): |
|
537 response = self.__receiveResponse() |
|
538 if response and ("valid" in response or "matched" in response): |
|
539 if "valid" in response: |
|
540 E5MessageBox.critical(self, |
|
541 self.trUtf8("Error"), |
|
542 self.trUtf8("""Invalid regular expression: {0}""") |
|
543 .format(response["errorMessage"])) |
|
544 # move cursor to error offset |
|
545 offset = response["errorOffset"] |
|
546 tc = self.regexpTextEdit.textCursor() |
|
547 tc.setPosition(offset) |
|
548 self.regexpTextEdit.setTextCursor(tc) |
|
549 self.regexpTextEdit.setFocus() |
|
550 return |
|
551 else: |
|
552 row = 0 |
|
553 OFFSET = 5 |
|
554 |
|
555 self.resultTable.setColumnCount(0) |
|
556 self.resultTable.setColumnCount(3) |
|
557 self.resultTable.setRowCount(0) |
|
558 self.resultTable.setRowCount(OFFSET) |
|
559 self.resultTable.setItem( |
|
560 row, 0, QTableWidgetItem(self.trUtf8("Regexp"))) |
|
561 self.resultTable.setItem( |
|
562 row, 1, QTableWidgetItem(regexp)) |
|
563 if response["matched"]: |
|
564 captures = response["captures"] |
|
565 # index 0 is the complete match |
|
566 offset = captures[0][1] |
|
567 self.lastMatchEnd = captures[0][2] |
|
568 self.nextButton.setEnabled(True) |
|
569 row += 1 |
|
570 self.resultTable.setItem(row, 0, |
|
571 QTableWidgetItem(self.trUtf8("Offset"))) |
|
572 self.resultTable.setItem(row, 1, |
|
573 QTableWidgetItem("{0:d}".format(offset))) |
|
574 |
|
575 row += 1 |
|
576 self.resultTable.setItem(row, 0, |
|
577 QTableWidgetItem(self.trUtf8("Captures"))) |
|
578 self.resultTable.setItem(row, 1, |
|
579 QTableWidgetItem("{0:d}".format(len(captures) - 1))) |
|
580 row += 1 |
|
581 self.resultTable.setItem(row, 1, |
|
582 QTableWidgetItem(self.trUtf8("Text"))) |
|
583 self.resultTable.setItem(row, 2, |
|
584 QTableWidgetItem(self.trUtf8("Characters"))) |
|
585 |
|
586 row += 1 |
|
587 self.resultTable.setItem(row, 0, |
|
588 QTableWidgetItem(self.trUtf8("Match"))) |
|
589 self.resultTable.setItem(row, 1, |
|
590 QTableWidgetItem(captures[0][0])) |
|
591 self.resultTable.setItem(row, 2, |
|
592 QTableWidgetItem("{0:d}".format(captures[0][3]))) |
|
593 |
|
594 for i in range(1, len(captures)): |
|
595 if captures[i][0]: |
|
596 row += 1 |
|
597 self.resultTable.insertRow(row) |
|
598 self.resultTable.setItem(row, 0, |
|
599 QTableWidgetItem( |
|
600 self.trUtf8("Capture #{0}").format(i))) |
|
601 self.resultTable.setItem(row, 1, |
|
602 QTableWidgetItem(captures[i][0])) |
|
603 self.resultTable.setItem(row, 2, |
|
604 QTableWidgetItem("{0:d}".format(captures[i][3]))) |
|
605 |
|
606 # highlight the matched text |
|
607 tc = self.textTextEdit.textCursor() |
|
608 tc.setPosition(offset) |
|
609 tc.setPosition(self.lastMatchEnd, QTextCursor.KeepAnchor) |
|
610 self.textTextEdit.setTextCursor(tc) |
|
611 else: |
|
612 self.nextButton.setEnabled(False) |
|
613 self.resultTable.setRowCount(2) |
|
614 row += 1 |
|
615 if startpos > 0: |
|
616 self.resultTable.setItem(row, 0, |
|
617 QTableWidgetItem(self.trUtf8("No more matches"))) |
|
618 else: |
|
619 self.resultTable.setItem(row, 0, |
|
620 QTableWidgetItem(self.trUtf8("No matches"))) |
|
621 |
|
622 # remove the highlight |
|
623 tc = self.textTextEdit.textCursor() |
|
624 tc.setPosition(0) |
|
625 self.textTextEdit.setTextCursor(tc) |
|
626 |
|
627 self.resultTable.resizeColumnsToContents() |
|
628 self.resultTable.resizeRowsToContents() |
|
629 self.resultTable.verticalHeader().hide() |
|
630 self.resultTable.horizontalHeader().hide() |
|
631 else: |
|
632 E5MessageBox.critical(self, |
|
633 self.trUtf8("Communication Error"), |
|
634 self.trUtf8("""Invalid response received from PyQt5 backend.""")) |
|
635 else: |
538 E5MessageBox.critical(self, |
636 E5MessageBox.critical(self, |
539 self.trUtf8("Error"), |
637 self.trUtf8("Communication Error"), |
540 self.trUtf8("""Invalid regular expression: {0}""") |
638 self.trUtf8("""Communication with PyQt5 backend failed.""")) |
541 .format(re.errorString())) |
|
542 # move cursor to error offset |
|
543 offset = re.errorPatternOffset() |
|
544 tc = self.regexpTextEdit.textCursor() |
|
545 tc.setPosition(offset) |
|
546 self.regexpTextEdit.setTextCursor(tc) |
|
547 return |
|
548 |
|
549 match = re.match(text, startpos) |
|
550 if match.hasMatch(): |
|
551 captures = match.lastCapturedIndex() |
|
552 else: |
|
553 captures = 0 |
|
554 row = 0 |
|
555 OFFSET = 5 |
|
556 |
|
557 self.resultTable.setColumnCount(0) |
|
558 self.resultTable.setColumnCount(3) |
|
559 self.resultTable.setRowCount(0) |
|
560 self.resultTable.setRowCount(OFFSET) |
|
561 self.resultTable.setItem(row, 0, QTableWidgetItem(self.trUtf8("Regexp"))) |
|
562 self.resultTable.setItem(row, 1, QTableWidgetItem(regex)) |
|
563 |
|
564 if match.hasMatch(): |
|
565 # index 0 is the complete match |
|
566 offset = match.capturedStart(0) |
|
567 self.lastMatchEnd = match.capturedEnd(0) |
|
568 self.nextButton.setEnabled(True) |
|
569 row += 1 |
|
570 self.resultTable.setItem(row, 0, |
|
571 QTableWidgetItem(self.trUtf8("Offset"))) |
|
572 self.resultTable.setItem(row, 1, |
|
573 QTableWidgetItem("{0:d}".format(match.capturedStart(0)))) |
|
574 |
|
575 row += 1 |
|
576 self.resultTable.setItem(row, 0, |
|
577 QTableWidgetItem(self.trUtf8("Captures"))) |
|
578 self.resultTable.setItem(row, 1, |
|
579 QTableWidgetItem("{0:d}".format(captures))) |
|
580 row += 1 |
|
581 self.resultTable.setItem(row, 1, |
|
582 QTableWidgetItem(self.trUtf8("Text"))) |
|
583 self.resultTable.setItem(row, 2, |
|
584 QTableWidgetItem(self.trUtf8("Characters"))) |
|
585 |
|
586 row += 1 |
|
587 self.resultTable.setItem(row, 0, |
|
588 QTableWidgetItem(self.trUtf8("Match"))) |
|
589 self.resultTable.setItem(row, 1, |
|
590 QTableWidgetItem(match.captured(0))) |
|
591 self.resultTable.setItem(row, 2, |
|
592 QTableWidgetItem("{0:d}".format(match.capturedLength(0)))) |
|
593 |
|
594 for i in range(1, captures + 1): |
|
595 if match.captured(i): |
|
596 row += 1 |
|
597 self.resultTable.insertRow(row) |
|
598 self.resultTable.setItem(row, 0, |
|
599 QTableWidgetItem(self.trUtf8("Capture #{0}").format(i))) |
|
600 self.resultTable.setItem(row, 1, |
|
601 QTableWidgetItem(match.captured(i))) |
|
602 self.resultTable.setItem(row, 2, |
|
603 QTableWidgetItem("{0:d}".format(match.capturedLength(i)))) |
|
604 |
|
605 # highlight the matched text |
|
606 tc = self.textTextEdit.textCursor() |
|
607 tc.setPosition(offset) |
|
608 tc.setPosition(self.lastMatchEnd, QTextCursor.KeepAnchor) |
|
609 self.textTextEdit.setTextCursor(tc) |
|
610 else: |
|
611 self.nextButton.setEnabled(False) |
|
612 self.resultTable.setRowCount(2) |
|
613 row += 1 |
|
614 if startpos > 0: |
|
615 self.resultTable.setItem(row, 0, |
|
616 QTableWidgetItem(self.trUtf8("No more matches"))) |
|
617 else: |
|
618 self.resultTable.setItem(row, 0, |
|
619 QTableWidgetItem(self.trUtf8("No matches"))) |
|
620 |
|
621 # remove the highlight |
|
622 tc = self.textTextEdit.textCursor() |
|
623 tc.setPosition(0) |
|
624 self.textTextEdit.setTextCursor(tc) |
|
625 |
|
626 self.resultTable.resizeColumnsToContents() |
|
627 self.resultTable.resizeRowsToContents() |
|
628 self.resultTable.verticalHeader().hide() |
|
629 self.resultTable.horizontalHeader().hide() |
|
630 else: |
639 else: |
631 E5MessageBox.critical(self, |
640 E5MessageBox.critical(self, |
632 self.trUtf8("Error"), |
641 self.trUtf8("Error"), |
633 self.trUtf8("""A regular expression and a text must be given.""")) |
642 self.trUtf8("""A regular expression and a text must be given.""")) |
634 |
643 |