| 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; |