File Coverage

blib/lib/App/week/Util.pm
Criterion Covered Total %
statement 22 78 28.2
branch 1 24 4.1
condition 0 8 0.0
subroutine 8 14 57.1
pod 0 7 0.0
total 31 131 23.6


line stmt bran cond sub pod time code
1             package App::week;
2              
3 4     4   57 use v5.24;
  4         25  
4 4     4   43 use warnings;
  4         6  
  4         209  
5 4     4   17 use utf8;
  4         7  
  4         30  
6              
7 4     4   104 use Data::Dumper;
  4         6  
  4         195  
8 4     4   2246 use Text::ANSI::Fold;
  4         277743  
  4         327  
9 4     4   2709 use Date::Japanese::Era;
  4         6726  
  4         23  
10 4     4   4355 use List::Util qw(pairmap);
  4         9  
  4         6375  
11              
12             sub make_options {
13             map {
14             # "foo_bar" -> "foo_bar|foo-bar|foobar"
15 0         0 s{^(?=\w+_)(\w+)\K}{
16 0         0 "|" . $1 =~ tr[_][-]r . "|" . $1 =~ tr[_][]dr
17             }er;
18             }
19             grep {
20 0         0 s/#.*//;
21 0         0 s/\s+//g;
22 0         0 /\S/;
23             }
24 0     0 0 0 map { split /\n+/ }
  0         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 } keys @month_name;
38             my $month_re = do { local $" = '|'; qr/(?:@month_name)/i };
39              
40             sub guess_date {
41 0     0 0 0 my $__ = $_;
42 0         0 my @args = \(
43             my($year, $mon, $mday, $show_year) = @_
44             );
45              
46             # Jan ... Dec
47 0 0       0 if (/^($month_re)/) {
    0          
48 0         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         0 my %m = %+;
60 0         0 (my $era_str = $m{Y}) =~ s{^([A-Z\p{Han}])(?=\d)}{
61 0   0     0 $abbr{uc $1} // $1
62             }ie;
63 0 0       0 my $era = eval { Date::Japanese::Era->new($era_str) } or do {
  0         0  
64 0         0 my $warn = $@ =~ s/ at .*//sr;
65 0         0 die "$_: format error ($warn)\n";
66             };
67 0         0 $year = $era->gregorian_year;
68 0 0       0 if ($m{D}) {
69 0         0 ($mon, $mday) = ($m{M}, $m{D});
70             } else {
71 0         0 $show_year++;
72 0         0 undef $mday;
73             }
74             }
75             else {
76 0 0       0 $mday = $1 if s{[-./]*(\d+)日?$}{};
77 0 0       0 $mon = $1 if s{[-./]*(\d+)月?$}{};
78 0 0       0 $year = $1 if s{(?:西暦)?(\d+)年?$}{};
79 0 0 0     0 if (defined $mday and $mday > 31) {
80 0         0 $year = $mday;
81 0         0 undef $mday;
82 0         0 $show_year++;
83             }
84 0 0       0 if (length) {
85 0         0 die "$__: format error\n";
86             }
87             }
88              
89 0         0 map ${$_}, @args;
  0         0  
90             }
91              
92             sub split_week {
93 0     0 0 0 state $fold = new Text::ANSI::Fold width => [ (1, 2) x 8, 1 ];
94 0         0 $fold->text(+shift)->chops;
95             }
96              
97             sub transpose {
98 0     0 0 0 my @x;
99 0         0 my @orig = map { [ @$_ ] } @_;
  0         0  
100 0         0 while (my @l = grep { @$_ > 0 } @orig) {
  0         0  
101 0         0 push @x, [ map { shift @$_ } @l ];
  0         0  
102             }
103 0         0 @x;
104             }
105              
106             sub decode_argv {
107             map {
108 3 50   3 0 9 utf8::is_utf8($_) ? $_ : decode('utf8', $_);
  3         46  
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;