summaryrefslogtreecommitdiffstats
path: root/po4a-normalize
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-17 11:26:17 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-17 11:26:17 +0000
commit5df6c2aefebe3d2abcc939a88e294876d59f03ca (patch)
tree63fb332a0f21ddb91cb789c80cf64e134d373463 /po4a-normalize
parentInitial commit. (diff)
downloadpo4a-5df6c2aefebe3d2abcc939a88e294876d59f03ca.tar.xz
po4a-5df6c2aefebe3d2abcc939a88e294876d59f03ca.zip
Adding upstream version 0.72.upstream/0.72
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'po4a-normalize')
-rwxr-xr-xpo4a-normalize240
1 files changed, 240 insertions, 0 deletions
diff --git a/po4a-normalize b/po4a-normalize
new file mode 100755
index 0000000..5ca7cf9
--- /dev/null
+++ b/po4a-normalize
@@ -0,0 +1,240 @@
+#! /usr/bin/env perl
+eval 'exec perl -S $0 ${1+"$@"}'
+ if $running_under_some_shell;
+
+# po4a-normalize -- normalize documentation files
+#
+# Copyright 2002-2023 by SPI, inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of GPL v2.0 or later (see COPYING).
+
+=encoding UTF-8
+
+=head1 NAME
+
+po4a-normalize - normalize a documentation file by parsing it in po4a, and writing it back
+
+=head1 SYNOPSIS
+
+B<po4a-normalize> B<-f> I<fmt> I<master.doc>
+
+=head1 DESCRIPTION
+
+The po4a (PO for anything) project goal is to ease translations (and more
+interestingly, the maintenance of translations) using gettext tools on
+areas where they were not expected like documentation.
+
+The B<po4a-normalize> script is a debugging tool used to make sure that
+po4a don't change the document when it's not supposed to. Only use it if
+you're developing a new module, or if you doubt the sanity of the tools.
+
+The generated document will be written to F<po4a-normalize.output> while the
+generated POT file will be written to F<po4a-normalize.po> by default, but
+you can use the B<--localized> and B<--pot> options to change that.
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<-o>, B<--option>
+
+Extra option(s) to pass to the format plugin. See the documentation of each
+plugin for more information about the valid options and their meanings. For
+example, you could pass '-o tablecells' to the AsciiDoc parser, while the
+text parser would accept '-o tabs=split'.
+
+=item B<-w>, B<--width>
+
+Column at which we should wrap the resulting file if the format supports it
+(default: 76).
+
+=item B<-b>, B<--blank>
+
+Create a blank translated document.
+The generated translated document will be generated assuming all messages
+are translated by a space or new line.
+
+This is useful to check what parts of the document cannot be translated.
+
+Both B<--blank> and B<--capitalize> can't be specified at the same time.
+
+=item B<-C>, B<--capitalize>
+
+Create a translated document and corresponding po-file with original strings
+translated as their capitalized versions.
+
+This is useful to check what parts of the document cannot be translated and
+generate test data for po4a.
+
+Both B<--blank> and B<--capitalize> can't be specified at the same time.
+
+=item B<-h>, B<--help>
+
+Show a short help message.
+
+=item B<--help-format>
+
+List the documentation formats understood by po4a.
+
+=item B<-f>, B<--format>
+
+Format of the documentation you want to handle. Use the B<--help-format>
+option to see the list of available formats.
+
+=item B<-M>, B<--master-charset>
+
+Charset of the file containing the document to translate.
+
+=item B<-l>, B<--localized>
+
+Name of the normalized file to produce (I<po4a-normalize.output> by default).
+
+=item B<-p>, B<--pot>
+
+Pot file to produce (I<po4a-normalize.po> by default).
+
+=item B<-V>, B<--version>
+
+Display the version of the script and exit.
+
+=back
+
+=head1 SEE ALSO
+
+L<po4a-gettextize(1)>,
+L<po4a-translate(1)>,
+L<po4a-updatepo(1)>,
+L<po4a(7)>
+
+=head1 AUTHORS
+
+ Denis Barbier <barbier@linuxfr.org>
+ Nicolas François <nicolas.francois@centraliens.net>
+ Martin Quinson (mquinson#debian.org)
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright 2002-2023 by SPI, inc.
+
+This program is free software; you may redistribute it and/or modify it
+under the terms of GPL v2.0 or later (see the COPYING file).
+
+=cut
+
+use 5.16.0;
+use strict;
+use warnings;
+
+use Locale::Po4a::Chooser;
+use Locale::Po4a::TransTractor;
+use Locale::Po4a::Common;
+
+use Getopt::Long qw(GetOptions);
+
+use Pod::Usage qw(pod2usage);
+
+Locale::Po4a::Common::textdomain('po4a');
+
+sub show_version {
+ Locale::Po4a::Common::show_version("po4a-normalize");
+ exit 0;
+}
+
+my ( $help_fmt, $help, $type, $debug, $verbose, $quiet, $wrappo, @options, $no_deprecation );
+my ( $blank, $capitalize );
+my ($mastchar);
+my ( $localized, $potfile, $width ) = ( 'po4a-normalize.output', 'po4a-normalize.po', 76 );
+Getopt::Long::Configure( 'no_auto_abbrev', 'no_ignore_case' );
+GetOptions(
+ 'help|h' => \$help,
+ 'help-format' => \$help_fmt,
+ 'format|f=s' => \$type,
+ 'localized|l=s' => \$localized,
+ 'pot|p=s' => \$potfile,
+
+ 'blank|b' => \$blank,
+ 'capitalize|C' => \$capitalize,
+
+ 'master-charset|M=s' => \$mastchar,
+
+ # undocumented option to silence the warning about po4a-normalize not being intended for users
+ 'no-deprecation' => \$no_deprecation,
+
+ 'option|o=s' => \@options,
+ 'wrap-po=s' => \$wrappo,
+
+ 'width|w=s' => \$width,
+ 'verbose|v' => \$verbose,
+ 'quiet|q' => \$quiet,
+ 'debug|d' => \$debug,
+ 'version|V' => \&show_version
+) or pod2usage();
+
+$help && pod2usage( -verbose => 1, -exitval => 0 );
+$help_fmt && Locale::Po4a::Chooser::list(0);
+pod2usage() unless scalar @ARGV == 1;
+
+my %options = (
+ "verbose" => $verbose,
+ "debug" => $debug,
+ "wrapcol" => $width
+);
+if ($blank and $capitalize) {
+ die wrap_msg( gettext("Both B<--blank> and B<--capitalize> can't be specified at the same time."));
+}
+foreach (@options) {
+ if (m/^([^=]*)=(.*)$/) {
+ $options{$1} = "$2";
+ } else {
+ $options{$_} = 1;
+ }
+}
+
+unless ($no_deprecation) {
+ print wrap_msg(
+ gettext(
+ "po4a-normalize is mostly useful to debug po4a itself. "
+ . "Users are advised to use the po4a(1) program instead."
+ )
+ );
+}
+my $parser = Locale::Po4a::Chooser::new( $type, %options );
+
+my $filename = shift || pod2usage(1);
+$filename eq '-' || -e $filename || die wrap_msg( gettext("File %s does not exist."), $filename );
+die wrap_msg( gettext("Options %s and %s cannot be provided together"), "quiet", "verbose" ) if $verbose && $quiet;
+
+$parser->read( $filename, $filename, $mastchar // '' );
+my %pot_options = ( 'wrap-po' => $wrappo );
+$parser->setpoout( Locale::Po4a::Po->new( \%pot_options ) );
+$parser->parse();
+if ($blank or $capitalize) {
+ foreach my $msgid ( keys %{ $parser->{TT}{po_out}{po} } ) {
+ if ( $blank ) {
+ if ( $msgid =~ m/\n$/s ) {
+ $parser->{TT}{po_out}{po}{$msgid}{'msgstr'} = "\n";
+ } else {
+ $parser->{TT}{po_out}{po}{$msgid}{'msgstr'} = " ";
+ }
+ } else { # $capitalize
+ ($parser->{TT}{po_out}{po}{$msgid}{'msgstr'} = $msgid) =~ s/(?<!\\)(.)/\U$1/g;
+ }
+ }
+ my $modified_po = $parser->{TT}{po_out};
+ $parser = Locale::Po4a::Chooser::new( $type, %options );
+ $parser->{TT}{po_in} = $modified_po;
+ $parser->read($filename, $filename, $mastchar // '' );
+ $parser->{TT}{file_in_charset} = $mastchar;
+ $parser->parse();
+ $parser->{TT}{po_out} = $modified_po;
+}
+print wrap_msg( dgettext( "po4a", "Write the normalized document to %s." ), $localized )
+ unless $quiet;
+$parser->write( $localized, '' );
+print wrap_msg( dgettext( "po4a", "Write the normalized PO file to %s." ), $potfile )
+ unless $quiet;
+$parser->writepo($potfile);
+
+__END__
+