Warning, /sdk/kde-dev-scripts/extractattr is written in an unsupported language. File is not indexed.
0001 #! /usr/bin/env perl
0002
0003 #
0004 # Copyright (c) 2004 Richard Evans <rich@ridas.com>
0005 #
0006 # License: LGPL 2.0
0007 #
0008
0009 sub usage
0010 {
0011 warn <<"EOF";
0012
0013 extractattr [flags] filenames
0014
0015 This script extracts element attributes from designer (.ui) and XMLGIU (.rc) files
0016 and writes on standard output (usually redirected to rc.cpp) the equivalent
0017 i18n() calls so that xgettext can parse them.
0018
0019 --attr=spec : Specify the attribute to be extracted. The specification
0020 consists of the following comma separated arguments:
0021
0022 Element,attribute[,context]
0023
0024 The context is optional and overrides the name set by
0025 --context below. Repeat the flag to specify multiple
0026 attributes:
0027
0028 --attr=Title,data --attr=Description,data,Stencils
0029
0030 --context=name : Give i18n calls a context name: i18nc("name", ...)
0031 --lines : Include source line numbers in comments (deprecated, it is switched on by default now)
0032 --help|? : Display this summary
0033
0034 EOF
0035
0036 exit;
0037 }
0038
0039 ###########################################################################################
0040
0041 use strict;
0042 use warnings;
0043 use Getopt::Long;
0044
0045 ###########################################################################################
0046 # Add options here as necessary - perldoc Getopt::Long for details on GetOptions
0047
0048 GetOptions ( "attr=s" => \my @opt_attr,
0049 "context=s" => \my $opt_context,
0050 "lines" => \my $opt_lines,
0051 "help|?" => \&usage );
0052
0053 unless ( @ARGV )
0054 {
0055 warn "No filename specified";
0056 exit;
0057 }
0058
0059 unless ( @opt_attr )
0060 {
0061 warn "No attributes specified";
0062 exit;
0063 }
0064
0065 ###########################################################################################
0066 # Program start proper - NB $. is the current line number
0067
0068 my $code =<<'EOF';
0069 our $file_name;
0070
0071 for $file_name ( @ARGV )
0072 {
0073 my $fh;
0074
0075 unless ( open $fh, "<", $file_name )
0076 {
0077 warn "Failed to open: '$file_name': $!";
0078 next;
0079 }
0080
0081 while ( <$fh> )
0082 {
0083 last if $. == 1 and $_ !~ /^(?:<!DOCTYPE|<\?xml)/;
0084 EOF
0085
0086 $code .= build_code(@opt_attr) . <<'EOF';
0087 }
0088
0089 close $fh or warn "Failed to close: '$file_name': $!";
0090 }
0091
0092 1;
0093 EOF
0094
0095 # warn "CODE TO EVAL:\n$code\n";
0096
0097 eval $code or die;
0098
0099
0100 sub build_code
0101 {
0102 my $code = "\n";
0103
0104 my %seen;
0105
0106 for ( @_ )
0107 {
0108 my ($element, $attribute, $context) = ((split /,/), "", "", "");
0109
0110 length $element or die "Missing element in --attr=$_";
0111 length $attribute or die "Missing attribute in --attr=$_";
0112
0113 if ( $seen{$element . '<' . $attribute}++ )
0114 {
0115 warn "Skipping duplicate flag --attr=$_ (element/attribute pair has already been specified)";
0116 next;
0117 }
0118
0119 $code .= " /<" . quotemeta($element) . qq| [^>]*?| .
0120 quotemeta($attribute) . qq|="([^"]+)"/ and write_i18n('| . $context . qq|', \$1, "| . $element . "\",\"" . $attribute . qq|");\n|;
0121 }
0122
0123 return "$code\n";
0124 }
0125
0126 sub write_i18n
0127 {
0128 my ($context, $text, $tag, $attr) = @_;
0129
0130 our $file_name;
0131
0132 unless ( $text )
0133 {
0134 print "// Skipped empty message at $file_name line $.\n";
0135 return;
0136 }
0137
0138 $text =~ s/</</g;
0139 $text =~ s/>/>/g;
0140 $text =~ s/'/\'/g;
0141 $text =~ s/"/\"/g;
0142 $text =~ s/&/&/g;
0143
0144 # Escape characters exactly like uic does it
0145 # (As extractrc needs it, we follow the same rule to avoid to be different.)
0146 $text =~ s/\\/\\\\/g; # escape \
0147 $text =~ s/\"/\\\"/g; # escape "
0148 $text =~ s/\r//g; # remove CR (Carriage Return)
0149 $text =~ s/\n/\\n\"\n\"/g; # escape LF (Line Feed). uic also change the code line at a LF, we do not do that.
0150
0151 $context ||= $opt_context;
0152
0153 (my $norm_fname = $file_name) =~ s/^\.\///;
0154 print "//i18n: tag $tag attribute $attr\n";
0155 print "//i18n: file: $norm_fname:$.\n";
0156 if ( $context )
0157 {
0158 print qq|i18nc("$context","$text");\n|;
0159 }
0160 else
0161 {
0162 print qq|i18n("$text");\n|;
0163 }
0164 }
0165