File Coverage

blib/lib/YAML/Tidy/Node.pm
Criterion Covered Total %
statement 255 257 99.2
branch 47 52 90.3
condition 30 32 93.7
subroutine 43 43 100.0
pod 0 2 0.0
total 375 386 97.1


line stmt bran cond sub pod time code
1             # ABSTRACT: yamltidy parse tree element
2 6     6   33 use strict;
  6         11  
  6         145  
3 6     6   23 use warnings;
  6         14  
  6         108  
4 6     6   46 use v5.20;
  6         27  
5 6     6   33 use experimental qw/ signatures /;
  6         17  
  6         38  
6              
7             package YAML::Tidy::Node;
8              
9             our $VERSION = '0.006_001'; # TRIAL VERSION
10 6     6   1671 use overload '""' => \&_stringify;
  6         771  
  6         35  
11              
12 31844     31844 0 35904 sub new($class, %args) {
  31844         35997  
  31844         66105  
  31844         32071  
13 31844         85595 my $self = {
14             %args,
15             };
16 31844         83323 return bless $self, $class;
17             }
18              
19 46370     46370   50967 sub _stringify($self, @args) {
  46370         46829  
  46370         62390  
  46370         45220  
20 46370   100     75887 my $type = $self->{type} // '';
21 46370         67743 my $str = "($type)";
22 46370 100       62527 if ($self->is_collection) {
23 44872         55994 my $open = $self->open;
24 44872         59244 my $close = $self->close;
25             $str .= sprintf " - ",
26             $open->{start}->{line}, $open->{start}->{column},
27             $open->{end}->{line}, $open->{end}->{column},
28             $close->{start}->{line}, $close->{start}->{column},
29             $close->{end}->{line}, $close->{end}->{column},
30 44872         178093 }
31             else {
32 1498         2645 my $val = substr($self->{value}, 0, 20);
33 1498         2106 local $Data::Dumper::Useqq = 1;
34 1498         6916 $val = Data::Dumper->Dump([$val], ['val']);
35 1498         58659 chomp $val;
36             $str .= sprintf " - | %s",
37             $self->start->{line}, $self->start->{column},
38 1498         3184 $self->end->{line}, $self->end->{column}, $val
39             }
40 46370         110279 return $str;
41             }
42              
43 2359     2359 0 2838 sub is_mapping_value($node, $parent) {
  2359         2831  
  2359         2695  
  2359         2596  
44 2359   100     10085 return ($parent->{type} eq 'MAP' and not $node->{index} % 2);
45             }
46              
47             package YAML::Tidy::Node::Collection;
48 6 50   6   2360 use constant DEBUG => $ENV{YAML_TIDY_DEBUG} ? 1 : 0;
  6         10  
  6         419  
49              
50 6     6   34 use base 'YAML::Tidy::Node';
  6         9  
  6         7658  
51              
52 67903     67903   99486 sub is_collection { 1 }
53              
54 35911     35911   37268 sub indent($self) {
  35911         37541  
  35911         37736  
55 35911         42968 my $firstevent = $self->open;
56 35911 100       60179 if ($firstevent->{name} eq 'document_start_event') {
57 7460         14179 return 0;
58             }
59 28451         35094 my $startcol = $firstevent->{end}->{column};
60 28451         42676 return $startcol;
61             }
62              
63 131921     131921   127601 sub open($self) { $self->{start} }
  131921         130100  
  131921         122137  
  131921         190721  
64 76128     76128   75638 sub close($self) { $self->{end} }
  76128         73819  
  76128         74250  
  76128         108003  
