File Coverage

blib/lib/App/week/Util.pm
Criterion Covered Total %
statement 20 78 25.6
branch 0 24 0.0
condition 0 8 0.0
subroutine 7 14 50.0
pod 0 7 0.0
total 27 131 20.6


line stmt bran cond sub pod time code
1             package App::week;
2              
3 1     1   18 use v5.14;
  1         3  
4 1     1   7 use warnings;
  1         2  
  1         47  
5 1     1   7 use utf8;
  1         2  
  1         5  
6              
7 1     1   34 use Data::Dumper;
  1         2  
  1         46  
8 1     1   550 use Text::ANSI::Fold;
  1         61249  
  1         62  
9 1     1   467 use Date::Japanese::Era;
  1         1408  
  1         4  
10 1     1   902 use List::Util qw(pairmap);
  1         3  
  1         548  
11              
12             sub make_options {
13             map {
14             # "foo_bar" -> "foo_bar|foo-bar|foobar"
15 0           s{^(?=\w+_)(\w+)\K}{
16 0           "|" . $1 =~ tr[_][-]r . "|" . $1 =~ tr[_][]dr
17             }er;
18             }
19             grep {
20 0           s/#.*//;
21 0           s/\s+//g;
22 0           /\S/;
23             }
24 0     0 0   map { split /\n+/ }
  0            
25             @_;
26             }
27              
28             my %abbr = do {
29             pairmap {
30             ( $a => $b, substr($b, 0, 1) => $b )
31             }
32             map { split /:/ }
33             qw( M:明治 T:大正 S:昭和 H:平成 R:令和 );
34             };
35              
36             my @month_name = qw(JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC);
37             my %month = map { $month_name[$_] => $_ + 1 } 0 .. $#month_name;
38             my $month_re = do { local $" = '|'; qr/(?:@month_name)/i };
39              
40             sub guess_date {
41 0     0 0   my $__ = $_;
42 0           my @args = \(
43             my($year, $mon, $mday, $show_year) = @_
44             );
45              
46             # Jan ... Dec
47 0 0         if (/^($month_re)/) {
    0          
48 0           $mon = $month{uc($1)};
49             }
50             elsif (m{
51             ^
52             (? (?: [A-Z] | \p{Han}+ ) \d++ ) [-./年]?
53             (?: (? \d++ ) [-./月]?
54             (?: (? \d++ ) [日]? )?
55             )?
56             $
57             }ix)
58             {
59 0           my %m = %+;
60 0           (my $era_str = $m{Y}) =~ s{^([A-Z\p{Han}])(?=\d)}{
61 0   0       $abbr{uc $1} // $1
62             }ie;
63 0 0         my $era = eval { Date::Japanese::Era->new($era_str) } or do {
  0            
64 0           my $warn = $@ =~ s/ at .*//sr;
65 0           die "$_: format error ($warn)\n";
66             };
67 0           $year = $era->gregorian_year;
68 0 0         if ($m{D}) {
69 0           ($mon, $mday) = ($m{M}, $m{D});
70             } else {
71 0           $show_year++;
72 0           undef $mday;
73             }
74             }
75             else {
76 0 0         $mday = $1 if s{[-./]*(\d+)日?$}{};
77 0 0         $mon = $1 if s{[-./]*(\d+)月?$}{};
78 0 0         $year = $1 if s{(?:西暦)?(\d+)年?$}{};
79 0 0 0       if (defined $mday and $mday > 31) {
80 0           $year = $mday;
81 0           undef $mday;
82 0           $show_year++;
83             }
84 0 0         if (length) {
85 0           die "$__: format error\n";
86             }
87             }
88              
89 0           map ${$_}, @args;
  0            
90             }
91              
92             sub split_week {
93 0     0 0   state $fold = new Text::ANSI::Fold width => [ (1, 2) x 8, 1 ];
94 0           $fold->text(+shift)->chops;
95             }
96              
97             sub transpose {
98 0     0 0   my @x;
99 0           my @orig = map { [ @$_ ] } @_;
  0            
100 0           while (my @l = grep { @$_ > 0 } @orig) {
  0            
101 0           push @x, [ map { shift @$_ } @l ];
  0            
102             }
103 0           @x;
104             }
105              
106             sub decode_argv {
107             map {
108 0 0   0 0   utf8::is_utf8($_) ? $_ : decode('utf8', $_);
  0            
109             }
110             @_;
111             }
112              
113             sub apply {
114 0     0 0   my($sub, $hash, @keys) = @_;
115 0           @{$hash}{@keys} = $sub->(@{$hash}{@keys});
  0            
  0            
116             }
117              
118             sub call {
119 0     0 0   my($sub, %opt) = @_;
120 0 0         my $hash = $opt{for} or die;
121 0   0       my $with = $opt{with} // [];
122 0 0         my @keys = ref $with eq 'ARRAY' ? @{$with} : $with;
  0            
123 0           @{$hash}{@keys} = $sub->(@{$hash}{@keys});
  0            
  0            
124             }
125              
126             1;