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)?)<$1\/>/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)?)<$1>/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__
|