File Coverage

blib/lib/Data/Petitcom/Resource/PRG.pm
Criterion Covered Total %
statement 75 77 97.4
branch 3 6 50.0
condition 1 2 50.0
subroutine 16 16 100.0
pod 0 2 0.0
total 95 103 92.2


line stmt bran cond sub pod time code
1             package Data::Petitcom::Resource::PRG;
2              
3 4     4   2564 use strict;
  4         8  
  4         160  
4 4     4   25 use warnings;
  4         7  
  4         131  
5              
6 4     4   22 use parent qw{ Data::Petitcom::Resource };
  4         9  
  4         32  
7              
8 4     4   5829 use Encode ();
  4         71444  
  4         100  
9 4     4   16256 use Unicode::Japanese;
  4         19327  
  4         31  
10 4     4   2965 use Data::Petitcom::CharTBL qw{ dump_char load_char };
  4         18  
  4         549  
11 4     4   1605 use Data::Petitcom::PTC;
  4         12  
  4         133  
12 4     4   59 use bytes ();
  4         11  
  4         94  
13              
14 4     4   29 use constant RESOUECE => 'PRG';
  4         10  
  4         279  
15 4     4   23 use constant PTC_OFFSET_CODE => 0x18;
  4         9  
  4         188  
16 4     4   29 use constant PTC_NAME => 'DPTC_PRG';
  4         9  
  4         3236  
17              
18             sub save {
19 2     2 0 3 my $self = shift;
20 2         5 my %opts = @_;
21 2   50     11 my $name = delete $opts{name} || PTC_NAME;
22 2         4 my $encoding = delete $opts{encoding};
23 2         8 my $ptc = $self->_create_ptc($name, $encoding);
24 2         12 return $ptc;
25             }
26              
27             sub load {
28 2     2 0 5 my $self = shift;
29 2         6 my ( $ptc, %opts ) = @_;
30 2         5 my $zenkaku = delete $opts{zenkaku};
31 2         2 my $encoding = delete $opts{encoding};
32 2         9 my $code = substr $ptc->data, PTC_OFFSET_CODE;
33 2         8 $self->data( _decode( $code, $zenkaku, $encoding ) );
34 2         12 return $self;
35             }
36              
37             sub _create_ptc {
38 2     2   5 my $self = shift;
39 2         4 my ($name, $encoding) = @_;
40 2         10 my $ptc = Data::Petitcom::PTC->new(
41             resource => RESOUECE,
42             name => $name,
43             );
44 2         10 my $code = _encode( $self->data, $encoding );
45 2         8 my $header_data = pack 'C*', 0x00, 0x00, 0x00, 0x00;
46 2         6 $header_data .= pack 'C*', 0x00, 0x00, 0x00, 0x00;
47 2         12 $header_data .= pack 'I', bytes::length( $code );
48 2         31 $ptc->data( $header_data . $code );
49 2         8 return $ptc;
50             }
51              
52             sub _encode {
53 3     3   800 my $code = shift;
54 3         6 my $encoding = shift;
55 3 50       25 $code = ($encoding)
56             ? Encode::find_encoding($encoding)->decode($code)
57             : Encode::decode_utf8($code);
58 2         124 $code = Unicode::Japanese->new($code)->hira2kata->z2h->getu;
59 2         19025 $code =~ s/\r\n/\r/g;
60 2         16 $code =~ s/\n/\r/g;
61 2         7 my $encoded = '';
62 2         14 for my $i ( 0 .. ( length($code) - 1 ) ) {
63 40         236 my $char = substr( $code, $i, 1 );
64 40         278 $encoded .= dump_char($char);
65             }
66 2         13 return $encoded;
67             }
68              
69             sub _decode {
70 2     2   4 my $binary = shift;
71 2         5 my ( $zenkaku, $encoding ) = @_;
72 2         4 my $decoded = '';
73 2         11 for my $i ( 0 .. ( bytes::length($binary) - 1 ) ) {
74 40         131 my $byte = bytes::substr( $binary, $i, 1 );
75 40         273 $decoded .= load_char($byte);
76             }
77 2 50       13 if ($zenkaku) {
78             # $decoded = Unicode::Japanese->new($decoded)->h2zKanaK->get;
79             # $decoded = Unicode::Japanese->new($decoded)->h2z->get;
80 0         0 $decoded = Unicode::Japanese->new($decoded)->h2zKanaK->h2z->getu;
81             }
82 2 50       12 if ($encoding) {
83 0         0 Encode::from_to( $decoded, 'utf8', $encoding );
84             }
85 2         20 return $decoded;
86             }
87              
88             1;