← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~oliwee/openlp/1173749-2.0 into lp:openlp/2.0

 

Oliver Wieland has proposed merging lp:~oliwee/openlp/1173749-2.0 into lp:openlp/2.0.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #1173749 in OpenLP: "Songs with mismatching formatting tags still throw an exception"
  https://bugs.launchpad.net/openlp/+bug/1173749

For more details, see:
https://code.launchpad.net/~oliwee/openlp/1173749-2.0/+merge/181959

Partially fix of Bug 1173749.
Validates the tags in the lyrics on editing a song. If there are misplaced tags, a message box will appear.
-- 
https://code.launchpad.net/~oliwee/openlp/1173749-2.0/+merge/181959
Your team OpenLP Core is requested to review the proposed merge of lp:~oliwee/openlp/1173749-2.0 into lp:openlp/2.0.
=== modified file 'openlp/plugins/songs/forms/editsongform.py'
--- openlp/plugins/songs/forms/editsongform.py	2013-08-21 20:26:53 +0000
+++ openlp/plugins/songs/forms/editsongform.py	2013-08-24 16:04:28 +0000
@@ -132,6 +132,7 @@
         self.audioListWidget.setAlternatingRowColors(True)
         self.findVerseSplit = re.compile(u'---\[\]---\n', re.UNICODE)
         self.whitespace = re.compile(r'\W+', re.UNICODE)
+        self.find_tags = re.compile(u'\{/?\w+\}', re.UNICODE)
 
     def keyPressEvent(self, event):
         """
@@ -720,8 +721,45 @@
                 self.manager.save_object(book)
             else:
                 return False
+        for i in range(self.verseListWidget.rowCount()):
+            item = self.verseListWidget.item(i, 0)
+            tags = self.find_tags.findall(item.text())
+            if self._validate_tags(tags) == False:
+                field = unicode(item.data(QtCore.Qt.UserRole).toString())
+                verse_tag = VerseType.translated_name(field[0])
+                verse_num = field[1:]
+                critical_error_message_box(
+                    message=translate('SongsPlugin.EditSongForm',
+                    'There are misplaced tags in %s %s. '
+                    'You need to fix this problem first.' % (verse_tag, verse_num)))
+                return False
         return True
 
+    def _validate_tags(self, _tags):
+        """ 
+        Validates a list of tags
+        Deletes the first affiliated tag pair which is located side by side in the list
+        and call itself recursively with the shortened tag list. 
+        If there is any misplaced tag in the list, either the lenght of the tag list is not even, 
+        or the function won't find any tag pairs side by side.
+        If there is no misplaced tag, the length of the list will be zero on any recursive run.
+
+        Return:
+            True if the function can't find any mismatched tags
+            False if there are mismatched tags.
+        """
+        if len(_tags) % 2 != 0:
+            return False
+        
+        if len(_tags) == 0:
+            return True
+        
+        for i in range(len(_tags)-1):
+            if _tags[i+1] == "{/" + _tags[i][1:]:
+                del _tags[i:i+2]
+                return self._validate_tags(_tags)
+        return False
+
     def onCopyrightInsertButtonTriggered(self):
         text = self.copyrightEdit.text()
         pos = self.copyrightEdit.cursorPosition()