File Coverage

blib/lib/Locale/Maketext/Extract/Plugin/Perl.pm
Criterion Covered Total %
statement 158 169 93.4
branch 77 84 91.6
condition 94 111 84.6
subroutine 15 16 93.7
pod 2 2 100.0
total 346 382 90.5


line stmt bran cond sub pod time code
1             package Locale::Maketext::Extract::Plugin::Perl;
2             $Locale::Maketext::Extract::Plugin::Perl::VERSION = '1.00';
3 5     5   32 use strict;
  5         11  
  5         220  
4              
5 5     5   27 use base qw(Locale::Maketext::Extract::Plugin::Base);
  5         11  
  5         1430  
6              
7             # ABSTRACT: Perl format parser
8              
9              
10 5     5   35 use constant NUL => 0;
  5         11  
  5         342  
11 5     5   26 use constant BEG => 1;
  5         10  
  5         546  
12 5     5   30 use constant PAR => 2;
  5         10  
  5         241  
13 5     5   24 use constant HERE => 10;
  5         17  
  5         259  
14 5     5   30 use constant QUO1 => 3;
  5         10  
  5         247  
15 5     5   25 use constant QUO2 => 4;
  5         9  
  5         215  
16 5     5   33 use constant QUO3 => 5;
  5         12  
  5         216  
17 5     5   39 use constant QUO4 => 6;
  5         17  
  5         235  
18 5     5   24 use constant QUO5 => 7;
  5         16  
  5         404  
19 5     5   25 use constant QUO6 => 8;
  5         8  
  5         229  
20 5     5   26 use constant QUO7 => 9;
  5         8  
  5         13681  