65              
66 749     749   952 sub sibling($self, $node, $diff) {
  749         956  
  749         928  
  749         921  
  749         798  
67 749 50       1435 return unless $diff;
68 749         1295 my $children = $self->{children};
69             # double check if $node is child of $parent
70 749 50       1943 unless ("$children->[ $node->{index} - 1 ]" eq "$node") {
71 0         0 die ">$node< is not a child of >$self<";
72             }
73 749         1796 my $new_index = $node->{index} - 1 + $diff;
74 749 50 33     3165 if ($new_index < 0 or $new_index > $#$children) {
75 0         0 die "$new_index out of range for '$self'";
76             }
77 749         1976 return $children->[ $new_index ];
78             }
79              
80              
81 13945     13945   15973 sub end($self) {
  13945         14772  
  13945         13896  
82 13945         19588 return $self->close->{end};
83             }
84              
85 588     588   881 sub realendline($self) {
  588         783  
  588         684  
86 588         1026 $self->close->{end}->{line} - 1;
87             }
88              
89 18819     18819   20661 sub start($self) {
  18819         19659  
  18819         18494  
90 18819         24492 return $self->open->{start};
91             }
92              
93 10917     10917   11807 sub line($self) {
  10917         11767  
  10917         11423  
94              
95 10917         15911 my $contentstart = $self->contentstart;
96 10917         17552 return $contentstart->{line};
97             }
98              
99 10917     10917   10994 sub contentstart($self) {
  10917         11838  
  10917         10732  
100 10917         14593 my $firstevent = $self->open;
101 10917         14883 return $firstevent->{end};
102             }
103              
104 786     786   1053 sub fix_node_indent($self, $fix) {
  786         1106  
  786         1004  
  786         960  
105 786         1463 for my $e ($self->open, $self->close) {
106 1572         2801 for my $pos (@$e{qw/ start end /}) {
107 3144         4509 $pos->{column} += $fix;
108             }
109             }
110 786         1172 for my $c (@{ $self->{children} }) {
  786         1610  
111 1931         3150 $c->fix_node_indent($fix);
112             }
113             }
114              
115 6620     6620   6620 sub _move_columns($self, $line, $offset, $fix) {
  6620         7012  
  6620         6700  
  6620         6806  
  6620         7096  
  6620         6504  
116             # warn __PACKAGE__.':'.__LINE__.": _move_columns $self $line $offset $fix\n";
117 6620 100       8416 return if $self->end->{line} < $line;
118 5874 100       7951 return if $self->start->{line} > $line;
119 4965         6568 for my $e ($self->open, $self->close) {
120 9930         13620 for my $pos (@$e{qw/ start end /}) {
121 19860 100 100     38409 if ($pos->{line} == $line and $pos->{column} >= $offset) {
122 770         1196 $pos->{column} += $fix;
123             }
124             }
125             }
126 4965         5419 for my $c (@{ $self->{children} }) {
  4965         7886  
127 13544         18698 $c->_move_columns($line, $offset, $fix);
128             }
129             }
130              
131              
132 3668     3668   3967 sub _fix_flow_indent($self, %args) {
  3668         4012  
  3668         5992  
  3668         3753  
133             # warn __PACKAGE__.':'.__LINE__.": ========== _fix_flow_indent l=$line diff=$diff\n";
134 3668         4669 my $line = $args{line};
135 3668         4192 my $diff = $args{diff};
136 3668         4957 my $start = $self->open;
137 3668         5244 my $end = $self->close;
138 3668         6712 for my $pos ($start->{start}, $start->{end}, $end->{start}, $end->{end}) {
139 14672 100       22807 if ($pos->{line} == $line) {
140 3207         4214 $pos->{column} += $diff;
141             }
142             }
143 3668         4022 for my $c (@{ $self->{children} }) {
  3668         5768  
144 7790         14200 $c->_fix_flow_indent(%args);
145             }
146             }
147              
148 3957     3957   3997 sub fix_lines($self, $startline, $diff) {
  3957         4277  
  3957         4237  
  3957         4052  
  3957         3782  
149 3957         5068 my $start = $self->open;
150 3957         4325 DEBUG and warn __PACKAGE__.':'.__LINE__.": ======== fix_lines $startline $diff ($self)\n";
151 3957         5068 my $end = $self->close;
152 3957         6161 for my $pos ($start->{start}, $start->{end}) {
153 7914 100       12576 if ($pos->{line} >= $startline) {
154 3336         4134 $pos->{line} += $diff;
155             }
156             }
157 3957         5590 for my $pos ($end->{start}, $end->{end}) {
158 7914 100 100     20801 if ($pos->{column} == 0 and $pos->{line} == $startline) {
    100          
159             }
160             elsif ($pos->{line} >= $startline) {
161 3846         4799 $pos->{line} += $diff;
162             }
163             }
164 3957         4117 for my $c (@{ $self->{children} }) {
  3957         5968  
165 7476         11278 $c->fix_lines($startline, $diff);
166             }
167             }
168              
169             package YAML::Tidy::Node::Scalar;
170 6 50   6   41 use constant DEBUG => $ENV{YAML_TIDY_DEBUG} ? 1 : 0;
  6         8  
  6         333  
171 6         366 use YAML::PP::Common qw/
172             YAML_PLAIN_SCALAR_STYLE YAML_SINGLE_QUOTED_SCALAR_STYLE
173             YAML_DOUBLE_QUOTED_SCALAR_STYLE YAML_LITERAL_SCALAR_STYLE
174             YAML_FOLDED_SCALAR_STYLE
175             YAML_FLOW_SEQUENCE_STYLE YAML_FLOW_MAPPING_STYLE
176 6     6   2607 /;
  6         7620  
177              
178 6     6   37 use base 'YAML::Tidy::Node';
  6         10  
  6         6053  
