File indexing completed on 2023-05-30 12:24:31
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