File Coverage

blib/lib/Excel/Writer/XLSX/Package/Comments.pm
Criterion Covered Total %
statement 119 119 100.0
branch 6 8 75.0
condition 5 6 83.3
subroutine 21 21 100.0
pod 0 1 0.0
total 151 155 97.4


line stmt bran cond sub pod time code
1              
2             ###############################################################################
3             #
4             # Comments - A class for writing the Excel XLSX Comments files.
5             #
6             # Used in conjunction with Excel::Writer::XLSX
7             #
8             # Copyright 2000-2021, John McNamara, jmcnamara@cpan.org
9             #
10             # Documentation after __END__
11             #
12              
13             # perltidy with the following options: -mbl=2 -pt=0 -nola
14              
15             use 5.008002;
16 1124     1124   16855 use strict;
  1124         3270  
17 1124     1124   4953 use warnings;
  1124         1903  
  1124         17877  
18 1124     1124   4309 use Carp;
  1124         1952  
  1124         21029  
19 1124     1124   4611 use Excel::Writer::XLSX::Package::XMLwriter;
  1124         1993  
  1124         49483  
20 1124     1124   6223 use Excel::Writer::XLSX::Utility qw(xl_rowcol_to_cell);
  1124         2262  
  1124         37925  
21 1124     1124   5923  
  1124         2189  
  1124         946826  
