03ab0292eaba69fcfb1a6d2d59a0fe4f16725846
[project/luci.git] / build / i18n-scan.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Text::Balanced qw(extract_codeblock);
6
7 @ARGV == 1 || die "Usage: $0 <source direcory>\n";
8
9
10 sub _parse
11 {
12         my ( $code ) = @_;
13         my ( $k, $v );
14         
15         if( $code =~ s/^<%:-?\s*(.+)\s*%>/$1/s )
16         {
17                 my ( $key, @text ) = split /[\n\s]+/, $code;
18
19                 $k = $key;
20                 $v = join ' ', @text;
21         }
22         elsif( $code =~ s/^\(\s*(.+)\s*\)/$1/s )
23         {
24                 if( $code =~ /^(?:"(\w+)"|'(\w+)')\s*,\s*(?:"(.+?)"|'(.+?)')/s )
25                 {
26                         $k = $1 || $2;
27                         $v = $3 || $4 || '';
28                         $v =~ s/\s+/ /sg;
29                 }
30                 elsif( $code =~ /^(?:"(\w+)"|'(\w+)')/ )
31                 {
32                         $k = $1 || $2;
33                         $v = '';
34                 }
35                 else
36                 {
37                         return ();
38                 }
39         }
40         else
41         {
42                 return ();
43         }
44
45         $v =~ s/\\"/"/g;
46         $v =~ s/"/\\"/g;
47         
48         return ( $k, $v );
49 }
50
51
52 if( open F, "find $ARGV[0] -type f -name '*.htm' -or -name '*.lua' |" )
53 {
54         while( defined( my $file = readline F ) )
55         {
56                 chomp $file;
57
58                 if( open S, "< $file" )
59                 {
60                         my $text = '';
61                         $text .= $_ foreach( readline S );
62
63                         while(
64                                 $text =~ s/
65                                         ^ .*?
66                                         (?:
67                                                 (?: translate f? | i18n )
68                                                 [\s\n]* ( \( )
69                                         |
70                                                 ( \<%: -? )
71                                         )
72                                 /$1 || $2/segx
73                         ) {
74                                 my $code;
75
76                                 ( $code, $text ) = extract_codeblock( $text, '', '^', '()' );
77                                 if( ! $code ) {
78                                         ( $code, $text ) = extract_codeblock( $text, '', '^', '<>' );
79                                 }
80
81                                 if( ! $code ) {
82                                         # Corner case:
83                                         $text =~ s/(#[^\n]*)%>/$1\n%>/;
84                                         ( $code, $text ) = extract_codeblock( $text, '<>', '^' );
85                                         if( ! $code ) {
86                                                 last;
87                                         }
88                                 }
89
90                                 my ( $k, $v ) = _parse( $code );
91                                 if( $k && defined($v) )
92                                 {
93                                         if( $v )
94                                         {
95                                                 printf "#. %s\n", $v || $k;
96                                         }
97
98                                         printf "msgid \"%s\"\nmsgstr \"%s\"\n\n",
99                                                 $k, $v;
100                                 }
101                         }
102
103                         close S;
104                 }
105         }
106
107         close F;
108 }