File indexing completed on 2024-04-14 05:37:56

0001 # -*- coding: UTF-8 -*-
0002 
0003 """
0004 Convert delimitor-embedded context to Gettext context.
0005 
0006 Documented in C{doc/user/sieving.docbook}.
0007 
0008 @author: Chusslove Illich (Часлав Илић) <caslav.ilic@gmx.net>
0009 @license: GPLv3
0010 """
0011 
0012 from pology import _, n_
0013 from pology.escape import unescape_c as unescape
0014 from pology.msgreport import warning_on_msg
0015 from pology.report import report
0016 from pology.sieve import SieveError
0017 
0018 
0019 def setup_sieve (p):
0020 
0021     p.set_desc(_("@info sieve discription",
0022     "Convert delimiter-embedded context to Gettext context."
0023     ))
0024 
0025     p.add_param("head", str, mandatory=True,
0026                 metavar=_("@info sieve parameter value placeholder", "STRING"),
0027                 desc=_("@info sieve parameter discription",
0028     "Start of the msgid field which indicates that the context follows."
0029     ))
0030     p.add_param("tail", str, mandatory=True,
0031                 metavar=_("@info sieve parameter value placeholder", "STRING"),
0032                 desc=_("@info sieve parameter discription",
0033     "End of context in msgid field, after which the text follows."
0034     ))
0035 
0036 
0037 class Sieve (object):
0038 
0039     def __init__ (self, params):
0040 
0041         self.nconv = 0
0042 
0043         self.chead = unescape(params.head)
0044         if not self.chead:
0045             raise SieveError(
0046                 _("@info", "Context head cannot be empty string."))
0047         self.ctail = unescape(params.tail)
0048         if not self.ctail:
0049             raise SieveError(
0050                 _("@info", "Context tail cannot be empty string."))
0051 
0052 
0053     def process (self, msg, cat):
0054 
0055         # Skip messages already having Gettext context.
0056         if msg.msgctxt or msg.msgctxt_previous:
0057             return
0058 
0059         msrc = (cat.filename, msg.refline, msg.refentry)
0060 
0061         if msg.msgid.startswith(self.chead):
0062             pos = msg.msgid.find(self.ctail)
0063             if pos < 0:
0064                 warning_on_msg(_("@info",
0065                                  "Malformed embedded context."), msg, cat)
0066                 return
0067 
0068             ctxt = msg.msgid[len(self.chead):pos]
0069             text = msg.msgid[pos + len(self.ctail):]
0070 
0071             if not ctxt or not text:
0072                 warning_on_msg(_("@info", "Empty context or text."), msg, cat)
0073                 return
0074 
0075             exmsgs = cat.select_by_key(ctxt, text, wobs=True)
0076             if exmsgs:
0077                 exmsg = exmsgs[0]
0078                 if not msg.obsolete and exmsg.obsolete:
0079                     cat.remove_on_sync(exmsg)
0080                 elif msg.obsolete and not exmsg.obsolete:
0081                     cat.remove_on_sync(msg)
0082                     return
0083                 else:
0084                     warning_on_msg(
0085                         _("@info",
0086                           "A non-obsolete message with same context and text "
0087                           "already exist."), msg, cat)
0088                     return
0089 
0090             msg.msgctxt = ctxt
0091             msg.msgid = text
0092             self.nconv += 1
0093 
0094 
0095     def finalize (self):
0096 
0097         if self.nconv > 0:
0098             msg = n_("@info:progress",
0099                      "Converted %(num)d delimiter-embedded context.",
0100                      "Converted %(num)d delimiter-embedded contexts.",
0101                      num=self.nconv)
0102             report("===== " + msg)
0103