179              
180 29217     29217   57654 sub is_collection { 0 }
181              
182 707     707   1082 sub is_quoted($self) {
  707         989  
  707         1035  
183 707         2818 return $self->{style} ne YAML_PLAIN_SCALAR_STYLE
184             }
185              
186 18207     18207   20050 sub indent($self) {
  18207         20587  
  18207         18279  
187 18207         23361 return $self->open->{column};
188             }
189              
190 42525     42525   44211 sub start($self) {
  42525         43498  
  42525         40854  
191 42525         54395 return $self->open;
192             }
193              
194 133611     133611   131370 sub open($self) { $self->{start} }
  133611         137624  
  133611         127768  
  133611         210397  
195 106187     106187   103118 sub close($self) { $self->{end} }
  106187         104224  
  106187         102728  
  106187         174129  
196              
197 21633     21633   22326 sub end($self) {
  21633         21996  
  21633         21525  
198 21633         27210 return $self->close;
199             }
200              
201 13114     13114   14313 sub realendline($self) {
  13114         13773  
  13114         13581  
202 13114         16813 my $end = $self->close;
203 13114 100 100     37341 if ($self->{style} == YAML_LITERAL_SCALAR_STYLE
204             or $self->{style} == YAML_FOLDED_SCALAR_STYLE) {
205 2494 100       5287 if ($end->{column} == 0) {
206 2414         5031 return $end->{line} - 1;
207             }
208             }
209 10700         17089 $end->{line};
210             }
211              
212 20670     20670   21973 sub line($self) {
  20670         21900  
  20670         21200  
213 20670         29392 my $contentstart = $self->contentstart;
214 20670         33683 return $contentstart->{line};
215             }
216              
217 20670     20670   20688 sub contentstart($self) {
  20670         20913  
  20670         22561  
218 20670         28413 return $self->start;
219             }
220              
221 22922     22922   24095 sub multiline($self) {
  22922         23528  
  22922         22069  
222 22922 100       28730 if ($self->open->{line} < $self->close->{line}) {
223 2930         9890 return 1;
224             }
225 19992         47025 return 0;
226             }
227              
228 23549     23549   24904 sub empty_scalar($self) {
  23549         24472  
  23549         25668  
229 23549         32278 my ($start, $end) = ($self->open, $self->close);
230 23549 100 100     66215 if ($start->{line} == $end->{line} and $start->{column} == $end->{column}) {
231 551         2091 return 1;
232             }
233 22998         48282 return 0;
234             }
235              
236 1733     1733   1866 sub fix_node_indent($self, $fix) {
  1733         1949  
  1733         1893  
  1733         1727  
237 1733         2622 for my $pos ($self->open, $self->close) {
238 3466         5485 $pos->{column} += $fix;
239             }
240             }
241              
242 8240     8240   8783 sub _move_columns($self, $line, $offset, $fix) {
  8240         8244  
  8240         8183  
  8240         8050  
  8240         8065  
  8240         7617  
243             # warn __PACKAGE__.':'.__LINE__.": _move_columns $self $line $offset $fix\n";
244 8240 100       10405 return if $self->end->{line} < $line;
245 5276 100       6877 return if $self->start->{line} > $line;
246 2673         3489 for my $pos ($self->open, $self->close) {
247 5346 100 100     14639 if ($pos->{line} == $line and $pos->{column} >= $offset) {
248 1402         2351 $pos->{column} += $fix;
249             }
250             }
251             }
252              
253 5236     5236   5506 sub _fix_flow_indent($self, %args) {
  5236         5447  
  5236         6423  
  5236         5178  
254 5236         5909 my $line = $args{line};
255 5236         5798 my $diff = $args{diff};
256             # warn __PACKAGE__.':'.__LINE__.": ========== _fix_flow_indent l=$line diff=$diff\n";
257 5236         6916 for my $pos ($self->open, $self->close) {
258 10472 100       20632 if ($pos->{line} == $line) {
259 2989         5779 $pos->{column} += $diff;
260             }
261             }
262             }
263              
264 4500     4500   5353 sub fix_lines($self, $startline, $diff) {
  4500         4717  
  4500         4471  
  4500         4747  
  4500         4366  
265 4500         4628 DEBUG and warn __PACKAGE__.':'.__LINE__.": ======== fix_lines $startline $diff ($self)\n";
266 4500         6004 for my $pos ($self->open) {
267 4500 100 100     5839 if ($self->empty_scalar and $pos->{column} == 0 and $pos->{line} == $startline) {
    100 100        
268             }
269             elsif ($pos->{line} >= $startline) {
270 2178         2952 $pos->{line} += $diff;
271             }
272             }
273 4500         6187 for my $pos ($self->close) {
274 4500 100 100     12040 if ($pos->{column} == 0 and $pos->{line} == $startline) {
    100          
275             }
276             elsif ($pos->{line} >= $startline) {
277 2178         4170 $pos->{line} += $diff;
278             }
279             }
280             }
281              
282             1;