File Coverage

blib/lib/XML/FXN.pm
Criterion Covered Total %
statement 135 136 99.2
branch 32 32 100.0
condition 3 3 100.0
subroutine 7 7 100.0
pod 2 4 50.0
total 179 182 98.3


line stmt bran cond sub pod time code
1             package XML::FXN;
2             # Copyright Jerzy Wachowiak 2005
3             # Fast XML Notation
4            
5 1     1   40337 use strict;
  1         2  
  1         32  
6 1     1   5 use warnings;
  1         2  
  1         37  
7            
8             require Exporter;
9 1     1   5 use vars qw( @ISA @EXPORT $VERSION );
  1         6  
  1         1517  
10             @ISA =qw( Exporter );
11             @EXPORT =qw( xml2fxn fxn2xml );
12             $VERSION = '0.01';
13            
14             sub xml2fxn {
15            
16 1     1 1 9 my $line = shift;
17            
18             # Some definitions from the XML standard...
19 1         2 my $S = "[ \\n\\t\\r]+";
20 1         3 my $NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
21 1         2 my $NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
22 1         4 my $Name = "(?:$NameStrt)(?:$NameChar)*";
23 1         3 my $EndTagCE = "$Name(?:$S)?";
24 1         2 my $AttValSE = "\"[^<\"]*\"|'[^<']*'";
25 1         1 my $TextSE = "(?:[^<]+)*";
26            
27 1         326 my @string = split( //, $line );
28            
29 1         24 my( $char1 , $char2, $buffer, $output );
30 1         2 $output = $buffer = $char1 = $char2 = '';
31 1         2 my $IsSetDoctypedecl = 0;
32 1         2 my $IsSetComment = 0;
33            
34 1         3 foreach $char2 ( @string ){
35            
36 928         1603 $buffer .= $char1;
37            
38            
39 928 100       1831 if( "$char1$char2" =~ m/[?%]>/ ){
40 1         2 $buffer .= $char2;
41 1         3 $output .= $buffer;
42 1         2 $char1 = '';
43 1         2 $buffer = '';
44             next
45 1         3 }
46            
47 927 100       1768 if( "$buffer$char2" =~ m/-->$/ ){
48 1         2 $buffer .= $char2;
49 1         2 $output .= $buffer;
50 1         9 $char1 = '';
51 1         2 $buffer = '';
52 1         2 $IsSetComment = 0;
53             next
54 1         2 }
55            
56 926 100       1497 if( $IsSetComment ){
57 53         53 $char1 = $char2;
58             next
59 53         59 }
60            
61 873 100 100     1942 if( $IsSetDoctypedecl and $char2 =~ m/>/ ){
62 1         2 $buffer .= $char2;
63 1         2 $output .= $buffer;
64 1         3 $char1 = '';
65 1         1 $buffer = '';
66 1         1 $IsSetDoctypedecl = 0;
67             next
68 1         3 }
69            
70 872 100       1659 if( "$buffer$char2" =~ m/
71 2         6 $char1 = $char2;
72 2         3 $IsSetDoctypedecl = 1;
73             next
74 2         3 }
75            
76 870 100       1997 if( "$buffer$char2" =~ m// ) {
148 1         3 $output .= $buffer.$char2;
149 1         3 $char1 = '';
150 1         2 $buffer = '';
151             next
152 1         2 }
153            
154 718 100       1521 if( "$buffer$char1$char2" =~ m/<[?!]/ ) {
155 106         99 $char1 = $char2;
156             next
157 106         128 }
158            
159 612 100       1153 if( "$char1$char2" eq '<>'){
160 2         121 $buffer =~
161             s/(($Name)(?:$S$Name(?:$S)?=(?:$S)?(?:$AttValSE))*(?:$S)?)/g;
162 2         120 $buffer =~
163 2         7 s/($TextSE) (<$Name(?:$S$Name(?:$S)?=(?:$S)?(?:$AttValSE))*(?:$S)?\/>)/trim_back( $1, $2 )/ge;
164 2         4 $output .= $buffer;
165 2         4 $char1 = '';
166 2         2 $buffer = '';
167             next
168 2         5 }
169            
170 610 100       984 if( $char1 eq '>' ){
171 21         31 $last_name_on_stack = pop( @name_stack );
172 21         63 $buffer =~ s/>//g;
173 21         44 $buffer = "$buffer<\/$last_name_on_stack>";
174 21         22 $output .= $buffer;
175 21         32 $buffer = ''
176             }
177            
178 610 100       1090 if( $char1 eq '<' ){
179 21         501 $buffer =~
180             s/(($Name)(?:$S$Name(?:$S)?=(?:$S)?(?:$AttValSE))*(?:$S)?)/g;
181 21         47 push( @name_stack, $2 );
182 21         308 $buffer =~
183 20         38 s/($TextSE) (<$Name(?:$S$Name(?:$S)?=(?:$S)?(?:$AttValSE))*(?:$S)?>)/trim_back( $1, $2 )/ge;
184 21         34 $output .= $buffer;
185 21         39 $buffer = ''
186             }
187            
188 610         777 $char1 = $char2;
189             }
190 1         3 $output .= $buffer.$char1;
191 1         65 return $output
192             }
193            
194            
195            
196             sub trim_back {
197            
198 22     22 0 33 my $string1 = shift;
199 22         35 my $string2 = shift;
200            
201 22 100       49 if ( $string1 =~ m/\w+/ ){ return "$string1$string2" }
  1         620  
202 21         72 else { return "$string1 $string2" }
203             }
204            
205             1;
206             __END__