when_exe 0.3.6 → 0.3.7
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 +7 -0
- data/README.md +171 -0
- data/lib/when_exe.rb +78 -47
- data/lib/when_exe/basictypes.rb +752 -747
- data/lib/when_exe/calendarnote.rb +805 -801
- data/lib/when_exe/calendartypes.rb +1583 -1531
- data/lib/when_exe/coordinates.rb +16 -15
- data/lib/when_exe/core/duration.rb +114 -110
- data/lib/when_exe/core/extension.rb +504 -504
- data/lib/when_exe/ephemeris.rb +1917 -1913
- data/lib/when_exe/ephemeris/moon.rb +333 -333
- data/lib/when_exe/ephemeris/notes.rb +389 -387
- data/lib/when_exe/ephemeris/planets.rb +585 -585
- data/lib/when_exe/ephemeris/sun.rb +214 -214
- data/lib/when_exe/googlecalendar.rb +144 -140
- data/lib/when_exe/icalendar.rb +1636 -1636
- data/lib/when_exe/inspect.rb +46 -22
- data/lib/when_exe/locales/akt.rb +176 -176
- data/lib/when_exe/locales/encoding_conversion.rb +134 -126
- data/lib/when_exe/locales/iast.rb +90 -90
- data/lib/when_exe/locales/locale.rb +750 -746
- data/lib/when_exe/locales/transliteration_table.rb +62 -62
- data/lib/when_exe/mini_application.rb +307 -305
- data/lib/when_exe/parts/enumerator.rb +2 -2
- data/lib/when_exe/parts/geometric_complex.rb +397 -397
- data/lib/when_exe/parts/method_cash.rb +224 -224
- data/lib/when_exe/parts/resource.rb +1069 -1071
- data/lib/when_exe/parts/timezone.rb +240 -230
- data/lib/when_exe/region/armenian.rb +56 -56
- data/lib/when_exe/region/babylonian.rb +405 -0
- data/lib/when_exe/region/bahai.rb +146 -146
- data/lib/when_exe/region/balinese.rb +622 -622
- data/lib/when_exe/region/chinese.rb +95 -25
- data/lib/when_exe/region/chinese/calendars.rb +1016 -1016
- data/lib/when_exe/region/chinese/epochs.rb +1 -1
- data/lib/when_exe/region/chinese/twins.rb +803 -795
- data/lib/when_exe/region/christian.rb +824 -824
- data/lib/when_exe/region/coptic.rb +106 -87
- data/lib/when_exe/region/discordian.rb +225 -225
- data/lib/when_exe/region/far_east.rb +188 -188
- data/lib/when_exe/region/french.rb +56 -56
- data/lib/when_exe/region/geologicalage.rb +639 -639
- data/lib/when_exe/region/goddess.rb +58 -58
- data/lib/when_exe/region/indian.rb +1254 -1251
- data/lib/when_exe/region/iranian.rb +8 -8
- data/lib/when_exe/region/islamic.rb +3 -3
- data/lib/when_exe/region/japanese.rb +93 -99
- data/lib/when_exe/region/japanese/calendars.rb +396 -397
- data/lib/when_exe/region/japanese/epochs.rb +26 -26
- data/lib/when_exe/region/japanese/nihon_shoki.rb +71 -71
- data/lib/when_exe/region/japanese/notes.rb +1383 -1386
- data/lib/when_exe/region/japanese/residues.rb +1306 -1306
- data/lib/when_exe/region/japanese/twins.rb +225 -225
- data/lib/when_exe/region/japanese/weeks.rb +112 -0
- data/lib/when_exe/region/javanese.rb +230 -230
- data/lib/when_exe/region/jewish.rb +126 -126
- data/lib/when_exe/region/korean.rb +378 -378
- data/lib/when_exe/region/m17n.rb +114 -113
- data/lib/when_exe/region/martian.rb +258 -255
- data/lib/when_exe/region/mayan.rb +32 -32
- data/lib/when_exe/region/residue.rb +89 -89
- data/lib/when_exe/region/roman.rb +36 -24
- data/lib/when_exe/region/ryukyu.rb +97 -97
- data/lib/when_exe/region/shire.rb +240 -240
- data/lib/when_exe/region/soviet.rb +209 -0
- data/lib/when_exe/region/symmetry.rb +50 -50
- data/lib/when_exe/region/thai.rb +336 -335
- data/lib/when_exe/region/tibetan.rb +316 -315
- data/lib/when_exe/region/vietnamese.rb +440 -439
- data/lib/when_exe/region/weekdate.rb +80 -80
- data/lib/when_exe/region/world.rb +175 -175
- data/lib/when_exe/region/yerm.rb +14 -14
- data/lib/when_exe/region/zoroastrian.rb +203 -203
- data/lib/when_exe/timestandard.rb +707 -681
- data/lib/when_exe/tmduration.rb +338 -330
- data/lib/when_exe/tmobjects.rb +1346 -1325
- data/lib/when_exe/tmposition.rb +2115 -2072
- data/lib/when_exe/tmreference.rb +1693 -1669
- data/lib/when_exe/version.rb +1 -1
- data/link_to_online_documents +1 -1
- data/test/examples/JapanHolidaysRFC6350.ics +1 -1
- data/test/test.rb +67 -61
- data/test/test/basictypes.rb +409 -409
- data/test/test/calendarnote.rb +86 -69
- data/test/test/calendartypes.rb +97 -97
- data/test/test/coordinates.rb +396 -396
- data/test/test/ephemeris.rb +83 -74
- data/test/test/ephemeris/moon.rb +14 -14
- data/test/test/ephemeris/planets.rb +14 -14
- data/test/test/ephemeris/sun.rb +14 -14
- data/test/test/googlecalendar.rb +194 -176
- data/test/test/icalendar.rb +867 -858
- data/test/test/inspect.rb +117 -117
- data/test/test/parts.rb +487 -487
- data/test/test/region/balinese.rb +34 -0
- data/test/test/region/chinese.rb +218 -206
- data/test/test/region/christian.rb +245 -245
- data/test/test/region/coptic.rb +27 -27
- data/test/test/region/french.rb +33 -33
- data/test/test/region/geologicalage.rb +17 -17
- data/test/test/region/indian.rb +57 -57
- data/test/test/region/iran.rb +54 -54
- data/test/test/region/islamic.rb +18 -18
- data/test/test/region/japanese.rb +237 -219
- data/test/test/region/jewish.rb +61 -61
- data/test/test/region/m17n.rb +184 -184
- data/test/test/region/mayan.rb +195 -195
- data/test/test/region/residue.rb +147 -139
- data/test/test/region/thai.rb +116 -116
- data/test/test/region/tibetan.rb +30 -30
- data/test/test/region/vietnamese.rb +102 -102
- data/test/test/region/yerm.rb +146 -146
- data/test/test/timestandard.rb +81 -81
- data/test/test/tmobjects.rb +328 -328
- data/test/test/tmposition.rb +397 -284
- data/test/test/tmreference.rb +157 -157
- metadata +13 -10
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
=begin
|
|
3
|
-
Copyright (C) 2014 Takashi SUGA
|
|
4
|
-
|
|
5
|
-
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
|
-
=end
|
|
7
|
-
|
|
8
|
-
module When
|
|
9
|
-
|
|
10
|
-
class BasicTypes::M17n
|
|
11
|
-
|
|
12
|
-
WeekDate = [self, [
|
|
13
|
-
"locale:[=en:, ja]",
|
|
14
|
-
"names:[WeekDate=en:ISO_week_date, 暦週=]",
|
|
15
|
-
[self, "names:[week]"] + (1...100).to_a.map {|m| "Week #{m}"},
|
|
16
|
-
]]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
module CalendarTypes
|
|
20
|
-
|
|
21
|
-
#
|
|
22
|
-
# Week Date Calendar
|
|
23
|
-
#
|
|
24
|
-
class WeekDate < TableBased
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
#
|
|
29
|
-
# Object Normalization
|
|
30
|
-
#
|
|
31
|
-
def _normalize(args=[], options={})
|
|
32
|
-
@label ||= 'WeekDate'
|
|
33
|
-
@period ||= 7 # length of week
|
|
34
|
-
@first ||= 0 # first day of week
|
|
35
|
-
@margin ||= 3 # first day of year
|
|
36
|
-
@strftime ||= @period < 10 ? '%Y-W%m-%q' : '%Y-W%m-%d'
|
|
37
|
-
@engine ||= 'Gregorian'
|
|
38
|
-
@engine = When.Calendar(@engine)
|
|
39
|
-
@indices ||= [
|
|
40
|
-
When.Index('WeekDate::week'),
|
|
41
|
-
When::Coordinates::DefaultDayIndex
|
|
42
|
-
]
|
|
43
|
-
@rule_table ||= _generate_rule
|
|
44
|
-
raise ArgumentError, 'Too many weeks in a year' if @rule_table.keys.max / @period >= 100
|
|
45
|
-
super
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# 年初の通日
|
|
49
|
-
#
|
|
50
|
-
# @param [Array<Numeric>] date ( 年 )
|
|
51
|
-
#
|
|
52
|
-
# @return [Integer] 年初の通日
|
|
53
|
-
#
|
|
54
|
-
def _sdn_(date)
|
|
55
|
-
year = +date[0] - @engine.origin_of_MSC
|
|
56
|
-
sdn0 = @margin + @engine._coordinates_to_number(year, 0, 0)
|
|
57
|
-
sdn1 = @first + @period * sdn0.div(@period)
|
|
58
|
-
sdn1 -= @period if sdn1 > sdn0
|
|
59
|
-
sdn1
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# @private
|
|
63
|
-
def _generate_rule
|
|
64
|
-
hash = {}
|
|
65
|
-
_week_number_range.each do |length|
|
|
66
|
-
hash[@period * length] = {'Length'=>[@period] * length}
|
|
67
|
-
end
|
|
68
|
-
hash
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
# @private
|
|
72
|
-
def _week_number_range
|
|
73
|
-
return 52..53 if @engine.kind_of?(When::CalendarTypes::Christian)
|
|
74
|
-
starts = (0..19).to_a.map {|year| @engine._coordinates_to_number(year, 0, 0)}
|
|
75
|
-
lengths = (0..18).to_a.map {|year| starts[year+1] - starts[year]}
|
|
76
|
-
(lengths.min / @period)..((lengths.max + @period - 1) / @period)
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
end
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
Copyright (C) 2014 Takashi SUGA
|
|
4
|
+
|
|
5
|
+
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
|
+
=end
|
|
7
|
+
|
|
8
|
+
module When
|
|
9
|
+
|
|
10
|
+
class BasicTypes::M17n
|
|
11
|
+
|
|
12
|
+
WeekDate = [self, [
|
|
13
|
+
"locale:[=en:, ja]",
|
|
14
|
+
"names:[WeekDate=en:ISO_week_date, 暦週=]",
|
|
15
|
+
[self, "names:[week]"] + (1...100).to_a.map {|m| "Week #{m}"},
|
|
16
|
+
]]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module CalendarTypes
|
|
20
|
+
|
|
21
|
+
#
|
|
22
|
+
# Week Date Calendar
|
|
23
|
+
#
|
|
24
|
+
class WeekDate < TableBased
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
#
|
|
29
|
+
# Object Normalization
|
|
30
|
+
#
|
|
31
|
+
def _normalize(args=[], options={})
|
|
32
|
+
@label ||= 'WeekDate'
|
|
33
|
+
@period ||= 7 # length of week
|
|
34
|
+
@first ||= 0 # first day of week
|
|
35
|
+
@margin ||= 3 # first day of year
|
|
36
|
+
@strftime ||= @period < 10 ? '%Y-W%m-%q' : '%Y-W%m-%d'
|
|
37
|
+
@engine ||= 'Gregorian'
|
|
38
|
+
@engine = When.Calendar(@engine)
|
|
39
|
+
@indices ||= [
|
|
40
|
+
When.Index('WeekDate::week'),
|
|
41
|
+
When::Coordinates::DefaultDayIndex
|
|
42
|
+
]
|
|
43
|
+
@rule_table ||= _generate_rule
|
|
44
|
+
raise ArgumentError, 'Too many weeks in a year' if @rule_table.keys.max / @period >= 100
|
|
45
|
+
super
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# 年初の通日
|
|
49
|
+
#
|
|
50
|
+
# @param [Array<Numeric>] date ( 年 )
|
|
51
|
+
#
|
|
52
|
+
# @return [Integer] 年初の通日
|
|
53
|
+
#
|
|
54
|
+
def _sdn_(date)
|
|
55
|
+
year = +date[0] - @engine.origin_of_MSC
|
|
56
|
+
sdn0 = @margin + @engine._coordinates_to_number(year, 0, 0)
|
|
57
|
+
sdn1 = @first + @period * sdn0.div(@period)
|
|
58
|
+
sdn1 -= @period if sdn1 > sdn0
|
|
59
|
+
sdn1
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# @private
|
|
63
|
+
def _generate_rule
|
|
64
|
+
hash = {}
|
|
65
|
+
_week_number_range.each do |length|
|
|
66
|
+
hash[@period * length] = {'Length'=>[@period] * length}
|
|
67
|
+
end
|
|
68
|
+
hash
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @private
|
|
72
|
+
def _week_number_range
|
|
73
|
+
return 52..53 if @engine.kind_of?(When::CalendarTypes::Christian)
|
|
74
|
+
starts = (0..19).to_a.map {|year| @engine._coordinates_to_number(year, 0, 0)}
|
|
75
|
+
lengths = (0..18).to_a.map {|year| starts[year+1] - starts[year]}
|
|
76
|
+
(lengths.min / @period)..((lengths.max + @period - 1) / @period)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -1,175 +1,175 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
=begin
|
|
3
|
-
Copyright (C) 2011-2014 Takashi SUGA
|
|
4
|
-
|
|
5
|
-
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
|
-
=end
|
|
7
|
-
|
|
8
|
-
module When
|
|
9
|
-
|
|
10
|
-
class BasicTypes::M17n
|
|
11
|
-
|
|
12
|
-
World = [self, [
|
|
13
|
-
"locale:[=en:, ja=ja:, alias]",
|
|
14
|
-
"names:[World=]",
|
|
15
|
-
"[World=en:The_World_Calendar, 世界暦]"
|
|
16
|
-
]]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
#
|
|
20
|
-
# 世界暦の暦週
|
|
21
|
-
#
|
|
22
|
-
class CalendarNote::WorldWeek < CalendarNote::Week
|
|
23
|
-
|
|
24
|
-
#
|
|
25
|
-
# 暦注要素の定義
|
|
26
|
-
#
|
|
27
|
-
Notes = [When::BasicTypes::M17n, [
|
|
28
|
-
"locale:[=en:, ja=ja:, alias]",
|
|
29
|
-
"names:[World]",
|
|
30
|
-
|
|
31
|
-
# 年の暦注 ----------------------------
|
|
32
|
-
[When::BasicTypes::M17n,
|
|
33
|
-
"names:[year]"
|
|
34
|
-
],
|
|
35
|
-
|
|
36
|
-
# 月の暦注 ----------------------------
|
|
37
|
-
[When::BasicTypes::M17n,
|
|
38
|
-
"names:[month]",
|
|
39
|
-
[When::BasicTypes::M17n,
|
|
40
|
-
"names:[Month]"
|
|
41
|
-
]
|
|
42
|
-
],
|
|
43
|
-
|
|
44
|
-
# 日の暦注 ----------------------------
|
|
45
|
-
[When::BasicTypes::M17n,
|
|
46
|
-
"names:[day]",
|
|
47
|
-
[When::BasicTypes::M17n,
|
|
48
|
-
"names:[Week]",
|
|
49
|
-
[DayOfWeek, "label:[Sunday, 日曜日]", {'delta'=>7}],
|
|
50
|
-
[DayOfWeek, "label:[Monday, 月曜日]", {'delta'=>7}],
|
|
51
|
-
[DayOfWeek, "label:[Tuesday, 火曜日]", {'delta'=>7}],
|
|
52
|
-
[DayOfWeek, "label:[Wednesday, 水曜日]", {'delta'=>7}],
|
|
53
|
-
[DayOfWeek, "label:[Thursday, 木曜日]", {'delta'=>7}],
|
|
54
|
-
[DayOfWeek, "label:[Friday, 金曜日]", {'delta'=>7}],
|
|
55
|
-
[DayOfWeek, "label:[Saturday, 土曜日]", {'delta'=>7}],
|
|
56
|
-
[DayOfWeek, "label:[Worldsday,
|
|
57
|
-
],
|
|
58
|
-
|
|
59
|
-
"[
|
|
60
|
-
]
|
|
61
|
-
]]
|
|
62
|
-
|
|
63
|
-
# @private
|
|
64
|
-
FirstDayOfWeek = [0, 3, 5] * 4
|
|
65
|
-
|
|
66
|
-
# @private
|
|
67
|
-
ExtraDayInYear = {
|
|
68
|
-
[ 6, 31] => 7,
|
|
69
|
-
[12, 31] => 7
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
# @private
|
|
73
|
-
WeekLength = {
|
|
74
|
-
[
|
|
75
|
-
[ 6, 31] => 8,
|
|
76
|
-
[
|
|
77
|
-
[12, 31] => 8
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
# 当日または直前の worldsday の日
|
|
81
|
-
# @param [When::TM::TemporalPosition] date
|
|
82
|
-
# @param [nil] parameter 未使用
|
|
83
|
-
# @return [When::TM::TemporalPosition]
|
|
84
|
-
#
|
|
85
|
-
def worldsday(date, parameter=nil)
|
|
86
|
-
event_name = 'worldsday'
|
|
87
|
-
date = When.Calendar('World').jul_trans(date, {:events=>event_name})
|
|
88
|
-
y,m,d = date.cal_date
|
|
89
|
-
h, m = (m-1).divmod(6)
|
|
90
|
-
return date if m == 5 && d == 31
|
|
91
|
-
dow = [0, 31, 61, 91, 122, 152][m] + d
|
|
92
|
-
dow += 182 if h == 1 && When.Calendar('World')._sum([y]) == 365
|
|
93
|
-
date += When::TM::PeriodDuration.new([0,0,-dow])
|
|
94
|
-
date.events = [event_name]
|
|
95
|
-
date
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# 当日または直前の week_day の日
|
|
99
|
-
# @method week_day(date, parameter=nil)
|
|
100
|
-
# @param [When::TM::TemporalPosition] date
|
|
101
|
-
# @param [nil] parameter 未使用
|
|
102
|
-
# @return [When::TM::TemporalPosition]
|
|
103
|
-
# @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。
|
|
104
|
-
|
|
105
|
-
# @private
|
|
106
|
-
7.times do |k|
|
|
107
|
-
name = When.CalendarNote('WorldWeek/Notes::day::Week')[k].to_s.downcase
|
|
108
|
-
module_eval %Q{
|
|
109
|
-
def #{name}(date, parameter=nil)
|
|
110
|
-
event_name = 'from_#{name}'
|
|
111
|
-
date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
|
|
112
|
-
y,m,d = date.cal_date
|
|
113
|
-
dow = (m % 6 == 0 && d == 31) ? 7-#{k} : ([4,6,2][m % 3] + d - #{k}) % 7
|
|
114
|
-
return date if dow == 0
|
|
115
|
-
dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366)
|
|
116
|
-
date += When::TM::PeriodDuration.new([0,0,-dow])
|
|
117
|
-
date.events = [event_name]
|
|
118
|
-
date
|
|
119
|
-
end
|
|
120
|
-
}
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
#
|
|
124
|
-
# この日は何曜?
|
|
125
|
-
#
|
|
126
|
-
# @param [When::TM::TemporalPosition] date
|
|
127
|
-
# @param [When::TM::CalDate] base
|
|
128
|
-
#
|
|
129
|
-
# @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
|
|
130
|
-
#
|
|
131
|
-
def week(date, base=nil)
|
|
132
|
-
date = _to_date_for_note(date)
|
|
133
|
-
y, m, d = date.cal_date
|
|
134
|
-
index = ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7
|
|
135
|
-
length = WeekLength[[m, date.length(When::MONTH)]] || 7
|
|
136
|
-
{:value=>@days_of_week[index], :position=>[index, length]}
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
#
|
|
140
|
-
# 暦日を当該暦注計算用クラスに変換
|
|
141
|
-
#
|
|
142
|
-
# @private
|
|
143
|
-
def _to_date_for_note(date)
|
|
144
|
-
date = When::World ^ date unless date.frame.equal?(When::World)
|
|
145
|
-
date
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
private
|
|
149
|
-
|
|
150
|
-
# オブジェクトの正規化
|
|
151
|
-
# @private
|
|
152
|
-
def _normalize(args=[], options={})
|
|
153
|
-
@event ||= 'sunday'
|
|
154
|
-
super
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
module CalendarTypes
|
|
159
|
-
#
|
|
160
|
-
# World calendar based on Gregorian calendar
|
|
161
|
-
#
|
|
162
|
-
World = [CyclicTableBased, {
|
|
163
|
-
'label' => 'World::World',
|
|
164
|
-
'origin_of_LSC' => 1721060,
|
|
165
|
-
'rule_table' => {
|
|
166
|
-
'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']},
|
|
167
|
-
'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24},
|
|
168
|
-
'LC' => {'Rule' =>[366, 365, 365, 365]*25},
|
|
169
|
-
365 => {'Length'=>[31,30,30]*3 + [31,30,31]},
|
|
170
|
-
366 => {'Length'=>[31,30,30,31,30,31] *2}
|
|
171
|
-
},
|
|
172
|
-
'note' => 'WorldWeek'
|
|
173
|
-
}]
|
|
174
|
-
end
|
|
175
|
-
end
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
Copyright (C) 2011-2014 Takashi SUGA
|
|
4
|
+
|
|
5
|
+
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
|
+
=end
|
|
7
|
+
|
|
8
|
+
module When
|
|
9
|
+
|
|
10
|
+
class BasicTypes::M17n
|
|
11
|
+
|
|
12
|
+
World = [self, [
|
|
13
|
+
"locale:[=en:, ja=ja:, alias]",
|
|
14
|
+
"names:[World=]",
|
|
15
|
+
"[World=en:The_World_Calendar, 世界暦]"
|
|
16
|
+
]]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# 世界暦の暦週
|
|
21
|
+
#
|
|
22
|
+
class CalendarNote::WorldWeek < CalendarNote::Week
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# 暦注要素の定義
|
|
26
|
+
#
|
|
27
|
+
Notes = [When::BasicTypes::M17n, [
|
|
28
|
+
"locale:[=en:, ja=ja:, alias]",
|
|
29
|
+
"names:[World]",
|
|
30
|
+
|
|
31
|
+
# 年の暦注 ----------------------------
|
|
32
|
+
[When::BasicTypes::M17n,
|
|
33
|
+
"names:[year]"
|
|
34
|
+
],
|
|
35
|
+
|
|
36
|
+
# 月の暦注 ----------------------------
|
|
37
|
+
[When::BasicTypes::M17n,
|
|
38
|
+
"names:[month]",
|
|
39
|
+
[When::BasicTypes::M17n,
|
|
40
|
+
"names:[Month]"
|
|
41
|
+
]
|
|
42
|
+
],
|
|
43
|
+
|
|
44
|
+
# 日の暦注 ----------------------------
|
|
45
|
+
[When::BasicTypes::M17n,
|
|
46
|
+
"names:[day]",
|
|
47
|
+
[When::BasicTypes::M17n,
|
|
48
|
+
"names:[Week]",
|
|
49
|
+
[DayOfWeek, "label:[Sunday, 日曜日]", {'delta'=>7}],
|
|
50
|
+
[DayOfWeek, "label:[Monday, 月曜日]", {'delta'=>7}],
|
|
51
|
+
[DayOfWeek, "label:[Tuesday, 火曜日]", {'delta'=>7}],
|
|
52
|
+
[DayOfWeek, "label:[Wednesday, 水曜日]", {'delta'=>7}],
|
|
53
|
+
[DayOfWeek, "label:[Thursday, 木曜日]", {'delta'=>7}],
|
|
54
|
+
[DayOfWeek, "label:[Friday, 金曜日]", {'delta'=>7}],
|
|
55
|
+
[DayOfWeek, "label:[Saturday, 土曜日]", {'delta'=>7}],
|
|
56
|
+
[DayOfWeek, "label:[Worldsday, 週外日]", {'delta'=>183}],
|
|
57
|
+
],
|
|
58
|
+
|
|
59
|
+
"[Common_Week]"
|
|
60
|
+
]
|
|
61
|
+
]]
|
|
62
|
+
|
|
63
|
+
# @private
|
|
64
|
+
FirstDayOfWeek = [0, 3, 5] * 4
|
|
65
|
+
|
|
66
|
+
# @private
|
|
67
|
+
ExtraDayInYear = {
|
|
68
|
+
[ 6, 31] => 7,
|
|
69
|
+
[12, 31] => 7
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# @private
|
|
73
|
+
WeekLength = {
|
|
74
|
+
[ 5, 31] => 8,
|
|
75
|
+
[ 6, 31] => 8,
|
|
76
|
+
[11, 31] => 8,
|
|
77
|
+
[12, 31] => 8
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# 当日または直前の worldsday の日
|
|
81
|
+
# @param [When::TM::TemporalPosition] date
|
|
82
|
+
# @param [nil] parameter 未使用
|
|
83
|
+
# @return [When::TM::TemporalPosition]
|
|
84
|
+
#
|
|
85
|
+
def worldsday(date, parameter=nil)
|
|
86
|
+
event_name = 'worldsday'
|
|
87
|
+
date = When.Calendar('World').jul_trans(date, {:events=>event_name})
|
|
88
|
+
y,m,d = date.cal_date
|
|
89
|
+
h, m = (m-1).divmod(6)
|
|
90
|
+
return date if m == 5 && d == 31
|
|
91
|
+
dow = [0, 31, 61, 91, 122, 152][m] + d
|
|
92
|
+
dow += 182 if h == 1 && When.Calendar('World')._sum([y]) == 365
|
|
93
|
+
date += When::TM::PeriodDuration.new([0,0,-dow])
|
|
94
|
+
date.events = [event_name]
|
|
95
|
+
date
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# 当日または直前の week_day の日
|
|
99
|
+
# @method week_day(date, parameter=nil)
|
|
100
|
+
# @param [When::TM::TemporalPosition] date
|
|
101
|
+
# @param [nil] parameter 未使用
|
|
102
|
+
# @return [When::TM::TemporalPosition]
|
|
103
|
+
# @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。
|
|
104
|
+
|
|
105
|
+
# @private
|
|
106
|
+
7.times do |k|
|
|
107
|
+
name = When.CalendarNote('WorldWeek/Notes::day::Week')[k].to_s.downcase
|
|
108
|
+
module_eval %Q{
|
|
109
|
+
def #{name}(date, parameter=nil)
|
|
110
|
+
event_name = 'from_#{name}'
|
|
111
|
+
date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
|
|
112
|
+
y,m,d = date.cal_date
|
|
113
|
+
dow = (m % 6 == 0 && d == 31) ? 7-#{k} : ([4,6,2][m % 3] + d - #{k}) % 7
|
|
114
|
+
return date if dow == 0
|
|
115
|
+
dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366)
|
|
116
|
+
date += When::TM::PeriodDuration.new([0,0,-dow])
|
|
117
|
+
date.events = [event_name]
|
|
118
|
+
date
|
|
119
|
+
end
|
|
120
|
+
}
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
#
|
|
124
|
+
# この日は何曜?
|
|
125
|
+
#
|
|
126
|
+
# @param [When::TM::TemporalPosition] date
|
|
127
|
+
# @param [When::TM::CalDate] base
|
|
128
|
+
#
|
|
129
|
+
# @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
|
|
130
|
+
#
|
|
131
|
+
def week(date, base=nil)
|
|
132
|
+
date = _to_date_for_note(date)
|
|
133
|
+
y, m, d = date.cal_date
|
|
134
|
+
index = ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7
|
|
135
|
+
length = WeekLength[[m, (base||date).length(When::MONTH)]] || 7
|
|
136
|
+
{:value=>@days_of_week[index], :position=>[index, length]}
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
#
|
|
140
|
+
# 暦日を当該暦注計算用クラスに変換
|
|
141
|
+
#
|
|
142
|
+
# @private
|
|
143
|
+
def _to_date_for_note(date)
|
|
144
|
+
date = When::World ^ date unless date.frame.equal?(When::World)
|
|
145
|
+
date
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
private
|
|
149
|
+
|
|
150
|
+
# オブジェクトの正規化
|
|
151
|
+
# @private
|
|
152
|
+
def _normalize(args=[], options={})
|
|
153
|
+
@event ||= 'sunday'
|
|
154
|
+
super
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
module CalendarTypes
|
|
159
|
+
#
|
|
160
|
+
# World calendar based on Gregorian calendar
|
|
161
|
+
#
|
|
162
|
+
World = [CyclicTableBased, {
|
|
163
|
+
'label' => 'World::World',
|
|
164
|
+
'origin_of_LSC' => 1721060,
|
|
165
|
+
'rule_table' => {
|
|
166
|
+
'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']},
|
|
167
|
+
'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24},
|
|
168
|
+
'LC' => {'Rule' =>[366, 365, 365, 365]*25},
|
|
169
|
+
365 => {'Length'=>[31,30,30]*3 + [31,30,31]},
|
|
170
|
+
366 => {'Length'=>[31,30,30,31,30,31] *2}
|
|
171
|
+
},
|
|
172
|
+
'note' => 'WorldWeek'
|
|
173
|
+
}]
|
|
174
|
+
end
|
|
175
|
+
end
|