-
Notifications
You must be signed in to change notification settings - Fork 1
/
BWIPP.pm
307 lines (207 loc) · 7.59 KB
/
BWIPP.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
package Alien::BWIPP;
use 5.010;
use utf8;
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars %LAST_PAREN_MATCH);
use File::ShareDir qw(dist_file);
use IO::File qw();
use Moose::Meta::Class qw();
use Moose qw(has);
use MooseX::ClassAttribute qw(class_has);
use Storable qw(dclone);
our $VERSION = '0.006';
has 'barcode_source_handle' => (
is => 'rw',
isa => 'IO::File',
default => sub {
return IO::File->new(dist_file('Alien-BWIPP', 'barcode.ps'), 'r');
},
);
has '_chunks' => (is => 'ro', isa => 'HashRef', lazy_build => 1,);
has '_encoders' => (
is => 'ro',
isa => 'ArrayRef',
lazy_build => 1,
);
class_has 'encoders_meta_classes' => (is => 'rw', isa => 'ArrayRef[Moose::Meta::Class]',);
sub _build__chunks {
my ($self) = @_;
my %chunks;
{
while (defined(my $line = $self->barcode_source_handle->getline)) {
state $block_type = 'HEADER';
state $block_name;
given ($line) {
when (/\A% Barcode Writer in Pure PostScript - Version/) {
$block_name = 'LICENCE';
continue;
}
when (/\A% --BEGIN PREAMBLE--/) {
$block_name = 'PREAMBLE';
}
when (/\A %[ ]--BEGIN[ ](?<type>(?:RENDER|ENCOD)ER)[ ](?<name>\w+)--/msx) {
$block_type = $LAST_PAREN_MATCH{type} if $LAST_PAREN_MATCH{type};
$block_name = $LAST_PAREN_MATCH{name} if $LAST_PAREN_MATCH{name};
}
when (/\A % [ ] --
(?<feature_name>\w+) :? [ ]?
(?<feature_value>.*?)
(?:--)? \n \z/msx
) {
unless ($LAST_PAREN_MATCH{feature_name} ~~ [qw(BEGIN END)]) {
$chunks{ENCODER}{$block_name}{$LAST_PAREN_MATCH{feature_name}}
= $LAST_PAREN_MATCH{feature_value};
}
}
default {
$chunks{$block_type}{$block_name}{post_script_source_code} .= $line if $block_name;
}
}
}
}
return \%chunks;
}
sub _build__encoders {
my ($self) = @_;
return [keys %{$self->_chunks->{ENCODER}}];
}
sub create_classes {
my ($self) = @_;
my @meta_classes;
my %chunks = %{$self->_chunks};
for my $encoder (@{$self->_encoders}) {
my $prepended = $chunks{HEADER}{LICENCE}{post_script_source_code}
. $chunks{HEADER}{PREAMBLE}{post_script_source_code};
for my $renderer (split q{ }, $chunks{ENCODER}{$encoder}{RNDR}) {
$prepended .= $chunks{RENDERER}{$renderer}{post_script_source_code};
}
for my $dependency_type (qw(REQUIRES SUGGESTS)) {
if (exists $chunks{ENCODER}{$encoder}{$dependency_type}) {
for my $dependency (split q{ }, $chunks{ENCODER}{$encoder}{$dependency_type}) {
$prepended .= $chunks{ENCODER}{$dependency}{post_script_source_code};
}
}
}
my $class_name = $self->meta->name . q{::} . $encoder;
my $meta_class = Moose::Meta::Class->create($class_name,
superclasses => ['Moose::Object'],);
for my $attribute_name (keys %{$chunks{ENCODER}{$encoder}}) {
my $attribute_value = $chunks{ENCODER}{$encoder}{$attribute_name};
$attribute_value = dclone($attribute_value) if ref $attribute_value;
$attribute_value = $prepended . $attribute_value
if 'post_script_source_code' eq $attribute_name;
$meta_class->add_attribute($attribute_name =>
(is => 'ro', default => sub {return $attribute_value;},));
}
push @meta_classes, $meta_class;
}
$self->encoders_meta_classes([@meta_classes]);
return;
}
sub import {
my ($class) = @_;
$class->new->create_classes;
}
1;
__END__
=encoding UTF-8
=head1 NAME
Alien::BWIPP - Barcode Writer in Pure PostScript
=head1 VERSION
This document describes C<Alien::BWIPP> version C<0.006>. It is based on
I<Barcode Writer in Pure PostScript> version C<2010-06-20>.
=head1 SYNOPSIS
use Alien::BWIPP;
say $_->name for @{Alien::BWIPP->encoders_meta_classes};
=head1 DESCRIPTION
This modules builds encoder classes from PostScript source.
=head1 INTERFACE
=head2 C<import>
Class method, automatically called by L<use>. Creates an instance and calls
L</create_classes>.
=head2 C<create_classes>
Method, builds encoder classes. The generated classes may have the following
attributes:
=over
=item C<post_script_source_code>
Ready to use PostScript source code, concatenated from the encoder source
code and the renderer needed by it.
=item DESC
Human readable description of this encoder. Example:
AusPost 4 State Customer Code
=item EXAM
Example string for this encoder. Example:
0123456789
=item EXOP
Stringified list of example options for this encoder. Example:
includetext includecheck includecheckintext
=item RNDR
Stringified list of renderers needed for this encoder. Example:
renlinear renmatrix
=item REQUIRES
=item SUGGESTS
=back
=head2 C<encoders_meta_classes>
Class Attribute, returns the generated meta classes as
ArrayRef[L<Moose::Meta::Class>].
=head1 EXPORTS
Nothing.
=head1 DIAGNOSTICS
None.
=head1 CONFIGURATION AND ENVIRONMENT
C<Alien::BWIPP> requires no configuration files or environment variables.
=head1 DEPENDENCIES
=head2 Configure time
Perl 5.10, L<Module::Build> >= 0.35_14
=head2 Run time
=head3 core modules
Perl 5.10, L<English>, L<IO::File>, L<Storable>
=head3 CPAN modules
L<File::ShareDir>, L<Moose>, L<Moose::Meta::Class>, L<MooseX::ClassAttribute>
=head1 INCOMPATIBILITIES
None reported.
=head1 BUGS AND LIMITATIONS
No bugs have been reported.
Please report any bugs or feature requests to
L<http://github.com/daxim/Alien-BWIPP/issues>,
or send an email to the maintainer.
=head1 TO DO
No future plans yet.
Suggest more future plans by L<filing a bug|/"BUGS AND LIMITATIONS">.
=head1 AUTHOR
=head2 Distribution maintainer
Lars Dɪᴇᴄᴋᴏᴡ C<< <daxim@cpan.org> >>
=head2 Contributors
See file F<AUTHORS>.
=head1 LICENCE AND COPYRIGHT
=head2 F<barcode.ps>
Barcode Writer in Pure PostScript - Version 2010-06-20
Copyright © 2004-2010 Terry Burton C<< <tez@terryburton.co.uk> >>
Permission is hereby granted, free of charge, to any
person obtaining a copy of this software and associated
documentation files (the "Software"), to deal in the
Software without restriction, including without
limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software
is furnished to do so, subject to the following
conditions:
The above copyright notice and this permission notice
shall be included in all copies or substantial portions
of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
=head2 All other files
Copyright © 2010 Lars Dɪᴇᴄᴋᴏᴡ C<< <daxim@cpan.org> >>
Distributable under the same licence.
=head1 SEE ALSO
homepage L<http://www.terryburton.co.uk/barcodewriter/>,
manual L<http://groups.google.com/group/postscriptbarcode/web>