line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package App::week; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
13
|
use v5.14; |
|
1
|
|
|
|
|
4
|
|
4
|
1
|
|
|
1
|
|
8
|
use warnings; |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
40
|
|
5
|
1
|
|
|
1
|
|
6
|
use utf8; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
6
|
|
6
|
|
|
|
|
|
|
|
7
|
1
|
|
|
1
|
|
24
|
use Data::Dumper; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
54
|
|
8
|
1
|
|
|
1
|
|
579
|
use Text::ANSI::Fold; |
|
1
|
|
|
|
|
60696
|
|
|
1
|
|
|
|
|
69
|
|
9
|
1
|
|
|
1
|
|
454
|
use Date::Japanese::Era; |
|
1
|
|
|
|
|
1406
|
|
|
1
|
|
|
|
|
4
|
|
10
|
1
|
|
|
1
|
|
935
|
use List::Util qw(pairmap); |
|
1
|
|
|
|
|
3
|
|
|
1
|
|
|
|
|
515
|
|
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; |