| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
=head1 NAME |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
ical - Module to support Apple macOS Calendar data |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
6
|
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
greple -Mical [ options ] |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
--simple print data in on line |
|
10
|
|
|
|
|
|
|
--detail print one line data with descrition if available |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
Exported functions |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
&print_ical_simple |
|
15
|
|
|
|
|
|
|
&print_ical_desc |
|
16
|
|
|
|
|
|
|
&print_ical_detail |
|
17
|
|
|
|
|
|
|
|
|
18
|
|
|
|
|
|
|
=head1 SAMPLES |
|
19
|
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
greple -Mical [ -dnf ] ... |
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
greple -Mical --simple ... |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
greple -Mical --detail ... |
|
25
|
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
greple -Mical --all --print print_desc ... |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
Used without options, it will search all macOS Calendar files under |
|
31
|
|
|
|
|
|
|
user's home directory. |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
With B<--simple> option, summarize content in single line. Output is |
|
34
|
|
|
|
|
|
|
not sorted. |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
With B<--detail> option, print summarized line with description data |
|
37
|
|
|
|
|
|
|
if it is attached. The result is sorted. |
|
38
|
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
Sample: |
|
40
|
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
BEGIN:VEVENT |
|
42
|
|
|
|
|
|
|
UID:19970901T130000Z-123401@host.com |
|
43
|
|
|
|
|
|
|
DTSTAMP:19970901T1300Z |
|
44
|
|
|
|
|
|
|
DTSTART:19970903T163000Z |
|
45
|
|
|
|
|
|
|
DTEND:19970903T190000Z |
|
46
|
|
|
|
|
|
|
SUMMARY:Annual Employee Review |
|
47
|
|
|
|
|
|
|
CLASS:PRIVATE |
|
48
|
|
|
|
|
|
|
CATEGORIES:BUSINESS,HUMAN RESOURCES |
|
49
|
|
|
|
|
|
|
END:VEVENT |
|
50
|
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
=head1 TIPS |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
Use C<-dfn> option to observe the command running status. |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
Use C<-ds> option to see statistics information such as how many files |
|
56
|
|
|
|
|
|
|
were searched. |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
=head1 SEE ALSO |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
RFC2445 |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
=head1 AUTHOR |
|
63
|
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
Kazumasa Utashiro |
|
65
|
|
|
|
|
|
|
|
|
66
|
|
|
|
|
|
|
=head1 LICENSE |
|
67
|
|
|
|
|
|
|
|
|
68
|
|
|
|
|
|
|
Copyright 2017-2022 Kazumasa Utashiro. |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or modify |
|
71
|
|
|
|
|
|
|
it under the same terms as Perl itself. |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=cut |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
package App::Greple::ical; |
|
76
|
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
our $VERSION = '0.02'; |
|
78
|
|
|
|
|
|
|
|
|
79
|
1
|
|
|
1
|
|
612
|
use v5.14; |
|
|
1
|
|
|
|
|
3
|
|
|
80
|
1
|
|
|
1
|
|
4
|
use warnings; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
21
|
|
|
81
|
1
|
|
|
1
|
|
4
|
use Carp; |
|
|
1
|
|
|
|
|
1
|
|
|
|
1
|
|
|
|
|
48
|
|
|
82
|
1
|
|
|
1
|
|
4
|
use Exporter 'import'; |
|
|
1
|
|
|
|
|
2
|
|
|
|
1
|
|
|
|
|
499
|
|
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
our @EXPORT = qw(&print_simple &print_detail &print_desc); |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
sub print_detail { |
|
87
|
0
|
|
|
0
|
0
|
|
$_ = &print_simple . &print_desc . "\n"; |
|
88
|
0
|
|
|
|
|
|
s/\n(?=.)/\r/sg; |
|
89
|
0
|
|
|
|
|
|
$_; |
|
90
|
|
|
|
|
|
|
} |
|
91
|
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
sub print_simple { |
|
93
|
0
|
|
|
0
|
0
|
|
s/\r//g; |
|
94
|
0
|
|
|
|
|
|
my $s = ''; |
|
95
|
0
|
|
|
|
|
|
my(@s, @e); |
|
96
|
0
|
0
|
|
|
|
|
if (@s = /^DTSTART.*(\d{4})(\d\d)(\d\d)(?:T(\d\d)(\d\d))?/m) { |
|
97
|
0
|
|
|
|
|
|
$s .= "$1/$2/$3"; |
|
98
|
0
|
0
|
|
|
|
|
$s .= " $4:$5" if defined $4; |
|
99
|
|
|
|
|
|
|
} |
|
100
|
0
|
0
|
|
|
|
|
if (@e = /^DTEND.*(\d{4})(\d\d)(\d\d)(?:T(\d\d)(\d\d))?/m) { |
|
101
|
0
|
0
|
0
|
|
|
|
if ($s[0]eq$e[0] and $s[1]eq$e[1] and $s[2]+1>=$e[2]) { |
|
|
|
|
0
|
|
|
|
|
|
102
|
0
|
0
|
|
|
|
|
$s .= "-$4:$5" if defined $4; |
|
103
|
|
|
|
|
|
|
} else { |
|
104
|
0
|
|
|
|
|
|
$s .= "-"; |
|
105
|
0
|
0
|
|
|
|
|
$s .= "$1/" if $s[0] ne $e[0]; |
|
106
|
0
|
|
|
|
|
|
$s .= "$2/$3"; |
|
107
|
|
|
|
|
|
|
} |
|
108
|
|
|
|
|
|
|
} |
|
109
|
0
|
|
|
|
|
|
$s .= " "; |
|
110
|
0
|
0
|
|
|
|
|
/^SUMMARY:(.*)/m and $s .= $1; |
|
111
|
0
|
0
|
|
|
|
|
/^DESCRIPTION:/m and $s .= "*"; |
|
112
|
0
|
0
|
|
|
|
|
/^LOCATION:(.*)/m and $s .= " \@[$1]"; |
|
113
|
0
|
|
|
|
|
|
$s .= "\n"; |
|
114
|
0
|
|
|
|
|
|
$s; |
|
115
|
|
|
|
|
|
|
} |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
sub print_desc { |
|
118
|
0
|
|
|
0
|
0
|
|
my $desc = ''; |
|
119
|
0
|
0
|
|
|
|
|
if (/^(DESCRIPTION.*\n(?:\s.*\n)*)/m) { |
|
120
|
0
|
|
|
|
|
|
$desc = $1; |
|
121
|
0
|
|
|
|
|
|
for ($desc) { |
|
122
|
0
|
|
|
|
|
|
s/\n\s+//g; |
|
123
|
0
|
|
|
|
|
|
s/\\n/\n/g; |
|
124
|
0
|
|
|
|
|
|
s/\\\\t/\t/g; |
|
125
|
0
|
|
|
|
|
|
s/\\,/,/g; |
|
126
|
|
|
|
|
|
|
} |
|
127
|
|
|
|
|
|
|
} |
|
128
|
0
|
|
|
|
|
|
$desc; |
|
129
|
|
|
|
|
|
|
} |
|
130
|
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
1; |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
__DATA__ |