Toshaan Bharvani
2 years ago
commit
3f6805e4ba
6 changed files with 1852 additions and 0 deletions
@ -0,0 +1,68 @@
@@ -0,0 +1,68 @@
|
||||
diff --git a/gettext-tools/src/msgl-cat.c b/gettext-tools/src/msgl-cat.c |
||||
index 990d39e..9814502 100644 |
||||
--- a/gettext-tools/src/msgl-cat.c |
||||
+++ b/gettext-tools/src/msgl-cat.c |
||||
@@ -306,6 +306,7 @@ catenate_msgdomain_list (string_list_ty *file_list, |
||||
mp->msgid); |
||||
multiline_error (xstrdup (""), |
||||
xasprintf ("%s\n", errormsg)); |
||||
+ free (errormsg); |
||||
} |
||||
} |
||||
else |
||||
diff --git a/gettext-tools/src/x-csharp.c b/gettext-tools/src/x-csharp.c |
||||
index 5cf72ad..7a0e5d3 100644 |
||||
--- a/gettext-tools/src/x-csharp.c |
||||
+++ b/gettext-tools/src/x-csharp.c |
||||
@@ -560,6 +560,7 @@ comment_line_end (size_t chars_to_remove) |
||||
buffer[buflen] = '\0'; |
||||
savable_comment_add (buffer); |
||||
lexical_context = lc_outside; |
||||
+ free (buffer); |
||||
} |
||||
|
||||
|
||||
diff --git a/gettext-tools/src/x-java.c b/gettext-tools/src/x-java.c |
||||
index eff1e6f..7e1bb78 100644 |
||||
--- a/gettext-tools/src/x-java.c |
||||
+++ b/gettext-tools/src/x-java.c |
||||
@@ -460,6 +460,7 @@ comment_line_end (size_t chars_to_remove) |
||||
--buflen; |
||||
buffer[buflen] = '\0'; |
||||
savable_comment_add (buffer); |
||||
+ free (buffer); |
||||
} |
||||
|
||||
|
||||
diff --git a/gettext-tools/src/x-rst.c b/gettext-tools/src/x-rst.c |
||||
index cde1ee6..fca441e 100644 |
||||
--- a/gettext-tools/src/x-rst.c |
||||
+++ b/gettext-tools/src/x-rst.c |
||||
@@ -651,6 +651,7 @@ extract_rsj (FILE *f, |
||||
else |
||||
goto invalid_rsj; |
||||
|
||||
+ free (s1); |
||||
/* Parse a comma. */ |
||||
c = phase2_getc (); |
||||
if (c == '}') |
||||
@@ -667,6 +668,7 @@ extract_rsj (FILE *f, |
||||
|
||||
fp = NULL; |
||||
real_file_name = NULL; |
||||
+ free (logical_file_name); |
||||
logical_file_name = NULL; |
||||
line_number = 0; |
||||
|
||||
diff --git a/gettext-tools/src/xg-arglist-callshape.c b/gettext-tools/src/xg-arglist-callshape.c |
||||
index 06b7076..2189aac 100644 |
||||
--- a/gettext-tools/src/xg-arglist-callshape.c |
||||
+++ b/gettext-tools/src/xg-arglist-callshape.c |
||||
@@ -118,6 +118,7 @@ split_keywordspec (const char *spec, |
||||
memcpy (xcomment, xcomment_start, xcomment_len); |
||||
xcomment[xcomment_len] = '\0'; |
||||
string_list_append (&xcomments, xcomment); |
||||
+ free (xcomment); |
||||
} |
||||
else |
||||
break; |
@ -0,0 +1,128 @@
@@ -0,0 +1,128 @@
|
||||
diff --git a/Makefile.am b/Makefile.am |
||||
index 815e3c7..e897de7 100644 |
||||
--- a/Makefile.am |
||||
+++ b/Makefile.am |
||||
@@ -19,7 +19,7 @@ |
||||
AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies |
||||
ACLOCAL_AMFLAGS = -I m4 |
||||
|
||||
-SUBDIRS = gnulib-local gettext-runtime libtextstyle gettext-tools |
||||
+SUBDIRS = gnulib-local gettext-runtime gettext-tools |
||||
|
||||
changelog_etc = \ |
||||
gettext-runtime/ChangeLog.0 \ |
||||
@@ -123,7 +123,6 @@ distcheck-hook: |
||||
test "`sed 1,16d $(srcdir)/gettext-runtime/intl/xsize.h | md5sum`" = "`sed 1,16d $(srcdir)/gettext-tools/gnulib-lib/xsize.h | md5sum`" |
||||
cmp -s $(srcdir)/gettext-runtime/man/help2man $(srcdir)/gettext-tools/man/help2man |
||||
cmp -s $(srcdir)/gettext-runtime/man/x-to-1.in $(srcdir)/gettext-tools/man/x-to-1.in |
||||
- cmp -s $(srcdir)/libtextstyle/m4/libtextstyle.m4 $(srcdir)/gettext-tools/gnulib-m4/libtextstyle.m4 |
||||
cmp -s $(srcdir)/gettext-tools/examples/hello-java-awt/m4/TestAWT.java $(srcdir)/gettext-tools/examples/hello-java-swing/m4/TestAWT.java |
||||
cmp -s $(srcdir)/gettext-tools/examples/hello-java-awt/m4/TestAWT.class $(srcdir)/gettext-tools/examples/hello-java-swing/m4/TestAWT.class |
||||
test "`sed 1,15d $(srcdir)/gnulib-local/lib/alloca.in.h | md5sum`" = "`sed 1,15d $(srcdir)/gettext-runtime/libasprintf/alloca.in.h | md5sum`" |
||||
diff --git a/configure.ac b/configure.ac |
||||
index 49689fb..2d23b44 100644 |
||||
--- a/configure.ac |
||||
+++ b/configure.ac |
||||
@@ -37,7 +37,7 @@ dnl Checks for typedefs, structures, and compiler characteristics. |
||||
|
||||
dnl Checks for library functions. |
||||
|
||||
-AC_CONFIG_SUBDIRS([gettext-runtime libtextstyle gettext-tools]) |
||||
+AC_CONFIG_SUBDIRS([gettext-runtime gettext-tools]) |
||||
|
||||
AM_EXTRA_RECURSIVE_TARGETS([maintainer-update-po]) |
||||
|
||||
@@ -49,7 +49,7 @@ AC_CANONICAL_HOST |
||||
dnl Optional Features: AC_ARG_ENABLE calls |
||||
dnl Optional Packages: AC_ARG_WITH calls |
||||
dnl Some influential environment variables: AC_ARG_VAR calls |
||||
-esyscmd([{ cd gettext-runtime && autoconf --trace=AC_ARG_ENABLE:'$n([$1],[$2])' --trace=AC_ARG_WITH:'$n([$1],[$2])' --trace=AC_ARG_VAR:'$n($@)' && cd ..; cd libtextstyle && autoconf --trace=AC_ARG_ENABLE:'$n([$1],[$2])' --trace=AC_ARG_WITH:'$n([$1],[$2])' --trace=AC_ARG_VAR:'$n($@)' && cd ..; { cd gettext-tools && autoconf --trace=AC_ARG_ENABLE:'$n([$1],[$2])' --trace=AC_ARG_WITH:'$n([$1],[$2])' --trace=AC_ARG_VAR:'$n($@)' && cd ..; } | grep -v installed.libtextstyle | grep -v installed.csharp | grep -v 'installed C#'; } | sed -f build-aux/ac-help.sed ]) |
||||
+esyscmd([{ cd gettext-runtime && autoconf --trace=AC_ARG_ENABLE:'$n([$1],[$2])' --trace=AC_ARG_WITH:'$n([$1],[$2])' --trace=AC_ARG_VAR:'$n($@)' && cd ..; { cd gettext-tools && autoconf --trace=AC_ARG_ENABLE:'$n([$1],[$2])' --trace=AC_ARG_WITH:'$n([$1],[$2])' --trace=AC_ARG_VAR:'$n($@)' && cd ..; } | grep -v installed.csharp | grep -v 'installed C#'; } | sed -f build-aux/ac-help.sed ]) |
||||
|
||||
AC_CONFIG_FILES([Makefile]) |
||||
|
||||
diff --git a/gettext-tools/Makefile.am b/gettext-tools/Makefile.am |
||||
index 449a797..c5719c2 100644 |
||||
--- a/gettext-tools/Makefile.am |
||||
+++ b/gettext-tools/Makefile.am |
||||
@@ -19,7 +19,7 @@ |
||||
AUTOMAKE_OPTIONS = 1.5 gnu no-dependencies |
||||
ACLOCAL_AMFLAGS = -I m4 -I ../gettext-runtime/m4 -I ../m4 -I gnulib-m4 -I libgrep/gnulib-m4 -I libgettextpo/gnulib-m4 |
||||
|
||||
-SUBDIRS = intl gnulib-lib libgrep src libgettextpo po its projects styles emacs misc man m4 tests system-tests gnulib-tests examples doc |
||||
+SUBDIRS = intl gnulib-lib libgrep libgettextpo src po its projects styles emacs misc man m4 tests system-tests gnulib-tests examples doc |
||||
|
||||
EXTRA_DIST = misc/DISCLAIM |
||||
MOSTLYCLEANFILES = core *.stackdump |
||||
diff --git a/gettext-tools/libgettextpo/textstyle.in.h b/gettext-tools/libgettextpo/textstyle.in.h |
||||
index 536b51b..585ce66 100644 |
||||
--- a/gettext-tools/libgettextpo/textstyle.in.h |
||||
+++ b/gettext-tools/libgettextpo/textstyle.in.h |
||||
@@ -213,7 +213,8 @@ typedef ostream_t file_ostream_t; |
||||
static inline file_ostream_t |
||||
file_ostream_create (FILE *fp) |
||||
{ |
||||
- return fp; |
||||
+ /* Closing the stream we return should not close 'fp'. */ |
||||
+ return fdopen (dup (fileno (fp)), "w"); |
||||
} |
||||
|
||||
/* --------------------------- From fd-ostream.h --------------------------- */ |
||||
@@ -413,6 +414,30 @@ html_styled_ostream_create (ostream_t destination _GL_UNUSED, |
||||
return NULL; |
||||
} |
||||
|
||||
+/* ----------------------- From noop-styled-ostream.h ----------------------- */ |
||||
+ |
||||
+/* noop_styled_ostream_t is a subtype of ostream_t. */ |
||||
+typedef ostream_t noop_styled_ostream_t; |
||||
+ |
||||
+#define noop_styled_ostream_write_mem ostream_write_mem |
||||
+#define noop_styled_ostream_flush ostream_flush |
||||
+#define noop_styled_ostream_free ostream_free |
||||
+#define noop_styled_ostream_begin_use_class styled_ostream_begin_use_class |
||||
+#define noop_styled_ostream_end_use_class styled_ostream_end_use_class |
||||
+#define noop_styled_ostream_get_hyperlink_ref styled_ostream_get_hyperlink_ref |
||||
+#define noop_styled_ostream_get_hyperlink_id styled_ostream_get_hyperlink_id |
||||
+#define noop_styled_ostream_set_hyperlink styled_ostream_set_hyperlink |
||||
+#define noop_styled_ostream_flush_to_current_style styled_ostream_flush_to_current_style |
||||
+ |
||||
+static inline ostream_t |
||||
+noop_styled_ostream_create (ostream_t destination, bool pass_ownership) |
||||
+{ |
||||
+ if (pass_ownership) |
||||
+ return destination; |
||||
+ else |
||||
+ return fdopen (dup (fileno (destination)), "w"); |
||||
+} |
||||
+ |
||||
/* ------------------------------ From color.h ------------------------------ */ |
||||
|
||||
#define color_test_mode false |
||||
diff --git a/gettext-tools/src/Makefile.am b/gettext-tools/src/Makefile.am |
||||
index 764ffad..eccfbbd 100644 |
||||
--- a/gettext-tools/src/Makefile.am |
||||
+++ b/gettext-tools/src/Makefile.am |
||||
@@ -292,19 +292,9 @@ cldr_plurals_SOURCES = cldr-plural.y cldr-plural-exp.c cldr-plurals.c |
||||
cldr_plurals_CFLAGS = $(AM_CFLAGS) $(INCXML) |
||||
cldr_plurals_LDADD = libgettextsrc.la $(LDADD) |
||||
|
||||
-if USE_INSTALLED_LIBTEXTSTYLE |
||||
-LT_LIBTEXTSTYLE = @LTLIBTEXTSTYLE@ |
||||
-else |
||||
-# How to get the include files of libtextstyle. |
||||
-textstyle.h textstyle/stdbool.h textstyle/version.h textstyle/woe32dll.h: |
||||
- here=`pwd`; \ |
||||
- cd ../../libtextstyle/lib && \ |
||||
- $(MAKE) install-nobase_includeHEADERS install-nobase_nodist_includeHEADERS includedir="$$here" |
||||
-BUILT_SOURCES += textstyle.h textstyle/stdbool.h textstyle/version.h textstyle/woe32dll.h |
||||
-MOSTLYCLEANFILES += textstyle.h textstyle/stdbool.h textstyle/version.h textstyle/woe32dll.h |
||||
-# Where to find the built libtextstyle library. |
||||
-LT_LIBTEXTSTYLE = ../../libtextstyle/lib/libtextstyle.la |
||||
-endif |
||||
+# Use the dummy libtextstyle from gnulib, as libgettextpo does. |
||||
+LT_LIBTEXTSTYLE = |
||||
+AM_CPPFLAGS += -I../libgettextpo -I$(top_srcdir)/libgettextpo |
||||
|
||||
# How to build libgettextsrc.la. |
||||
# Need ../gnulib-lib/libgettextlib.la. |
@ -0,0 +1,44 @@
@@ -0,0 +1,44 @@
|
||||
From 175e0bc72808d564074c4adcc72aeadb74adfcc6 Mon Sep 17 00:00:00 2001 |
||||
From: Paul Eggert <eggert@cs.ucla.edu> |
||||
Date: Thu, 27 Aug 2020 17:52:58 -0700 |
||||
Subject: [PATCH] perror, strerror_r: remove unportable tests |
||||
|
||||
Problem reported by Florian Weimer in: |
||||
https://lists.gnu.org/r/bug-gnulib/2020-08/msg00220.html |
||||
* tests/test-perror2.c (main): |
||||
* tests/test-strerror_r.c (main): Omit unportable tests. |
||||
--- |
||||
ChangeLog | 8 ++++++++ |
||||
tests/test-perror2.c | 3 --- |
||||
tests/test-strerror_r.c | 3 --- |
||||
3 files changed, 8 insertions(+), 6 deletions(-) |
||||
|
||||
diff --git a/gettext-tools/gnulib-tests/test-perror2.c b/gettext-tools/gnulib-tests/test-perror2.c |
||||
index 1d14eda7b..c6214dd25 100644 |
||||
--- a/gettext-tools/gnulib-tests/test-perror2.c |
||||
+++ b/gettext-tools/gnulib-tests/test-perror2.c |
||||
@@ -79,9 +79,6 @@ main (void) |
||||
errno = -5; |
||||
perror (""); |
||||
ASSERT (!ferror (stderr)); |
||||
- ASSERT (msg1 == msg2 || msg1 == msg4 || STREQ (msg1, str1)); |
||||
- ASSERT (msg2 == msg4 || STREQ (msg2, str2)); |
||||
- ASSERT (msg3 == msg4 || STREQ (msg3, str3)); |
||||
ASSERT (STREQ (msg4, str4)); |
||||
|
||||
free (str1); |
||||
diff --git a/gettext-tools/gnulib-tests/test-strerror_r.c b/gettext-tools/gnulib-tests/test-strerror_r.c |
||||
index b11d6fd9f..c1dbcf837 100644 |
||||
--- a/gettext-tools/gnulib-tests/test-strerror_r.c |
||||
+++ b/gettext-tools/gnulib-tests/test-strerror_r.c |
||||
@@ -165,9 +165,6 @@ main (void) |
||||
|
||||
strerror_r (EACCES, buf, sizeof buf); |
||||
strerror_r (-5, buf, sizeof buf); |
||||
- ASSERT (msg1 == msg2 || msg1 == msg4 || STREQ (msg1, str1)); |
||||
- ASSERT (msg2 == msg4 || STREQ (msg2, str2)); |
||||
- ASSERT (msg3 == msg4 || STREQ (msg3, str3)); |
||||
ASSERT (STREQ (msg4, str4)); |
||||
|
||||
free (str1); |
||||
|
@ -0,0 +1,45 @@
@@ -0,0 +1,45 @@
|
||||
.TH MSGHACK "1" "June 2013" "msghack" "User Commands" |
||||
.SH NAME |
||||
msghack \- alter PO files in ways |
||||
.SH SYNOPSIS |
||||
.B msghack |
||||
[\fIOPTION\fR] \fIfile.po \fR[\fIref.po\fR] |
||||
.SH DESCRIPTION |
||||
.PP |
||||
This program can be used to alter .po files in ways no sane mind would think about. |
||||
.TP |
||||
\fB\-o\fR |
||||
result will be written to FILE |
||||
.TP |
||||
\fB\-\-invert\fR |
||||
invert a po file by switching msgid and msgstr |
||||
.TP |
||||
\fB\-\-master\fR |
||||
join any number of files in a master\-formatted catalog |
||||
.TP |
||||
\fB\-\-empty\fR |
||||
empty the contents of the .po file, creating a .pot |
||||
.TP |
||||
\fB\-\-append\fR |
||||
append entries from ref.po that don't exist in file.po |
||||
.PP |
||||
Note: It is just a replacement of msghack for backward support. |
||||
.PP |
||||
This program can be used to alter .po files in ways no sane mind would think about. |
||||
.TP |
||||
\fB\-o\fR |
||||
result will be written to FILE |
||||
.TP |
||||
\fB\-\-invert\fR |
||||
invert a po file by switching msgid and msgstr |
||||
.TP |
||||
\fB\-\-master\fR |
||||
join any number of files in a master\-formatted catalog |
||||
.TP |
||||
\fB\-\-empty\fR |
||||
empty the contents of the .po file, creating a .pot |
||||
.TP |
||||
\fB\-\-append\fR |
||||
append entries from ref.po that don't exist in file.po |
||||
.PP |
||||
Note: It is just a replacement of msghack for backward support. |
@ -0,0 +1,417 @@
@@ -0,0 +1,417 @@
|
||||
#!/usr/bin/python3 |
||||
## -*- coding: utf-8 -*- |
||||
## Copyright (C) 2001, 2004, 2008, 2012 Red Hat, Inc. |
||||
## Copyright (C) 2001 Trond Eivind Glomsrød <teg@redhat.com> |
||||
|
||||
## This program is free software: you can redistribute it and/or modify |
||||
## it under the terms of the GNU General Public License as published by |
||||
## the Free Software Foundation, either version 3 of the License, or |
||||
## (at your option) any later version. |
||||
|
||||
## This program is distributed in the hope that it will be useful, |
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
## GNU General Public License for more details. |
||||
|
||||
## You should have received a copy of the GNU General Public License |
||||
## along with this program. If not, see <http://www.gnu.org/licenses/>. |
||||
|
||||
""" |
||||
A msghack replacement |
||||
""" |
||||
|
||||
import sys |
||||
|
||||
class GTMessage: |
||||
""" |
||||
A class containing a message, its msgid and various references pointing at it |
||||
""" |
||||
|
||||
def __init__(self,id=None,message=None,refs=[]): |
||||
""" |
||||
The constructor for the GTMessage class |
||||
@self The object instance |
||||
@message The message |
||||
@id The messageid associated with the object |
||||
""" |
||||
self._message=message.strip() |
||||
self._id=id.strip() |
||||
self._refs=[] |
||||
for ref in refs: |
||||
self._refs.append(ref) |
||||
|
||||
def __str__(self): |
||||
""" |
||||
Return a string representation of the object |
||||
@self The object instance |
||||
""" |
||||
res="" |
||||
for ref in self._refs: |
||||
res=res+ref+"\n" |
||||
res=res+"msgid %s\nmsgstr %s\n" % (self._id,self._message) |
||||
return res |
||||
|
||||
def invertedStrings(self): |
||||
""" |
||||
Returns a string representation, but with msgid and msgstr inverted. |
||||
Note: Don't invert the "" string |
||||
@self The object instance |
||||
""" |
||||
res="" |
||||
for ref in self._refs: |
||||
res=res+ref+"\n" |
||||
if not self._id=="\"\"": |
||||
res=res+"msgid %s\nmsgstr %s\n" % (self._message,self._id) |
||||
else: |
||||
res=res+"msgid %s\nmsgstr %s\n" % (self._id,self._message) |
||||
return res |
||||
|
||||
def emptyMsgStrings(self): |
||||
""" |
||||
Return a string representation of the object, but leave the msgstr |
||||
empty - create a pot file from a po file |
||||
Note: Won't remove the "" string |
||||
@self The object instance |
||||
""" |
||||
res="" |
||||
for ref in self._refs: |
||||
res=res+ref+"\n" |
||||
if not self._id=="\"\"": |
||||
res=res+"msgid %s\nmsgstr \"\"\n" % (self._id) |
||||
else: |
||||
res=res+"msgid %s\nmsgstr %s\n" % (self._id,self._message) |
||||
return res |
||||
|
||||
def compareMessage(self,msg): |
||||
""" |
||||
Return if the messages have identical msgids, 0 otherwise |
||||
@self The object instance |
||||
@msg The message to compare to |
||||
""" |
||||
|
||||
if self._id == msg._id: |
||||
return 1 |
||||
return 0 |
||||
|
||||
|
||||
class GTMasterMessage: |
||||
""" |
||||
A class containing a message, its msgid and various references pointing at it |
||||
The difference between GTMessage and GTMasterMessage is that this class |
||||
can do less operations, but is able to store multiple msgstrs with identifiers |
||||
(usually language, like 'msgst(no)' |
||||
""" |
||||
|
||||
def __init__(self,id=None,refs=[]): |
||||
""" |
||||
The constructor for the GTMessage class |
||||
@self The object instance |
||||
@id The messageid associated with the object |
||||
""" |
||||
self._id=id |
||||
self._refs=[] |
||||
self._messages=[] |
||||
for ref in refs: |
||||
self._refs.append(ref) |
||||
|
||||
def addMessage(self,message,identifier): |
||||
""" |
||||
Add a new message and identifier to the GTMasterMessage object |
||||
@self The object instance |
||||
@message The message to append |
||||
@identifier The identifier of the message |
||||
""" |
||||
self._messages.append((identifier,message)) |
||||
|
||||
def __str__(self): |
||||
""" |
||||
Return a string representation of the object |
||||
@self The object instance |
||||
""" |
||||
res="" |
||||
for ref in self._refs: |
||||
res=res+ref+"\n" |
||||
res=res+"msgid %s\n" % self._id |
||||
for message in self._messages: |
||||
res=res+"msgstr(%s) %s\n" %(message[0],message[1]) |
||||
res=res+"\n" |
||||
return res |
||||
|
||||
class GTFile: |
||||
""" |
||||
A class containing the GTMessages contained in a file |
||||
""" |
||||
|
||||
def __init__(self,filename): |
||||
""" |
||||
The constructor of the GTMFile class |
||||
@self The object instance |
||||
@filename The file to initialize from |
||||
""" |
||||
self._filename=filename |
||||
self._messages=[] |
||||
self.readFile(filename) |
||||
|
||||
def __str__(self): |
||||
""" |
||||
Return a string representation of the object |
||||
@self The object instance |
||||
""" |
||||
res="" |
||||
for message in self._messages: |
||||
res=res+str(message)+"\n" |
||||
return res |
||||
|
||||
def invertedStrings(self): |
||||
""" |
||||
Return a string representation of the object, with msgid and msgstr |
||||
swapped. Will remove duplicates... |
||||
@self The object instance |
||||
""" |
||||
|
||||
msght={} |
||||
msgar=[] |
||||
|
||||
for message in self._messages: |
||||
if message._id=='""' and len(msgar)==0: |
||||
msgar.append(GTMessage(message._id,message._message,message._refs)) |
||||
continue |
||||
msg=GTMessage(message._message,message._id,message._refs) |
||||
if msg._id not in msght: |
||||
msght[msg._id]=msg |
||||
msgar.append(msg) |
||||
else: |
||||
msg2=msght[msg._id] |
||||
for ref in msg._refs: |
||||
msg2._refs.append(ref) |
||||
res="" |
||||
for message in msgar: |
||||
res=res+str(message)+"\n" |
||||
return res |
||||
|
||||
def msgidDupes(self): |
||||
""" |
||||
Search for duplicates in the msgids. |
||||
@self The object instance |
||||
""" |
||||
msgids={} |
||||
res="" |
||||
for message in self._messages: |
||||
msgid=message._id |
||||
if msgid in msgids: |
||||
res=res+"Duplicate: %s\n" % (msgid) |
||||
else: |
||||
msgids[msgid]=1 |
||||
return res |
||||
|
||||
def getMsgstr(self,msgid): |
||||
""" |
||||
Return the msgstr matching the given id. 'None' if missing |
||||
@self The object instance |
||||
@msgid The msgid key |
||||
""" |
||||
|
||||
for message in self._messages: |
||||
if msgid == message._id: |
||||
return message._message |
||||
return None |
||||
|
||||
def emptyMsgStrings(self): |
||||
""" |
||||
Return a string representation of the object, but leave the msgstr |
||||
empty - create a pot file from a po file |
||||
@self The object instance |
||||
""" |
||||
|
||||
res="" |
||||
for message in self._messages: |
||||
res=res+message.emptyMsgStrings()+"\n" |
||||
return res |
||||
|
||||
|
||||
def append(self,B): |
||||
""" |
||||
Append entries from dictionary B which aren't |
||||
already present in this dictionary |
||||
@self The object instance |
||||
@B the dictionary to append messages from |
||||
""" |
||||
|
||||
for message in B._messages: |
||||
if not self.getMsgstr(message._id): |
||||
self._messages.append(message) |
||||
|
||||
|
||||
def readFile(self,filename): |
||||
""" |
||||
Read the contents of a file into the GTFile object |
||||
@self The object instance |
||||
@filename The name of the file to read |
||||
""" |
||||
|
||||
file=open(filename,"r") |
||||
msgid="" |
||||
msgstr="" |
||||
refs=[] |
||||
lines=[] |
||||
inmsgid=0 |
||||
inmsgstr=0 |
||||
templines=file.readlines() |
||||
for line in templines: |
||||
lines.append(line.strip()) |
||||
for line in lines: |
||||
pos=line.find('"') |
||||
pos2=line.rfind('"') |
||||
if line and line[0]=="#": |
||||
refs.append(line.strip()) |
||||
if inmsgstr==0 and line[:6]=="msgstr": |
||||
msgstr="" |
||||
inmsgstr=1 |
||||
inmsgid=0 |
||||
if inmsgstr==1: |
||||
if pos==-1: |
||||
inmsgstr=0 |
||||
#Handle entries with and without "" consistently |
||||
if msgid[:2]=='""' and len(msgid)>4: |
||||
msgid=msgid[2:] |
||||
if msgstr[:2]=='""' and len(msgstr)>4: |
||||
msgstr=msgstr[2:] |
||||
message=GTMessage(msgid,msgstr,refs) |
||||
self._messages.append(message) |
||||
msgstr="" |
||||
msgid="" |
||||
refs=[] |
||||
else: |
||||
msgstr=msgstr+line[pos:pos2+1]+"\n" |
||||
if inmsgid==0 and line[:5]=="msgid": |
||||
msgid="" |
||||
inmsgid=1 |
||||
if inmsgid==1: |
||||
if pos==-1: |
||||
inmsgid=0 |
||||
else: |
||||
msgid=msgid+line[pos:pos2+1]+"\n" |
||||
if msgstr and msgid: |
||||
message=GTMessage(msgid,msgstr,refs) |
||||
self._messages.append(message) |
||||
|
||||
|
||||
class GTMaster: |
||||
""" |
||||
A class containing a master catalogue of gettext dictionaries |
||||
""" |
||||
|
||||
def __init__(self,dicts): |
||||
""" |
||||
The constructor for the GTMaster class |
||||
@self The object instance |
||||
@dicts An array of dictionaries to merge |
||||
""" |
||||
self._messages=[] |
||||
self.createMaster(dicts) |
||||
|
||||
def createMaster(self,dicts): |
||||
""" |
||||
Create the master catalogue |
||||
@self The object instance |
||||
@dicts An array of dictionaries to merge |
||||
""" |
||||
|
||||
self._master=dicts[0] |
||||
self._dicts=dicts[1:] |
||||
|
||||
for message in self._master._messages: |
||||
gtm=GTMasterMessage(message._id,message._refs) |
||||
gtm.addMessage(message._message,self._master._filename[:-3]) |
||||
for dict in self._dicts: |
||||
res=dict.getMsgstr(message._id) |
||||
if(res): |
||||
gtm.addMessage(res,dict._filename[:-3]) |
||||
self._messages.append(gtm) |
||||
|
||||
def __str__(self): |
||||
""" |
||||
Return a string representation of the object |
||||
@self The object instance |
||||
""" |
||||
res="" |
||||
for message in self._messages: |
||||
res=res+str(message)+"\n" |
||||
return res |
||||
|
||||
def printUsage(): |
||||
"Print the usage messages" |
||||
print("Usage: " + str(sys.argv[0]) + " [OPTION] file.po [ref.po]\n\ |
||||
This program can be used to alter .po files in ways no sane mind would think about.\n\ |
||||
-o result will be written to FILE\n\ |
||||
--invert invert a po file by switching msgid and msgstr\n\ |
||||
--master join any number of files in a master-formatted catalog\n\ |
||||
--empty empty the contents of the .po file, creating a .pot\n\ |
||||
--append append entries from ref.po that don't exist in file.po\n\ |
||||
\n\ |
||||
Note: It is just a replacement of msghack for backward support.\n") |
||||
|
||||
|
||||
if __name__=="__main__": |
||||
output=None |
||||
res=None |
||||
if("-o") in sys.argv: |
||||
if (len(sys.argv)<=sys.argv.index("-o")+1): |
||||
print("file.po and ref.po are not specified!\n") |
||||
printUsage() |
||||
exit(1) |
||||
output=sys.argv[sys.argv.index("-o")+1] |
||||
sys.argv.remove("-o") |
||||
sys.argv.remove(output) |
||||
if("--invert") in sys.argv: |
||||
if (len(sys.argv)<=sys.argv.index("--invert")+1): |
||||
print("file.po is not specified!\n") |
||||
printUsage() |
||||
exit(1) |
||||
file=sys.argv[sys.argv.index("--invert")+1] |
||||
gtf=GTFile(file) |
||||
res1=gtf.msgidDupes() |
||||
if res1: |
||||
sys.stderr.write(res1) |
||||
sys.exit(1) |
||||
res=str(gtf.invertedStrings()) |
||||
elif("--empty") in sys.argv: |
||||
if (len(sys.argv)<=sys.argv.index("--empty")+1): |
||||
print("file.po is not specified!\n") |
||||
printUsage() |
||||
exit(1) |
||||
file=sys.argv[sys.argv.index("--empty")+1] |
||||
gtf=GTFile(file) |
||||
res=str(gtf.emptyMsgStrings()) |
||||
elif("--master") in sys.argv: |
||||
if (len(sys.argv)<=sys.argv.index("--master")+1): |
||||
print("file.po is not specified!\n") |
||||
printUsage() |
||||
exit(1) |
||||
loc=sys.argv.index("--master")+1 |
||||
gtfs=[] |
||||
for file in sys.argv[loc:]: |
||||
gtfs.append(GTFile(file)) |
||||
master=GTMaster(gtfs) |
||||
res=str(master) |
||||
elif("--append") in sys.argv: |
||||
if (len(sys.argv)<=sys.argv.index("--append")+2): |
||||
print("file.po and/or ref.po are not specified!\n") |
||||
printUsage() |
||||
exit(1) |
||||
file=sys.argv[sys.argv.index("--append")+1] |
||||
file2=sys.argv[sys.argv.index("--append")+2] |
||||
gtf=GTFile(file) |
||||
gtf2=GTFile(file2) |
||||
gtf.append(gtf2) |
||||
res=str(gtf) |
||||
else: |
||||
#print("Not implemented: "+str(sys.argv)) |
||||
printUsage() |
||||
sys.exit(1) |
||||
if not output: |
||||
print(res) |
||||
else: |
||||
file=open(output,"w") |
||||
file.write(res) |
||||
sys.exit(0) |
Loading…
Reference in new issue