Warning, /sdk/pology/bin/pohybdl is written in an unsupported language. File is not indexed.
0001 #!/usr/bin/env python3
0002 # -*- coding: UTF-8 -*-
0003
0004 try:
0005 import fallback_import_paths
0006 except:
0007 pass
0008
0009 import sys
0010 import os
0011 import locale
0012 from tempfile import NamedTemporaryFile
0013
0014 from pology import version, _, n_
0015 from pology.catalog import Catalog
0016 from pology.message import MessageUnsafe
0017 from pology.lang.sr.wconv import tohi
0018 from pology.colors import ColorOptionParser
0019 from pology.comments import manc_parse_flag_list
0020 from pology.diff import msg_ediff, msg_ediff_to_new
0021 from pology.fsops import str_to_unicode, collect_catalogs
0022 from pology.fsops import collect_paths_cmdline
0023 from pology.msgreport import warning_on_msg, report_msg_content
0024 from pology.report import report, warning, error, format_item_list
0025 from pology.stdcmdopt import add_cmdopt_filesfrom
0026 from pology.vcs import available_vcs, make_vcs
0027
0028
0029 def _main ():
0030
0031 locale.setlocale(locale.LC_ALL, "")
0032
0033 usage= _("@info command usage",
0034 "%(cmd)s [OPTIONS] VCS [POPATHS...]",
0035 cmd="%prog")
0036 desc = _("@info command description",
0037 "Compose hybridized Ijekavian-Ekavian translation out of "
0038 "translation modified from Ekavian to Ijekavian or vice-versa.")
0039 ver = _("@info command version",
0040 "%(cmd)s (Pology) %(version)s\n"
0041 "Copyright © 2009, 2010 "
0042 "Chusslove Illich (Часлав Илић) <%(email)s>",
0043 cmd="%prog", version=version(), email="caslav.ilic@gmx.net")
0044
0045 opars = ColorOptionParser(usage=usage, description=desc, version=ver)
0046 opars.add_option(
0047 "-a", "--accept-changes",
0048 action="store_true", dest="accept_changes", default=False,
0049 help=_("@info command line option description",
0050 "Accept messages which have some changes between base "
0051 "and reconstructed base text."))
0052 opars.add_option(
0053 "-r", "--base-revision",
0054 metavar=_("@info command line value placeholder", "REVISION"),
0055 action="store", dest="base_revision", default=None,
0056 help=_("@info command line option description",
0057 "Use the given revision as base for hybridization, "
0058 "instead of local latest revision."))
0059 add_cmdopt_filesfrom(opars)
0060
0061 (options, free_args) = opars.parse_args(str_to_unicode(sys.argv[1:]))
0062
0063 try:
0064 import psyco
0065 psyco.full()
0066 except ImportError:
0067 pass
0068
0069 # Create VCS.
0070 if len(free_args) < 1:
0071 showvcs = list(set(available_vcs()).difference(["none"]))
0072 showvcs.sort()
0073 error(_("@info",
0074 "Version control system not given "
0075 "(can be one of: %(vcslist)s).",
0076 vcslist=format_item_list(showvcs)))
0077 vcskey = free_args.pop(0)
0078 if vcskey not in available_vcs(flat=True):
0079 error(_("@info",
0080 "Unknown version control system '%(vcs)s'.",
0081 vcs=vcskey))
0082 vcs = make_vcs(vcskey)
0083
0084 # Collect PO files in given paths.
0085 popaths = collect_paths_cmdline(rawpaths=free_args,
0086 filesfrom=options.files_from,
0087 elsecwd=True,
0088 respathf=collect_catalogs,
0089 abort=True)
0090
0091 # Catalogs must be under version control.
0092 for path in popaths:
0093 if not vcs.is_versioned(path):
0094 error(_("@info",
0095 "Catalog '%(file)s' is not under version control.",
0096 file=path))
0097
0098 # Go by modified PO file and hybridize it.
0099 for path in popaths:
0100 # Extract local head counterpart.
0101 tmpf = NamedTemporaryFile(prefix="pohybdl-export-", suffix=".po")
0102 if not vcs.export(path, options.base_revision, tmpf.name):
0103 error(_("@info",
0104 "Version control system cannot export file '%(file)s'.",
0105 file=path))
0106 # Hybridize by comparing local head and modified file.
0107 hybdl(path, tmpf.name, options.accept_changes)
0108
0109
0110 def hybdl (path, path0, accnohyb=False):
0111
0112 cat = Catalog(path)
0113 cat0 = Catalog(path0, monitored=False)
0114
0115 nhybridized = 0
0116 nstopped = 0
0117 for msg in cat:
0118
0119 if "no-hybdl" in manc_parse_flag_list(msg, "|"):
0120 continue
0121
0122 # Unembed diff if message was diffed for review.
0123 # Replace ediff with manual review flag.
0124 diffed = False
0125 for flag in msg.flag:
0126 if flag.startswith("ediff"):
0127 msg.flag.remove(flag)
0128 diffed = True
0129 if diffed:
0130 msg_ediff_to_new(msg, msg)
0131 msg.flag.add("reviewed")
0132
0133 # Fetch original message.
0134 msg0 = cat0.get(msg)
0135 if msg0 is None:
0136 warning_on_msg(_("@info",
0137 "Message does not exist in the original catalog."),
0138 msg, cat)
0139 nstopped += 1
0140 continue
0141 if len(msg.msgstr) != len(msg0.msgstr):
0142 warning_on_msg(_("@info",
0143 "Number of translations not same as in "
0144 "the original message."), msg, cat)
0145 nstopped += 1
0146 continue
0147 if msg.msgstr == msg0.msgstr:
0148 # No changes, nothing new to hybridize.
0149 continue
0150
0151 # Hybridize translation.
0152 textsh = []
0153 textshinv = []
0154 for text0, text in zip(msg0.msgstr, msg.msgstr):
0155 texth = tohi(text0, text, parthyb=True)
0156 textsh.append(texth)
0157 if not accnohyb:
0158 texthinv = tohi(text, text0, parthyb=True)
0159 textshinv.append(texthinv)
0160 if accnohyb or textsh == textshinv:
0161 for i, texth in zip(list(range(len(msg.msgstr))), textsh):
0162 msg.msgstr[i] = texth
0163 nhybridized += 1
0164 else:
0165 nstopped += 1
0166 msgh = MessageUnsafe(msg)
0167 msgh.msgstr = textsh
0168 msghinv = MessageUnsafe(msg)
0169 msghinv.msgstr = textshinv
0170 msg_ediff(msghinv, msgh, emsg=msgh, colorize=True)
0171 report_msg_content(msgh, cat, delim=("-" * 20))
0172
0173 if nstopped == 0:
0174 if cat.sync():
0175 report("! %s (%d)" % (path, nhybridized))
0176 else:
0177 warning(n_("@info",
0178 "%(num)d message in '%(file)s' cannot be "
0179 "cleanly hybridized.",
0180 "%(num)d messages in '%(file)s' cannot be "
0181 "cleanly hybridized.",
0182 num=nstopped, file=path))
0183 nhybridized = 0
0184
0185 return nhybridized
0186
0187
0188 if __name__ == '__main__':
0189 _main()
0190