File Coverage

blib/lib/Khonsu/File.pm
Criterion Covered Total %
statement 139 150 92.6
branch 17 22 77.2
condition 9 10 90.0
subroutine 36 39 92.3
pod 0 33 0.0
total 201 254 79.1


line stmt bran cond sub pod time code
1             package Khonsu::File;
2              
3 5     5   45 use parent 'Khonsu::Ra';
  5         14  
  5         53  
4              
5 5     5   2606 use Khonsu::Page;
  5         17  
  5         172  
6 5     5   2084 use Khonsu::Page::Header;
  5         27  
  5         176  
7 5     5   2009 use Khonsu::Page::Footer;
  5         14  
  5         195  
8              
9 5     5   2676 use Module::Runtime qw/use_module/;
  5         9103  
  5         31  
10              
11             our @PLUGINS = ();
12              
13             sub load_plugin {
14 0     0 0 0 my ($self, @plugins) = @_;
15 0         0 for my $plugin (@plugins) {
16 0         0 $plugin =~ s/^\+/Khonsu::/;
17 0         0 use_module($plugin);
18 0         0 push @PLUGINS, $plugin;
19             }
20             }
21              
22             sub new {
23 4     4 0 16034 my ($self, %params) = @_;
24            
25 4         48 $self = $self->SUPER::new(%params, PLUGINS => \@PLUGINS);
26              
27 4         41 $self->add_page();
28 4 100       20 if ($params{configure}) {
29 3         85 $self->add_page_header(%{delete $params{configure}->{page_header}})
30 3 50       14 if ($params{configure}->{page_header});
31 3         37 $self->add_page_footer(%{delete $params{configure}->{page_footer}})
32 3 50       18 if ($params{configure}->{page_footer});
33 3         9 for my $key ( keys %{ $params{configure} }) {
  3         17  
34 8 50       27 if ($self->{$key}) {
35 8 100       24 if ($params{configure}->{$key}->{font}) {
36 3         35 $self->$key->font->load($self, %{ delete $params{configure}->{$key}->{font} });
  3         35  
37             }
38 8         67 $self->$key->set_attributes(%{$params{configure}->{$key}});
  8         80  
39             }
40             }
41             }
42 4         57 return $self;
43             }
44              
45              
46             sub attributes {
47 4     4 0 10 my $a = shift;
48             return (
49             file_name => {$a->RW, $a->REQ, $a->STR},
50             pdf => {$a->RW, $a->REQ, $a->OBJ},
51             pages => {$a->RW, $a->REQ, $a->DAR},
52             page => {$a->RW, $a->OBJ},
53             page_args => {$a->RW, $a->DHR},
54 4     4   14 page_offset => {$a->RW, $a->NUM, default => sub { 0 }},
55 4         606 onsave_cbs => {$a->RW, $a->DAR},
56             $a->LINE,
57             $a->BOX,
58             $a->CIRCLE,
59             $a->PIE,
60             $a->ELLIPSE,
61             $a->FONT,
62             $a->TEXT,
63             $a->H1,
64             $a->H2,
65             $a->H3,
66             $a->H4,
67             $a->H5,
68             $a->H6,
69             $a->IMAGE,
70             $a->TOC,
71             $a->FORM,
72             $a->INPUT,
73             $a->SELECT,
74             $a->CHECKBOX
75             );
76             }
77              
78             sub open_page {
79 10     10 0 36 my ($self, $page) = @_;
80 10 50       57 if ($self->pages) {
81 10         57 $self->page($self->pages->[$page - 1]);
82             }
83 10         54 return $self;
84             }
85              
86             sub set_columns {
87 2     2 0 8 my ($self, $columns) = @_;
88 2         10 $self->page->columns($columns);
89 2         12 $self->page->column_y($self->page->y);
90 2         9 return $self;
91             }
92              
93             sub add_page {
94 90     90 0 496 my ($self, %args) = @_;
95              
96             my $page = $self->page(Khonsu::Page->new(
97             header => $self->page && $self->page->header ? $self->page->header->clone() : undef,
98             footer => $self->page && $self->page->footer ? $self->page->footer->clone() : undef,
99             columns => $self->page ? $self->page->columns : 1,
100             page_size =>'A4',
101 90         430 num => scalar @{$self->pages} + 1,
102 90 100 100     485 %{ $self->page_args },
  90 100 100     478  
    100          
103             %args
104             ))->add($self);
105 90         379 splice @{$self->pages}, $page->num - 1, 0, $page;
  90         475  
106              
107 90         335 return $self;
108             }
109              
110             sub remove_page_header_and_footer {
111 3     3 0 51 my ($self) = @_;
112 3         17 $self->remove_page_header();
113 3         23 $self->remove_page_footer();
114             }
115              
116             sub remove_page_header {
117 3     3 0 9 my ($self, %args) = @_;
118 3         17 $self->page->header->active(0);
119 3         13 return $self;
120             }
121              
122             sub remove_page_footer {
123 3     3 0 14 my ($self, %args) = @_;
124 3         18 $self->page->footer->active(0);
125 3         25 return $self;
126             }
127              
128             sub add_page_header {
129 4     4 0 29 my ($self, %args) = @_;
130 4         24 $self->page->header(Khonsu::Page::Header->new(
131             %args
132             ));
133              
134 4         15 return $self;
135             }
136              
137             sub add_page_footer {
138 4     4 0 26 my ($self, %args) = @_;
139              
140 4         21 $self->page->footer(Khonsu::Page::Footer->new(
141             %args
142             ));
143              
144 4         15 return $self;
145             }
146              
147             sub add_toc {
148 4     4 0 41 my ($self, %args) = @_;
149 4         36 $self->toc->add($self, %args);
150 4         16 return $self;
151             }
152              
153             sub add_line {
154 2     2 0 21 my ($self, %args) = @_;
155 2         22 $self->line->add($self, %args);
156 2         9 return $self;
157             }
158              
159             sub add_box {
160 2     2 0 17 my ($self, %args) = @_;
161 2         19 $self->box->add($self, %args);
162 2         14 return $self;
163             }
164              
165             sub add_circle {
166 2     2 0 14 my ($self, %args) = @_;
167 2         19 $self->circle->add($self, %args);
168 2         7 return $self;
169             }
170              
171             sub add_pie {
172 4     4 0 34 my ($self, %args) = @_;
173 4         29 $self->pie->add($self, %args);
174 4         15 return $self;
175             }
176              
177             sub add_ellipse {
178 2     2 0 15 my ($self, %args) = @_;
179 2         19 $self->ellipse->add($self, %args);
180 2         7 return $self;
181             }
182              
183             sub load_font {
184 0     0 0 0 my ($self, %args) = @_;
185 0         0 $self->font->load($self, %args);
186 0         0 return $self;
187             }
188              
189             sub add_text {
190 18     18 0 99 my ($self, %args) = @_;
191 18         106 $self->text->add($self, %args);
192 18         97 return $self;
193             }
194              
195             sub add_h1 {
196 61     61 0 283 my ($self, %args) = @_;
197 61         286 $self->h1->add($self, %args);
198 61         258 return $self;
199             }
200              
201             sub add_h2 {
202 59     59 0 362 my ($self, %args) = @_;
203 59         300 $self->h2->add($self, %args);
204 59         217 return $self;
205             }
206              
207             sub add_h3 {
208 57     57 0 265 my ($self, %args) = @_;
209 57         283 $self->h3->add($self, %args);
210 57         273 return $self;
211             }
212              
213             sub add_h4 {
214 57     57 0 283 my ($self, %args) = @_;
215 57         260 $self->h4->add($self, %args);
216 57         229 return $self;
217             }
218              
219             sub add_h5 {
220 57     57 0 260 my ($self, %args) = @_;
221 57         289 $self->h5->add($self, %args);
222 57         217 return $self;
223             }
224              
225             sub add_h6 {
226 57     57 0 290 my ($self, %args) = @_;
227 57         289 $self->h6->add($self, %args);
228 57         242 return $self;
229             }
230              
231             sub add_image {
232 8     8 0 83 my ($self, %args) = @_;
233 8         69 $self->image->add($self, %args);
234 8         70 return $self;
235             }
236              
237             sub add_form {
238 0     0 0 0 my ($self, %args) = @_;
239 0         0 $self->form->add($self, %args);
240 0         0 return $self;
241             }
242              
243             sub add_input {
244 3     3 0 21 my ($self, %args) = @_;
245 3         29 $self->input->add($self, %args);
246 3         11 return $self;
247             }
248              
249             sub add_select {
250 3     3 0 17 my ($self, %args) = @_;
251 3         23 $self->select->add($self, %args);
252 3         10 return $self;
253             }
254              
255             sub add_checkbox {
256 1     1 0 5 my ($self, %args) = @_;
257 1         8 $self->checkbox->add($self, %args);
258 1         4 return $self;
259             }
260              
261             sub onsave {
262 7     7 0 48 my ($self, $plug, $meth, %args) = @_;
263 7   50     49 my $cbs = $self->onsave_cbs || [];
264 7         22 push @{$cbs}, [$plug, $meth, \%args];
  7         30  
265 7         44 $self->onsave_cbs($cbs);
266 7         26 return $self;
267             }
268              
269             sub handle_onsave {
270 4     4 0 13 my ($self) = shift;
271 4 50       25 if ($self->onsave_cbs) {
272 4         13 for my $cb (@{$self->onsave_cbs}) {
  4         27  
273 7         31 my ($plug, $meth, $args) = @{$cb};
  7         40  
274 7         39 $self->$plug->$meth($self, %{$args});
  7         103  
275             }
276             }
277            
278 4         16 for my $page (@{$self->pages}) {
  4         28  
279 90         584 $self->page($page);
280 90 100 100     547 $page->num($page->num + ($self->page_offset || 0)) if !$page->toc;
281 90         478 $page->render($self);
282             }
283             }
284              
285             sub save {
286 4     4 0 18 my ($self) = shift;
287 4         34 $self->handle_onsave();
288 4         53 $self->pdf->saveas();
289 4         20362440 $self->pdf->end();
290             }
291              
292             1;