line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Khonsu::File; |
2
|
|
|
|
|
|
|
|
3
|
5
|
|
|
5
|
|
45
|
use parent 'Khonsu::Ra'; |
|
5
|
|
|
|
|
12
|
|
|
5
|
|
|
|
|
41
|
|
4
|
|
|
|
|
|
|
|
5
|
5
|
|
|
5
|
|
2677
|
use Khonsu::Page; |
|
5
|
|
|
|
|
16
|
|
|
5
|
|
|
|
|
154
|
|
6
|
5
|
|
|
5
|
|
1937
|
use Khonsu::Page::Header; |
|
5
|
|
|
|
|
16
|
|
|
5
|
|
|
|
|
201
|
|
7
|
5
|
|
|
5
|
|
1938
|
use Khonsu::Page::Footer; |
|
5
|
|
|
|
|
15
|
|
|
5
|
|
|
|
|
181
|
|
8
|
|
|
|
|
|
|
|
9
|
5
|
|
|
5
|
|
2455
|
use Module::Runtime qw/use_module/; |
|
5
|
|
|
|
|
8838
|
|
|
5
|
|
|
|
|
29
|
|
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
|
15492
|
my ($self, %params) = @_; |
24
|
|
|
|
|
|
|
|
25
|
4
|
|
|
|
|
47
|
$self = $self->SUPER::new(%params, PLUGINS => \@PLUGINS); |
26
|
|
|
|
|
|
|
|
27
|
4
|
|
|
|
|
41
|
$self->add_page(); |
28
|
4
|
100
|
|
|
|
24
|
if ($params{configure}) { |
29
|
3
|
|
|
|
|
84
|
$self->add_page_header(%{delete $params{configure}->{page_header}}) |
30
|
3
|
50
|
|
|
|
13
|
if ($params{configure}->{page_header}); |
31
|
3
|
|
|
|
|
31
|
$self->add_page_footer(%{delete $params{configure}->{page_footer}}) |
32
|
3
|
50
|
|
|
|
27
|
if ($params{configure}->{page_footer}); |
33
|
3
|
|
|
|
|
40
|
for my $key ( keys %{ $params{configure} }) { |
|
3
|
|
|
|
|
26
|
|
34
|
8
|
50
|
|
|
|
29
|
if ($self->{$key}) { |
35
|
8
|
100
|
|
|
|
24
|
if ($params{configure}->{$key}->{font}) { |
36
|
3
|
|
|
|
|
25
|
$self->$key->font->load($self, %{ delete $params{configure}->{$key}->{font} }); |
|
3
|
|
|
|
|
23
|
|
37
|
|
|
|
|
|
|
} |
38
|
8
|
|
|
|
|
63
|
$self->$key->set_attributes(%{$params{configure}->{$key}}); |
|
8
|
|
|
|
|
81
|
|
39
|
|
|
|
|
|
|
} |
40
|
|
|
|
|
|
|
} |
41
|
|
|
|
|
|
|
} |
42
|
4
|
|
|
|
|
30
|
return $self; |
43
|
|
|
|
|
|
|
} |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
sub attributes { |
47
|
4
|
|
|
4
|
0
|
9
|
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
|
|
17
|
page_offset => {$a->RW, $a->NUM, default => sub { 0 }}, |
55
|
4
|
|
|
|
|
481
|
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
|
42
|
my ($self, $page) = @_; |
80
|
10
|
50
|
|
|
|
57
|
if ($self->pages) { |
81
|
10
|
|
|
|
|
56
|
$self->page($self->pages->[$page - 1]); |
82
|
|
|
|
|
|
|
} |
83
|
10
|
|
|
|
|
43
|
return $self; |
84
|
|
|
|
|
|
|
} |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
sub set_columns { |
87
|
2
|
|
|
2
|
0
|
7
|
my ($self, $columns) = @_; |
88
|
2
|
|
|
|
|
14
|
$self->page->columns($columns); |
89
|
2
|
|
|
|
|
11
|
$self->page->column_y($self->page->y); |
90
|
2
|
|
|
|
|
6
|
return $self; |
91
|
|
|
|
|
|
|
} |
92
|
|
|
|
|
|
|
|
93
|
|
|
|
|
|
|
sub add_page { |
94
|
90
|
|
|
90
|
0
|
481
|
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
|
|
|
|
|
434
|
num => scalar @{$self->pages} + 1, |
102
|
90
|
100
|
100
|
|
|
455
|
%{ $self->page_args }, |
|
90
|
100
|
100
|
|
|
430
|
|
|
|
100
|
|
|
|
|
|
103
|
|
|
|
|
|
|
%args |
104
|
|
|
|
|
|
|
))->add($self); |
105
|
90
|
|
|
|
|
347
|
splice @{$self->pages}, $page->num - 1, 0, $page; |
|
90
|
|
|
|
|
360
|
|
106
|
|
|
|
|
|
|
|
107
|
90
|
|
|
|
|
302
|
return $self; |
108
|
|
|
|
|
|
|
} |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
sub remove_page_header_and_footer { |
111
|
3
|
|
|
3
|
0
|
48
|
my ($self) = @_; |
112
|
3
|
|
|
|
|
19
|
$self->remove_page_header(); |
113
|
3
|
|
|
|
|
18
|
$self->remove_page_footer(); |
114
|
|
|
|
|
|
|
} |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
sub remove_page_header { |
117
|
3
|
|
|
3
|
0
|
9
|
my ($self, %args) = @_; |
118
|
3
|
|
|
|
|
14
|
$self->page->header->active(0); |
119
|
3
|
|
|
|
|
8
|
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
|
41
|
my ($self, %args) = @_; |
130
|
4
|
|
|
|
|
32
|
$self->page->header(Khonsu::Page::Header->new( |
131
|
|
|
|
|
|
|
%args |
132
|
|
|
|
|
|
|
)); |
133
|
|
|
|
|
|
|
|
134
|
4
|
|
|
|
|
20
|
return $self; |
135
|
|
|
|
|
|
|
} |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
sub add_page_footer { |
138
|
4
|
|
|
4
|
0
|
21
|
my ($self, %args) = @_; |
139
|
|
|
|
|
|
|
|
140
|
4
|
|
|
|
|
22
|
$self->page->footer(Khonsu::Page::Footer->new( |
141
|
|
|
|
|
|
|
%args |
142
|
|
|
|
|
|
|
)); |
143
|
|
|
|
|
|
|
|
144
|
4
|
|
|
|
|
14
|
return $self; |
145
|
|
|
|
|
|
|
} |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
sub add_toc { |
148
|
4
|
|
|
4
|
0
|
38
|
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
|
13
|
my ($self, %args) = @_; |
155
|
2
|
|
|
|
|
19
|
$self->line->add($self, %args); |
156
|
2
|
|
|
|
|
8
|
return $self; |
157
|
|
|
|
|
|
|
} |
158
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
sub add_box { |
160
|
2
|
|
|
2
|
0
|
14
|
my ($self, %args) = @_; |
161
|
2
|
|
|
|
|
17
|
$self->box->add($self, %args); |
162
|
2
|
|
|
|
|
19
|
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
|
|
|
|
|
8
|
return $self; |
169
|
|
|
|
|
|
|
} |
170
|
|
|
|
|
|
|
|
171
|
|
|
|
|
|
|
sub add_pie { |
172
|
4
|
|
|
4
|
0
|
27
|
my ($self, %args) = @_; |
173
|
4
|
|
|
|
|
31
|
$self->pie->add($self, %args); |
174
|
4
|
|
|
|
|
13
|
return $self; |
175
|
|
|
|
|
|
|
} |
176
|
|
|
|
|
|
|
|
177
|
|
|
|
|
|
|
sub add_ellipse { |
178
|
2
|
|
|
2
|
0
|
13
|
my ($self, %args) = @_; |
179
|
2
|
|
|
|
|
21
|
$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
|
105
|
my ($self, %args) = @_; |
191
|
18
|
|
|
|
|
110
|
$self->text->add($self, %args); |
192
|
18
|
|
|
|
|
134
|
return $self; |
193
|
|
|
|
|
|
|
} |
194
|
|
|
|
|
|
|
|
195
|
|
|
|
|
|
|
sub add_h1 { |
196
|
61
|
|
|
61
|
0
|
307
|
my ($self, %args) = @_; |
197
|
61
|
|
|
|
|
263
|
$self->h1->add($self, %args); |
198
|
61
|
|
|
|
|
235
|
return $self; |
199
|
|
|
|
|
|
|
} |
200
|
|
|
|
|
|
|
|
201
|
|
|
|
|
|
|
sub add_h2 { |
202
|
59
|
|
|
59
|
0
|
272
|
my ($self, %args) = @_; |
203
|
59
|
|
|
|
|
287
|
$self->h2->add($self, %args); |
204
|
59
|
|
|
|
|
218
|
return $self; |
205
|
|
|
|
|
|
|
} |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
sub add_h3 { |
208
|
57
|
|
|
57
|
0
|
256
|
my ($self, %args) = @_; |
209
|
57
|
|
|
|
|
258
|
$self->h3->add($self, %args); |
210
|
57
|
|
|
|
|
204
|
return $self; |
211
|
|
|
|
|
|
|
} |
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
sub add_h4 { |
214
|
57
|
|
|
57
|
0
|
260
|
my ($self, %args) = @_; |
215
|
57
|
|
|
|
|
265
|
$self->h4->add($self, %args); |
216
|
57
|
|
|
|
|
209
|
return $self; |
217
|
|
|
|
|
|
|
} |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
sub add_h5 { |
220
|
57
|
|
|
57
|
0
|
274
|
my ($self, %args) = @_; |
221
|
57
|
|
|
|
|
270
|
$self->h5->add($self, %args); |
222
|
57
|
|
|
|
|
224
|
return $self; |
223
|
|
|
|
|
|
|
} |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
sub add_h6 { |
226
|
57
|
|
|
57
|
0
|
264
|
my ($self, %args) = @_; |
227
|
57
|
|
|
|
|
274
|
$self->h6->add($self, %args); |
228
|
57
|
|
|
|
|
271
|
return $self; |
229
|
|
|
|
|
|
|
} |
230
|
|
|
|
|
|
|
|
231
|
|
|
|
|
|
|
sub add_image { |
232
|
8
|
|
|
8
|
0
|
60
|
my ($self, %args) = @_; |
233
|
8
|
|
|
|
|
61
|
$self->image->add($self, %args); |
234
|
8
|
|
|
|
|
74
|
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
|
17
|
my ($self, %args) = @_; |
245
|
3
|
|
|
|
|
25
|
$self->input->add($self, %args); |
246
|
3
|
|
|
|
|
15
|
return $self; |
247
|
|
|
|
|
|
|
} |
248
|
|
|
|
|
|
|
|
249
|
|
|
|
|
|
|
sub add_select { |
250
|
3
|
|
|
3
|
0
|
18
|
my ($self, %args) = @_; |
251
|
3
|
|
|
|
|
21
|
$self->select->add($self, %args); |
252
|
3
|
|
|
|
|
13
|
return $self; |
253
|
|
|
|
|
|
|
} |
254
|
|
|
|
|
|
|
|
255
|
|
|
|
|
|
|
sub add_checkbox { |
256
|
1
|
|
|
1
|
0
|
6
|
my ($self, %args) = @_; |
257
|
1
|
|
|
|
|
9
|
$self->checkbox->add($self, %args); |
258
|
1
|
|
|
|
|
4
|
return $self; |
259
|
|
|
|
|
|
|
} |
260
|
|
|
|
|
|
|
|
261
|
|
|
|
|
|
|
sub onsave { |
262
|
7
|
|
|
7
|
0
|
43
|
my ($self, $plug, $meth, %args) = @_; |
263
|
7
|
|
50
|
|
|
52
|
my $cbs = $self->onsave_cbs || []; |
264
|
7
|
|
|
|
|
19
|
push @{$cbs}, [$plug, $meth, \%args]; |
|
7
|
|
|
|
|
29
|
|
265
|
7
|
|
|
|
|
43
|
$self->onsave_cbs($cbs); |
266
|
7
|
|
|
|
|
21
|
return $self; |
267
|
|
|
|
|
|
|
} |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
sub handle_onsave { |
270
|
4
|
|
|
4
|
0
|
14
|
my ($self) = shift; |
271
|
4
|
50
|
|
|
|
25
|
if ($self->onsave_cbs) { |
272
|
4
|
|
|
|
|
12
|
for my $cb (@{$self->onsave_cbs}) { |
|
4
|
|
|
|
|
25
|
|
273
|
7
|
|
|
|
|
27
|
my ($plug, $meth, $args) = @{$cb}; |
|
7
|
|
|
|
|
35
|
|
274
|
7
|
|
|
|
|
43
|
$self->$plug->$meth($self, %{$args}); |
|
7
|
|
|
|
|
74
|
|
275
|
|
|
|
|
|
|
} |
276
|
|
|
|
|
|
|
} |
277
|
|
|
|
|
|
|
|
278
|
4
|
|
|
|
|
16
|
for my $page (@{$self->pages}) { |
|
4
|
|
|
|
|
28
|
|
279
|
90
|
|
|
|
|
528
|
$self->page($page); |
280
|
90
|
100
|
100
|
|
|
588
|
$page->num($page->num + ($self->page_offset || 0)) if !$page->toc; |
281
|
90
|
|
|
|
|
555
|
$page->render($self); |
282
|
|
|
|
|
|
|
} |
283
|
|
|
|
|
|
|
} |
284
|
|
|
|
|
|
|
|
285
|
|
|
|
|
|
|
sub save { |
286
|
4
|
|
|
4
|
0
|
17
|
my ($self) = shift; |
287
|
4
|
|
|
|
|
33
|
$self->handle_onsave(); |
288
|
4
|
|
|
|
|
29
|
$self->pdf->saveas(); |
289
|
4
|
|
|
|
|
20134863
|
$self->pdf->end(); |
290
|
|
|
|
|
|
|
} |
291
|
|
|
|
|
|
|
|
292
|
|
|
|
|
|
|
1; |