21              
22             sub file_types {
23 28     28 1 259 return qw( pm pl cgi );
24             }
25              
26             sub extract {
27 55     55 1 83 my $self = shift;
28 55         80 local $_ = shift;
29              
30 55     0   339 local $SIG{__WARN__} = sub { die @_ };
  0         0  
31              
32             # Perl code:
33 55         111 my ( $state, $line_offset, $str, $str_part, $vars, $quo, $heredoc )
34             = ( 0, 0 );
35 55         207 my $orig = 1 + ( () = ( ( my $__ = $_ ) =~ /\n/g ) );
36              
37 590 100       1622 PARSER: {
38 55         83 $_ = substr( $_, pos($_) ) if ( pos($_) );
39 590         7386 my $line = $orig - ( () = ( ( my $__ = $_ ) =~ /\n/g ) );
40              
41             # various ways to spell the localization function
42             $state == NUL
43             && m/\b(translate|maketext|gettext|__?|loc(?:ali[sz]e)?|l|x)/gc
44 590 100 100     1931 && do { $state = BEG; redo };
  60         70  
  60         90  
45 530 100 100     1495 $state == BEG && m/^([\s\t\n]*)/gc && redo;
46              
47             # begin ()
48             $state == BEG
49             && m/^([\S\(])\s*/gc
50 468 100 66     1096 && do { $state = ( ( $1 eq '(' ) ? PAR : NUL ); redo };
  60 100       181  
  60         84  
51              
52             # concat
53             $state == PAR
54             && defined($str)
55             && m/^(\s*\.\s*)/gc
56 408 100 100     1618 && do { $line_offset += ( () = ( ( my $__ = $1 ) =~ /\n/g ) ); redo };
  4   100     13  
  4         5  
57              
58             # str_part
59 404 100 100     1365 $state == PAR && defined($str_part) && do {
60 61 100 100     242 if ( ( $quo == QUO1 ) || ( $quo == QUO5 ) ) {
    100          
61 23 50       225 $str_part =~ s/\\([\\'])/$1/g
62             if ($str_part); # normalize q strings
63             }
64             elsif ( $quo != QUO6 ) {
65 36 100       127 $str_part =~ s/(\\(?:[0x]..|c?.))/"qq($1)"/eeg
  11         873  
66             if ($str_part); # normalize qq / qx strings
67             }
68 61         103 $str .= $str_part;
69 61         83 undef $str_part;
70 61         61 undef $quo;
71 61         75 redo;
72             };
73              
74             # begin or end of string
75 343 100 100     1001 $state == PAR && m/^(\')/gc && do { $state = $quo = QUO1; redo };
  19         26  
  19         39  
76 324 100 100     806 $state == QUO1 && m/^([^'\\]+)/gc && do { $str_part .= $1; redo };
  25         57  
  25         31  
77 299 100 100     671 $state == QUO1 && m/^((?:\\.)+)/gcs && do { $str_part .= $1; redo };
  7         14  
  7         9  
78 292 100 66     657 $state == QUO1 && m/^\'/gc && do { $state = PAR; redo };
  19         28  
  19         23  
79              
80 273 100 100     796 $state == PAR && m/^\"/gc && do { $state = $quo = QUO2; redo };
  23         33  
  23         30  
81 250 100 100     707 $state == QUO2 && m/^([^"\\]+)/gc && do { $str_part .= $1; redo };
  30         59  
  30         35  
82 220 100 100     517 $state == QUO2 && m/^((?:\\.)+)/gcs && do { $str_part .= $1; redo };
  9         20  
  9         13  
83 211 100 66     504 $state == QUO2 && m/^\"/gc && do { $state = PAR; redo };
  23         24  
  23         34  
84              
85 188 50 66     562 $state == PAR && m/^\`/gc && do { $state = $quo = QUO3; redo };
  0         0  
  0         0  
86 188 50 33     378 $state == QUO3 && m/^([^\`]*)/gc && do { $str_part .= $1; redo };
  0         0  
  0         0  
87 188 50 33     379 $state == QUO3 && m/^\`/gc && do { $state = PAR; redo };
  0         0  
  0         0  
88              
89 188 100 100     532 $state == PAR && m/^qq\{/gc && do { $state = $quo = QUO4; redo };
  1         3  
  1         2  
90 187 100 100     382 $state == QUO4 && m/^([^\}]*)/gc && do { $str_part .= $1; redo };
  2         5  
  2         3  
91 185 100 66     389 $state == QUO4 && m/^\}/gc && do { $state = PAR; redo };
  1         2  
  1         2  
92              
93 184 100 100     637 $state == PAR && m/^q\{/gc && do { $state = $quo = QUO5; redo };
  4         5  
  4         5  
94 180 100 100     412 $state == QUO5 && m/^([^\}]*)/gc && do { $str_part .= $1; redo };
  8         13  
  8         10  
95 172 100 66     378 $state == QUO5 && m/^\}/gc && do { $state = PAR; redo };
  4         5  
  4         5  
96              
97             # find heredoc terminator, then get the
98             #heredoc and go back to current position
99             $state == PAR
100             && m/^<<\s*\'/gc
101 168 100 100     495 && do { $state = $quo = QUO6; $heredoc = ''; redo };
  2         4  
  2         3  
  2         4  
102 166 100 100     556 $state == QUO6 && m/^([^'\\\n]+)/gc && do { $heredoc .= $1; redo };
  1         4  
  1         1  
103 165 50 66     331 $state == QUO6 && m/^((?:\\.)+)/gc && do { $heredoc .= $1; redo };
  0         0  
  0         0  
104             $state == QUO6
105             && m/^\'/gc
106 165 100 66     360 && do { $state = HERE; $heredoc =~ s/\\\'/\'/g; redo };
  2         3  
  2         4  
  2         4  
107              
108             $state == PAR
109             && m/^<<\s*\"/gc
110 163 100 100     516 && do { $state = $quo = QUO7; $heredoc = ''; redo };
  10         14  
  10         11  
  10         13  
111 153 100 100     367 $state == QUO7 && m/^([^"\\\n]+)/gc && do { $heredoc .= $1; redo };
  1         3  
  1         2  
112 152 50 66     308 $state == QUO7 && m/^((?:\\.)+)/gc && do { $heredoc .= $1; redo };
  0         0  
  0         0  
113             $state == QUO7
114             && m/^\"/gc
115 152 100 66     402 && do { $state = HERE; $heredoc =~ s/\\\"/\"/g; redo };
  10         11  
  10         15  
  10         19  
116              
117             $state == PAR
118             && m/^<<(\w*)/gc
119 142 100 100     602 && do { $state = HERE; $quo = QUO7; $heredoc = $1; redo };
  3         6  
  3         4  
  3         4  
  3         4  
120              
121             # jump ahead and get the heredoc, then s/// also
122             # resets the pos and we are back at the current pos
123             $state == HERE
124             && m/^.*\r?\n/gc
125             && s/\G(.*?\r?\n)$heredoc(\r?\n)//s
126 139 50 66     645 && do { $state = PAR; $str_part .= $1; $line_offset++; redo };
  15   66     17  
  15         28  
  15         17  
  15         27  
127              
128             # end ()
129             #
130              
131 124 100 100     544 $state == PAR && m/^\s*[\)]/gc && do {
132 58         156 $state = NUL;
133 58 100       333 $vars =~ s/[\n\r]//g if ($vars);
134 58 100       379 $self->add_entry( $str,
135             $line - ( () = $str =~ /\n/g ) - $line_offset, $vars )
136             if $str;
137 58         102 undef $str;
138 58         59 undef $vars;
139 58         62 undef $heredoc;
140 58         63 $line_offset = 0;
141 58         143 redo;
142             };
143              
144             # a line of vars
145 66 100 66     546 $state == PAR && m/^([^\)]*)/gc && do { $vars .= "$1\n"; redo };
  11         24  
  11         14  
146             }
147             }
148              
149              
150             1;
151              
152             __END__