Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(88)

Issue 62: CPO support for previous messages

Unified Diff

File: translate/storage/cpo.py
Patch Set: Fixed minor issues Created 1 year, 5 months ago
Jump to:
View side by-side-diff with in line comments
Index: translate/storage/cpo.py
===================================================================
--- translate/storage/cpo.py	(revision 7803)
+++ translate/storage/cpo.py	(working copy)
@@ -140,6 +140,9 @@
 gpo.po_message_set_extracted_comments.argtypes = [c_int, STRING]
 gpo.po_message_set_fuzzy.argtypes = [c_int, c_int]
 gpo.po_message_set_msgctxt.argtypes = [c_int, STRING]
+gpo.po_message_set_prev_msgctxt.argtypes = [c_int, STRING]
+gpo.po_message_set_prev_msgid.argtypes = [c_int, STRING]
+gpo.po_message_set_prev_msgid_plural.argtypes = [c_int, STRING]
 
 # Setup the po_xerror_handler
 xerror_handler = po_xerror_handler()
@@ -195,6 +198,72 @@
         gpo.po_message_set_msgid_plural(self._gpo_message, msgid_plural)
     msgid_plural = property(None, setmsgid_plural)
 
+    def setprev_context(self, context):
+        """Set the previous context for this message"""
+        if self.isfuzzy():
+            return
+        gpo.po_message_set_prev_msgctxt(self._gpo_message, context)
+
+    def getprev_context(self):
+        """Get the previous context for this message, if any """
+        prev_ctxt = gpo.po_message_prev_msgctxt(self._gpo_message)
+        if not prev_ctxt:
+            return ""
+        return prev_ctxt
+
+    prev_context = property(getprev_context, setprev_context)
+
+    def setprev_source(self, prev_source):
+        """Set msgid as a previous msgid for this message"""
+        if self.isfuzzy():
+            return
+        if not self.source:
+            return
+        if isinstance(prev_source, multistring):
+            prev_source = prev_source.strings
+        if isinstance(prev_source, unicode):
+            prev_source = prev_source.encode(self._encoding)
+        if isinstance(prev_source, list):
+            if  len(prev_source) > 1:
+                msgid_plural = str(prev_source[1])
+                if isinstance(msgid_plural, list):
+                    msgid_plural = "".join(msgid_plural)
+
+                gpo.po_message_set_prev_msgid_plural(self._gpo_message,
+                                                     msgid_plural)
+            prev_source = str(prev_source[0])
+
+        gpo.po_message_set_prev_msgid(self._gpo_message, prev_source)
+
+    def getprev_source(self):
+        """Get the previous msgid for this message, if any"""
+        prev_source = gpo.po_message_prev_msgid(self._gpo_message)
+        if not prev_source:
+            return multistring(u"")
+
+        prev_source = multistring(prev_source, self._encoding)
+        prev_plural = gpo.po_message_prev_msgid_plural(self._gpo_message)
+        if prev_plural:
+            prev_source.strings.append(prev_plural.decode(self._encoding))
+        return prev_source
+
+    prev_source = property(getprev_source, setprev_source)
+
+    def set_as_previous(self):
+        """Sets the current msgid as previous message. Then, the current
+        msgid could be filled with a new msgid. Note that, if a unit
+        contains a previous msgid, it also is marked as fuzzy (to keep the
+        same behavior as msgmerge).
+        """
+        if not self.target:
+            return
+        # since the context accessor might also return KDE style comments, I'm
+        # just using the libgettextpo accessor to retrive only the context
+        self.prev_context = gpo.po_message_msgctxt(self._gpo_message)
+        self.prev_source = self.source
+        self.source = ""
+        self.markfuzzy()
+
     def getsource(self):
         def remove_msgid_comments(text):
             if not text:

Powered by Google App Engine
This is Rietveld r159