summaryrefslogtreecommitdiff
path: root/intltool-prepare.in
diff options
context:
space:
mode:
Diffstat (limited to 'intltool-prepare.in')
-rw-r--r--intltool-prepare.in342
1 files changed, 342 insertions, 0 deletions
diff --git a/intltool-prepare.in b/intltool-prepare.in
new file mode 100644
index 0000000..e25451c
--- /dev/null
+++ b/intltool-prepare.in
@@ -0,0 +1,342 @@
+#!@INTLTOOL_PERL@ -w
+# -*- Mode: perl; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+
+# Intltool .desktop, .directory Prepare Tool
+#
+# Copyright (C) 2001 Free Software Foundation.
+#
+# Intltool 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 2 of the
+# License, or (at your option) any later version.
+#
+# Intltool 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, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+# Author(s): Gediminas Paulauskas <menesis@delfi.lt>
+# Kenneth Christiansen <kenneth@gnu.org>
+
+## Release information
+my $PROGRAM = "intltool-prepare";
+my $PACKAGE = "@PACKAGE@";
+my $VERSION = "@VERSION@";
+
+## Loaded modules
+use strict;
+use Getopt::Long;
+use File::Find;
+
+## Scalars used by the option stuff
+my $HELP_ARG = "0";
+my $VERSION_ARG = "0";
+my $VERBOSE = "0";
+
+my @languages;
+my @desktop_files;
+my $new;
+my $file;
+
+my $desktop_extension = "(desktop|soundlist|keys|directory)";
+
+my $keywords = "Name|Comment|GenericName|SwallowTitle|description";
+
+## Always print as the first thing
+$| = 1;
+
+## Handle options
+GetOptions (
+ "help|h" => \$HELP_ARG,
+ "version|v" => \$VERSION_ARG,
+ "verbose|x" => \$VERBOSE
+ ) or &invalid_option;
+
+
+## Use the supplied arguments
+## Check for options.
+## This section will check for the different options.
+
+sub split_on_argument {
+
+ if ($VERSION_ARG) {
+ &version;
+
+ } elsif ($HELP_ARG) {
+ &help;
+
+ } else {
+ &main;
+ }
+}
+
+&split_on_argument;
+
+sub main
+{
+ print "Working, please wait...\n" if (! $VERBOSE);
+ &find_desktop_files;
+ &append_keywords;
+ &add_to_potfiles;
+ &perform_rescue;
+ &add_to_cvsignore;
+ &fix_makefiles;
+ &generate_empty;
+}
+
+sub version {
+ print <<_EOF_;
+${PROGRAM} ${PACKAGE} $VERSION
+Written by Gediminas Paulauskas <menesis\@delfi.lt>, 2000.
+
+Copyright (C) 2000 Free Software Foundation, Inc.
+This is free software; see the source for copying conditions. There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+_EOF_
+ exit;
+}
+
+sub help
+{
+ print <<_EOF_;
+Usage: ${PROGRAM} [OPTION] KEYWORD...
+Automates preparation steps before software make use of intltool.
+KEYWORD is a list of additional key other than "Name", "Comment"
+and "description".
+
+ -h, --help shows this help page
+ -v, --version shows the version
+ -x, --verbose show lots of feedback
+
+Report bugs to http://bugs.launchpad.net/intltool
+_EOF_
+ exit;
+}
+
+sub invalid_option
+{
+ ## Handle invalid arguments
+ ## my $opt = $ARGV[0];
+ ## print "$PROGRAM: invalid option -- $opt\n";
+ print STDERR "Try `$PROGRAM --help' for more information.\n";
+ exit 1;
+}
+
+sub append_keywords
+{
+ my $arg;
+ foreach $arg (@ARGV) {
+ $keywords .= "|$arg";
+ }
+}
+
+sub add_to_potfiles
+{
+ open FILE, ">>po/POTFILES.in";
+ my $intro = 0;
+ foreach my $desktop (@desktop_files) {
+ next if contains("po/POTFILES.in", "$desktop.in");
+ # Print explanation comment only once
+ unless ($intro) {
+ print FILE "# files added by intltool-prepare\n";
+ $intro = 1;
+ }
+ print FILE "$desktop.in\n";
+ }
+ close FILE;
+}
+
+sub perform_rescue
+{
+ foreach $file (@desktop_files) {
+ &rescue_file($file);
+ }
+}
+
+sub rescue_file
+{
+ my ($filename) = @_;
+ my ($msgid, $line, $lang);
+
+ print "Rescuing translations from $filename ...\n" if $VERBOSE;
+
+ open ORIG, "<$filename";
+ $line = 1;
+ENTRY: while (<ORIG>) {
+ chomp;
+ $line++;
+ my $entry = $_;
+ if (($entry =~ /^($keywords)=(.*)$/) ||
+ ($entry =~ /^(\s*description)=(.*)$/)) {
+ $msgid = $2;
+ $msgid =~ s/\\/\\\\/g;
+ $msgid =~ s/\"/\\"/g;
+ } elsif (($entry =~ /^($keywords)\[(.*?)\]=(.*)$/) ||
+ ($entry =~ /^(\s*\[)(.*?)\]description=(.*)$/)) {
+ $lang = $2;
+
+ my $msgstr = $3;
+ $msgstr =~ s/\\/\\\\/g;
+ $msgstr =~ s/"/\\"/g;
+
+ $line--;
+ if ((-s "po/$lang.po") &&
+ (contains("po/$lang.po", "msgid \"$msgid\""))) {
+ next ENTRY;
+ }
+
+ open POFILE, ">>po/$lang.po";
+
+ print POFILE "\n#: $filename.in:$line\n";
+ print POFILE "msgid \"$msgid\"\n";
+ print POFILE "msgstr \"$msgstr\"\n";
+
+ close POFILE;
+ }
+ }
+}
+
+sub generate_empty
+{
+ my $all = ' ';
+ foreach my $full (@desktop_files) {
+ $new = "$full.in";
+ $all .= "$new ";
+ print "Generating empty $new ...\n" if $VERBOSE;
+ open FULL, "<$full";
+ open NEW, ">$new";
+
+ while (<FULL>) {
+ unless (
+ (/^($keywords)\[.*?\]=.*$/) ||
+ (/^\s*\[(.*?)\]description=.*$/)
+ ) {
+ if (/^($keywords)=.*$/) {
+ print NEW "_$_";
+ } elsif (/^(\s*)(description=.*)$/) {
+ print NEW "$1_$2\n";
+ } else {
+ print NEW;
+ }
+ }
+ }
+
+ close NEW;
+ }
+ unless ($all eq ' ') {
+ print "*** Please add these files to CVS by following command: ***\n"
+ . "cvs add$all\n";
+ }
+}
+
+sub add_to_cvsignore
+{
+ my $all = ' ';
+ my $ign;
+ foreach $file (@desktop_files) {
+ $file =~ /^(.*\/)?(.+?\.$desktop_extension$)$/;
+ if ($1) {
+ $ign = "$1.cvsignore";
+ } else {
+ $ign = ".cvsignore";
+ }
+ my $basename = $2;
+
+ next if contains($ign, $basename);
+
+ print "Appending $basename to $ign\n" if $VERBOSE;
+ open FILE, ">>$ign";
+ print FILE "$basename\n";
+ $all .= "$file ";
+ }
+ close FILE;
+ unless ($all eq ' ') {
+ print "*** Please remove files from CVS by following command: ***\n"
+ . "cvs remove -f$all\n";
+ }
+}
+
+sub fix_makefiles
+{
+ my $file;
+ foreach $file (@desktop_files) {
+ my ($makefile, $line);
+
+ $file =~ /^(.*\/)?(.+?\.$desktop_extension$)$/;
+ if ($1) {
+ $makefile = "$1Makefile.am";
+ } else {
+ $makefile = "Makefile.am";
+ }
+ my $basename = $2;
+ print "Fixing $basename entry in $makefile\n" if $VERBOSE;
+
+ open MAKE, $makefile;
+ open NEWMAKE, ">$makefile.new";
+ my $extra = 0;
+ while ($line = <MAKE>) {
+ $extra = 1 if $line =~ /^EXTRA_DIST/;
+ if ($extra) {
+ if (($line =~ /$basename/) &&
+ !($line =~ /$basename\.in/)) {
+ $line =~ s/$basename/$basename\.in/;
+ }
+ $extra = 0 unless $line =~ /\\\s*$/
+ } else {
+ if ($line =~ /^(\w+)_DATA\s*=\s*$basename\s*$/) {
+ my $name = $1;
+ $line =~ s/^$name\_DATA/$name\_in_files/;
+ $line =~ s/$basename/$basename\.in/;
+ $basename =~ /\.($desktop_extension)$/;
+ my $ext = $1;
+ $line .= "$name\_DATA = \$($name\_in_files:.$ext.in=.$ext)\n";
+ $ext =~ tr/a-z/A-Z/;
+ if (!contains($makefile, "\@INTLTOOL_$ext\_RULE\@")) {
+ $line .= "\@INTLTOOL_$ext\_RULE\@\n";
+ }
+ }
+ }
+ print NEWMAKE $line;
+ }
+ close NEWMAKE;
+ rename "$makefile.new", $makefile;
+ }
+}
+
+sub contains
+{
+ my ($name, $str) = @_;
+ open CONT, "<$name";
+ while (<CONT>) {
+ chomp;
+ return 1 if $_ eq $str;
+ }
+ return 0;
+}
+
+sub find_desktop_files
+{
+ if ($VERBOSE) {
+ print "Found these interesting files:\n";
+ } else {
+ print "Finding interesting files...";
+ }
+ find (\&wanted, '.');
+ print "done\n" unless $VERBOSE;
+}
+
+sub wanted
+{
+ if (/\.$desktop_extension$/) {
+ my $file = $File::Find::name;
+ $file =~ s/\.\///;
+ push @desktop_files, $file;
+ print "$file\n" if $VERBOSE;
+ }
+}
+
+# vim: ts=4 sw=4 expandtab