22              
23             our @ISA = qw(Excel::Writer::XLSX::Package::XMLwriter);
24             our $VERSION = '1.09';
25              
26              
27             ###############################################################################
28             #
29             # Public and private API methods.
30             #
31             ###############################################################################
32              
33              
34             ###############################################################################
35             #
36             # new()
37             #
38             # Constructor.
39             #
40              
41             my $class = shift;
42             my $fh = shift;
43 52     52 0 5204 my $self = Excel::Writer::XLSX::Package::XMLwriter->new( $fh );
44 52         88  
45 52         191 $self->{_author_ids} = {};
46              
47 52         148 bless $self, $class;
48              
49 52         105 return $self;
50             }
51 52         117  
52              
53             ###############################################################################
54             #
55             # _assemble_xml_file()
56             #
57             # Assemble and write the XML file.
58             #
59              
60             my $self = shift;
61             my $comments_data = shift;
62              
63 46     46   112 $self->xml_declaration;
64 46         82  
65             # Write the comments element.
66 46         243 $self->_write_comments();
67              
68             # Write the authors element.
69 46         187 $self->_write_authors( $comments_data );
70              
71             # Write the commentList element.
72 46         190 $self->_write_comment_list( $comments_data );
73              
74             $self->xml_end_tag( 'comments' );
75 46         172  
76             # Close the XML writer filehandle.
77 46         212 $self->xml_get_fh()->close();
78             }
79              
80 46         241  
81             ###############################################################################
82             #
83             # Internal methods.
84             #
85             ###############################################################################
86              
87              
88             ###############################################################################
89             #
90             # XML writing methods.
91             #
92             ###############################################################################
93              
94              
95             ##############################################################################
96             #
97             # _write_comments()
98             #
99             # Write the <comments> element.
100             #
101              
102             my $self = shift;
103             my $xmlns = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main';
104              
105             my @attributes = ( 'xmlns' => $xmlns );
106 46     46   99  
107 46         86 $self->xml_start_tag( 'comments', @attributes );
108             }
109 46         133  
110              
111 46         251 ##############################################################################
112             #
113             # _write_authors()
114             #
115             # Write the <authors> element.
116             #
117              
118             my $self = shift;
119             my $comment_data = shift;
120             my $author_count = 0;
121              
122             $self->xml_start_tag( 'authors' );
123 46     46   86  
124 46         86 for my $comment ( @$comment_data ) {
125 46         272 my $author = $comment->[3];
126              
127 46         136 if ( defined $author && !exists $self->{_author_ids}->{$author} ) {
128              
129 46         357 # Store the author id.
130 4164         6060 $self->{_author_ids}->{$author} = $author_count++;
131              
132 4164 100 66     9511 # Write the author element.
133             $self->_write_author( $author );
134             }
135 47         161 }
136              
137             $self->xml_end_tag( 'authors' );
138 47         302 }
139              
140              
141             ##############################################################################
142 46         334 #
143             # _write_author()
144             #
145             # Write the <author> element.
146             #
147              
148             my $self = shift;
149             my $data = shift;
150              
151             $self->xml_data_element( 'author', $data );
152             }
153              
154 47     47   91  
155 47         273 ##############################################################################
156             #
157 47         271 # _write_comment_list()
158             #
159             # Write the <commentList> element.
160             #
161              
162             my $self = shift;
163             my $comment_data = shift;
164              
165             $self->xml_start_tag( 'commentList' );
166              
167             for my $comment ( @$comment_data ) {
168             my $row = $comment->[0];
169 46     46   330 my $col = $comment->[1];
170 46         96 my $text = $comment->[2];
171             my $author = $comment->[3];
172 46         341 my $font_name = $comment->[6];
173             my $font_size = $comment->[7];
174 46         121 my $font_family = $comment->[8];
175 4164         8238  
176 4164         4992 # Look up the author id.
177 4164         5562 my $author_id = undef;
178 4164         5144 $author_id = $self->{_author_ids}->{$author} if defined $author;
179 4164         5396  
180 4164         4564 # Write the comment element.
181 4164         4692 my $font = [ $font_name, $font_size, $font_family ];
182             $self->_write_comment( $row, $col, $text, $author_id, $font );
183             }
184 4164         4574  
185 4164 50       6978 $self->xml_end_tag( 'commentList' );
186             }
187              
188 4164         6088  
189 4164         6568 ##############################################################################
190             #
191             # _write_comment()
192 46         153 #
193             # Write the <comment> element.
194             #
195              
196             my $self = shift;
197             my $row = shift;
198             my $col = shift;
199             my $text = shift;
200             my $author_id = shift;
201             my $ref = xl_rowcol_to_cell( $row, $col );
202             my $font = shift;
203              
204 4164     4164   4565  
205 4164         4835 my @attributes = ( 'ref' => $ref );
206 4164         4406  
207 4164         4707 push @attributes, ( 'authorId' => $author_id ) if defined $author_id;
208 4164         4455  
209 4164         7413  
210 4164         5206 $self->xml_start_tag( 'comment', @attributes );
211              
212             # Write the text element.
213 4164         6887 $self->_write_text( $text, $font );
214              
215 4164 50       7422 $self->xml_end_tag( 'comment' );
216             }
217              
218 4164         9075  
219             ##############################################################################
220             #
221 4164         8392 # _write_text()
222             #
223 4164         6994 # Write the <text> element.
224             #
225              
226             my $self = shift;
227             my $text = shift;
228             my $font = shift;
229              
230             $self->xml_start_tag( 'text' );
231              
232             # Write the text r element.
233             $self->_write_text_r( $text, $font );
234              
235 4164     4164   4910 $self->xml_end_tag( 'text' );
236 4164         4735 }
237 4164         4498  
238              
239 4164         7947 ##############################################################################
240             #
241             # _write_text_r()
242 4164         8528 #
243             # Write the <r> element.
244 4164         7336 #
245              
246             my $self = shift;
247             my $text = shift;
248             my $font = shift;
249              
250             $self->xml_start_tag( 'r' );
251              
252             # Write the rPr element.
253             $self->_write_r_pr($font);
254              
255             # Write the text r element.
256 4164     4164   4750 $self->_write_text_t( $text );
257 4164         4742  
258 4164         4393 $self->xml_end_tag( 'r' );
259             }
260 4164         7714  
261              
262             ##############################################################################
263 4164         8022 #
264             # _write_text_t()
265             #
266 4164         8703 # Write the text <t> element.
267             #
268 4164         7523  
269             my $self = shift;
270             my $text = shift;
271              
272             my @attributes = ();
273              
274             if ( $text =~ /^\s/ || $text =~ /\s$/ ) {
275             push @attributes, ( 'xml:space' => 'preserve' );
276             }
277              
278             $self->xml_data_element( 't', $text, @attributes );
279             }
280 4169     4169   4954  
281 4169         4669  
282             ##############################################################################
283 4169         4770 #
284             # _write_r_pr()
285 4169 100 100     14938 #
286 4         8 # Write the <rPr> element.
287             #
288              
289 4169         7998 my $self = shift;
290             my $font = shift;
291              
292             $self->xml_start_tag( 'rPr' );
293              
294             # Write the sz element.
295             $self->_write_sz($font->[1]);
296              
297             # Write the color element.
298             $self->_write_color();
299              
300             # Write the rFont element.
301 4164     4164   4851 $self->_write_r_font($font->[0]);
302 4164         4700  
303             # Write the family element.
304 4164         7725 $self->_write_family($font->[2]);
305              
306             $self->xml_end_tag( 'rPr' );
307 4164         8367 }
308              
309              
310 4164         8289 ##############################################################################
311             #
312             # _write_sz()
313 4164         8452 #
314             # Write the <sz> element.
315             #
316 4164         8908  
317             my $self = shift;
318 4164         7763 my $val = shift;
319              
320             my @attributes = ( 'val' => $val );
321              
322             $self->xml_empty_tag( 'sz', @attributes );
323             }
324              
325              
326             ##############################################################################
327             #
328             # _write_color()
329             #
330 4164     4164   4780 # Write the <color> element.
331 4164         4734 #
332              
333 4164         5843 my $self = shift;
334             my $indexed = 81;
335 4164         6950  
336             my @attributes = ( 'indexed' => $indexed );
337              
338             $self->xml_empty_tag( 'color', @attributes );
339             }
340              
341              
342             ##############################################################################
343             #
344             # _write_r_font()
345             #
346             # Write the <rFont> element.
347 4164     4164   4926 #
348 4164         4577  
349             my $self = shift;
350 4164         5803 my $val = shift;
351              
352 4164         6902 my @attributes = ( 'val' => $val );
353              
354             $self->xml_empty_tag( 'rFont', @attributes );
355             }
356              
357              
358             ##############################################################################
359             #
360             # _write_family()
361             #
362             # Write the <family> element.
363             #
364 4164     4164   4707  
365 4164         4868 my $self = shift;
366             my $val = shift;
367 4164         5917  
368             my @attributes = ( 'val' => $val );
369 4164         6840  
370             $self->xml_empty_tag( 'family', @attributes );
371             }
372              
373              
374             1;
375              
376              
377              
378             =pod
379              
380             =head1 NAME
381 4164     4164   4749  
382 4164         4612 Comments - A class for writing the Excel XLSX Comments files.
383              
384 4164         5751 =head1 SYNOPSIS
385              
386 4164         7003 See the documentation for L<Excel::Writer::XLSX>.
387              
388             =head1 DESCRIPTION
389              
390             This module is used in conjunction with L<Excel::Writer::XLSX>.
391              
392             =head1 AUTHOR
393              
394             John McNamara jmcnamara@cpan.org
395              
396             =head1 COPYRIGHT
397              
398             (c) MM-MMXXI, John McNamara.
399              
400             All Rights Reserved. This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.
401              
402             =head1 LICENSE
403              
404             Either the Perl Artistic Licence L<http://dev.perl.org/licenses/artistic.html> or the GPL L<http://www.opensource.org/licenses/gpl-license.php>.
405              
406             =head1 DISCLAIMER OF WARRANTY
407              
408             See the documentation for L<Excel::Writer::XLSX>.
409              
410             =cut