xcal 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +129 -5
- data/exe/xcal +1 -2
- data/lib/xcal.rb +8 -5
- data/lib/xcal/version.rb +1 -1
- data/lib/xcal/xcal.rb +62 -14
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c428b7d20554555f682cdedb790233cbe56016d0
|
4
|
+
data.tar.gz: ac7fff1bd5b7fb5f3e49efb93e4fbbd78fb9817b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1718c31a659f8ab85df6c2e85716626ec42e44f1a32323446fdb330da8265bc893320a4aef5d38ad2b83a4a565727e24d0a06365b3f97320290e847e87e5f2ad
|
7
|
+
data.tar.gz: 0ad9116449e3bba907c2449921a4693380c3a9f09baa2e43d583d15534ba86c87f6cdb8fd7d1b5d4dd7180a65b4215ed0441b40f1530a4512edca1f270d12423
|
data/README.md
CHANGED
@@ -1,6 +1,130 @@
|
|
1
|
-
xcal
|
2
|
-
====
|
1
|
+
# xcal
|
3
2
|
|
4
|
-
xcal
|
5
|
-
|
6
|
-
|
3
|
+
xcalは休日の色付き表示に対応したcal, ncalライクなカレンダーコマンドです。
|
4
|
+
休日の情報は表示のたびにiCal(icsファイル)をダウンロードして取得します。
|
5
|
+
デフォルトではGoogleが提供するiCalを利用し日本の休日を表示します。
|
6
|
+
また任意のicsファイルを指定して休日を表示することもできます。
|
7
|
+
カレンダーはカラフルに土曜日が青色、日曜日と休日が赤色で表示されます。
|
8
|
+
|
9
|
+
## インストール
|
10
|
+
|
11
|
+
```
|
12
|
+
# gem install xcal
|
13
|
+
```
|
14
|
+
|
15
|
+
## 使い方
|
16
|
+
|
17
|
+
デフォルトで前後1ヶ月の3ヶ月分のカレンダーを表示します。(実際は色付きです)
|
18
|
+
|
19
|
+
```
|
20
|
+
$ xcal
|
21
|
+
November 2017 December 2017 January 2018
|
22
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
23
|
+
1 2 3 4 1 2 1 2 3 4 5 6
|
24
|
+
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
|
25
|
+
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
|
26
|
+
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
|
27
|
+
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30 31
|
28
|
+
31
|
29
|
+
```
|
30
|
+
|
31
|
+
`-l`オプションで休日の詳細を表示することができます。(iCalの`summary`を表示します)
|
32
|
+
|
33
|
+
```
|
34
|
+
$ xcal -l
|
35
|
+
November 2017 December 2017 January 2018
|
36
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
37
|
+
1 2 3 4 1 2 1 2 3 4 5 6
|
38
|
+
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
|
39
|
+
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
|
40
|
+
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
|
41
|
+
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30 31
|
42
|
+
31
|
43
|
+
2017-11-03 (Fr) 文化の日
|
44
|
+
2017-11-23 (Th) 勤労感謝の日
|
45
|
+
2017-12-23 (Sa) 天皇誕生日
|
46
|
+
2018-01-01 (Mo) 元日
|
47
|
+
2018-01-08 (Mo) 成人の日
|
48
|
+
```
|
49
|
+
|
50
|
+
`-9`オプションで前後4ヶ月の9ヶ月分のカレンダーを表示します。
|
51
|
+
|
52
|
+
```
|
53
|
+
$ xcal -9
|
54
|
+
August 2017 September 2017 October 2017
|
55
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
56
|
+
1 2 3 4 5 1 2 1 2 3 4 5 6 7
|
57
|
+
6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14
|
58
|
+
13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21
|
59
|
+
20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28
|
60
|
+
27 28 29 30 31 24 25 26 27 28 29 30 29 30 31
|
61
|
+
|
62
|
+
November 2017 December 2017 January 2018
|
63
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
64
|
+
1 2 3 4 1 2 1 2 3 4 5 6
|
65
|
+
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
|
66
|
+
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
|
67
|
+
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
|
68
|
+
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30 31
|
69
|
+
31
|
70
|
+
February 2018 March 2018 April 2018
|
71
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
72
|
+
1 2 3 1 2 3 1 2 3 4 5 6 7
|
73
|
+
4 5 6 7 8 9 10 4 5 6 7 8 9 10 8 9 10 11 12 13 14
|
74
|
+
11 12 13 14 15 16 17 11 12 13 14 15 16 17 15 16 17 18 19 20 21
|
75
|
+
18 19 20 21 22 23 24 18 19 20 21 22 23 24 22 23 24 25 26 27 28
|
76
|
+
25 26 27 28 25 26 27 28 29 30 31 29 30
|
77
|
+
```
|
78
|
+
|
79
|
+
環境変数`XCAL_ICS_URL`にicsファイルのURLを指定すると日本以外の休日を表示することもできます。
|
80
|
+
以下はアメリカ合衆国の休日のicsファイルを読み込ませてアメリカ合衆国のカレンダーを表示する例です。
|
81
|
+
|
82
|
+
```
|
83
|
+
$ export XCAL_ICS_URL=https://calendar.google.com/calendar/ical/ja.usa%23holiday%40group.v.calendar.google.com/public/basic.ics
|
84
|
+
$ xcal -9 -l
|
85
|
+
August 2017 September 2017 October 2017
|
86
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
87
|
+
1 2 3 4 5 1 2 1 2 3 4 5 6 7
|
88
|
+
6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14
|
89
|
+
13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21
|
90
|
+
20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28
|
91
|
+
27 28 29 30 31 24 25 26 27 28 29 30 29 30 31
|
92
|
+
|
93
|
+
November 2017 December 2017 January 2018
|
94
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
95
|
+
1 2 3 4 1 2 1 2 3 4 5 6
|
96
|
+
5 6 7 8 9 10 11 3 4 5 6 7 8 9 7 8 9 10 11 12 13
|
97
|
+
12 13 14 15 16 17 18 10 11 12 13 14 15 16 14 15 16 17 18 19 20
|
98
|
+
19 20 21 22 23 24 25 17 18 19 20 21 22 23 21 22 23 24 25 26 27
|
99
|
+
26 27 28 29 30 24 25 26 27 28 29 30 28 29 30 31
|
100
|
+
31
|
101
|
+
February 2018 March 2018 April 2018
|
102
|
+
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
|
103
|
+
1 2 3 1 2 3 1 2 3 4 5 6 7
|
104
|
+
4 5 6 7 8 9 10 4 5 6 7 8 9 10 8 9 10 11 12 13 14
|
105
|
+
11 12 13 14 15 16 17 11 12 13 14 15 16 17 15 16 17 18 19 20 21
|
106
|
+
18 19 20 21 22 23 24 18 19 20 21 22 23 24 22 23 24 25 26 27 28
|
107
|
+
25 26 27 28 25 26 27 28 29 30 31 29 30
|
108
|
+
|
109
|
+
2017-09-04 (Mo) Labor Day
|
110
|
+
2017-10-09 (Mo) Columbus Day (regional holiday)
|
111
|
+
2017-10-31 (Tu) Halloween
|
112
|
+
2017-11-05 (Su) Daylight Saving Time ends
|
113
|
+
2017-11-10 (Fr) Veterans Day observed
|
114
|
+
2017-11-11 (Sa) Veterans Day
|
115
|
+
2017-11-23 (Th) Thanksgiving Day
|
116
|
+
2017-12-24 (Su) Christmas Eve
|
117
|
+
2017-12-25 (Mo) Christmas Day
|
118
|
+
2017-12-31 (Su) New Year's Eve
|
119
|
+
2018-01-01 (Mo) New Year's Day
|
120
|
+
2018-01-15 (Mo) Martin Luther King Jr. Day
|
121
|
+
2018-02-14 (We) Valentine's Day
|
122
|
+
2018-02-19 (Mo) Presidents' Day
|
123
|
+
2018-03-11 (Su) Daylight Saving Time starts
|
124
|
+
2018-04-01 (Su) Easter Sunday
|
125
|
+
2018-04-13 (Fr) Thomas Jefferson's Birthday
|
126
|
+
```
|
127
|
+
|
128
|
+
## License
|
129
|
+
|
130
|
+
This software is distributed under the MIT license.
|
data/exe/xcal
CHANGED
data/lib/xcal.rb
CHANGED
data/lib/xcal/version.rb
CHANGED
data/lib/xcal/xcal.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
class Xcal::Xcal
|
2
2
|
BLUE = "\e[34m"
|
3
3
|
RED = "\e[31m"
|
4
4
|
REVERSE = "\e[7m"
|
@@ -16,7 +16,7 @@ module Xcal
|
|
16
16
|
REVERSE + str + CLEAR
|
17
17
|
end
|
18
18
|
|
19
|
-
|
19
|
+
ICS_URL = ENV['XCAL_ICS_URL'] || 'https://www.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics'
|
20
20
|
|
21
21
|
MONTH_TEMPLATE = [
|
22
22
|
" January % ",
|
@@ -44,9 +44,9 @@ module Xcal
|
|
44
44
|
[red('Su'), 'Mo', 'Tu', 'We', 'Th', 'Fr', blue('Sa')]
|
45
45
|
end
|
46
46
|
|
47
|
-
def
|
47
|
+
def fetch_holidays_from_remote_ics(ics_url)
|
48
48
|
holidays = {}
|
49
|
-
ical = open(
|
49
|
+
ical = open(ics_url){|f| f.read}
|
50
50
|
cals = Icalendar::Calendar.parse(ical)
|
51
51
|
cals.each{|cal|
|
52
52
|
cal.events.each{|event|
|
@@ -58,7 +58,7 @@ module Xcal
|
|
58
58
|
|
59
59
|
holidays[y] = {} unless holidays[y]
|
60
60
|
holidays[y][m] = {} unless holidays[y][m]
|
61
|
-
holidays[y][m][d] = true
|
61
|
+
holidays[y][m][d] = {holiday: true, date: Date.new(y, m, d), summary: event.summary}
|
62
62
|
}
|
63
63
|
}
|
64
64
|
|
@@ -89,7 +89,7 @@ module Xcal
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def is_holiday?(y, m, d, holidays)
|
92
|
-
holidays[y] and holidays[y][m] and holidays[y][m][d]
|
92
|
+
holidays[y] and holidays[y][m] and holidays[y][m][d] and holidays[y][m][d][:holiday]
|
93
93
|
end
|
94
94
|
|
95
95
|
def month_header(y, m)
|
@@ -104,9 +104,43 @@ module Xcal
|
|
104
104
|
day
|
105
105
|
end
|
106
106
|
|
107
|
-
def main()
|
108
|
-
|
107
|
+
def main(argv)
|
108
|
+
@holidays = fetch_holidays_from_remote_ics(ICS_URL)
|
109
109
|
|
110
|
+
if argv.include?('-9')
|
111
|
+
cal9
|
112
|
+
else
|
113
|
+
cal3
|
114
|
+
end
|
115
|
+
|
116
|
+
if argv.include?('-l')
|
117
|
+
if argv.include?('-9')
|
118
|
+
first = (Date.today << 4) - (Date.today.day - 1)
|
119
|
+
last = (Date.today >> 5) - Date.today.day
|
120
|
+
else
|
121
|
+
first = (Date.today << 1) - (Date.today.day - 1)
|
122
|
+
last = (Date.today >> 2) - Date.today.day
|
123
|
+
end
|
124
|
+
|
125
|
+
list_holidays(first, last)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def cal3
|
130
|
+
origin_date = Date.today
|
131
|
+
|
132
|
+
print_3month_calendar(origin_date)
|
133
|
+
end
|
134
|
+
|
135
|
+
def cal9
|
136
|
+
[-3, 0, 3].each do |offset_month|
|
137
|
+
origin_date = Date.today >> (offset_month)
|
138
|
+
|
139
|
+
print_3month_calendar(origin_date)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def print_3month_calendar(origin_date)
|
110
144
|
table = Array.new(ROWS){
|
111
145
|
Array.new(WEEK * MONTH + SPACE){|i|
|
112
146
|
(i + 1) % 8 == 0 ? '' : ' '
|
@@ -114,16 +148,16 @@ module Xcal
|
|
114
148
|
}
|
115
149
|
|
116
150
|
today = Date.today
|
117
|
-
last_month =
|
118
|
-
next_month =
|
151
|
+
last_month = origin_date << 1
|
152
|
+
next_month = origin_date >> 1
|
119
153
|
|
120
|
-
fill_calendar(last_month.year, last_month.month, table, 0,
|
121
|
-
fill_calendar(
|
122
|
-
fill_calendar(next_month.year, next_month.month, table, 16,
|
154
|
+
fill_calendar(last_month.year, last_month.month, table, 0, @holidays, today)
|
155
|
+
fill_calendar(origin_date.year, origin_date.month, table, 8, @holidays, today)
|
156
|
+
fill_calendar(next_month.year, next_month.month, table, 16, @holidays, today)
|
123
157
|
|
124
158
|
month_headers = [
|
125
159
|
month_header(last_month.year, last_month.month),
|
126
|
-
month_header(
|
160
|
+
month_header(origin_date.year, origin_date.month),
|
127
161
|
month_header(next_month.year, next_month.month)
|
128
162
|
]
|
129
163
|
puts month_headers.join(' ')
|
@@ -134,4 +168,18 @@ module Xcal
|
|
134
168
|
puts row.join(' ')
|
135
169
|
}
|
136
170
|
end
|
171
|
+
|
172
|
+
def list_holidays(first, last)
|
173
|
+
holidays = (first..last).each_with_object([]){|date, memo|
|
174
|
+
y = date.year
|
175
|
+
m = date.month
|
176
|
+
d = date.day
|
177
|
+
|
178
|
+
memo << @holidays[y][m][d] if @holidays[y] && @holidays[y][m] && @holidays[y][m][d]
|
179
|
+
}
|
180
|
+
|
181
|
+
holidays.each{|holiday|
|
182
|
+
puts "#{holiday[:date].strftime("%Y-%m-%d")} (#{header[holiday[:date].wday]}) #{holiday[:summary]}"
|
183
|
+
}
|
184
|
+
end
|
137
185
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xcal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xmisao
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: icalendar
|