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
|
@@ -0,0 +1,209 @@
|
|
|
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
|
+
class When::CalendarNote
|
|
9
|
+
|
|
10
|
+
#
|
|
11
|
+
# 標準の暦注 + 五曜
|
|
12
|
+
#
|
|
13
|
+
CommonWithSovietFiveDay = [['_m:Calendar::Month'], ['Common::Week', '_n:SovietFiveDayWeek/Notes::day::FiveDay']]
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# 標準の暦注 + 六曜
|
|
17
|
+
#
|
|
18
|
+
CommonWithSovietSixDay = [['_m:Calendar::Month'], ['Common::Week', '_n:SovietSixDayWeek/Notes::day::SixDay']]
|
|
19
|
+
|
|
20
|
+
#
|
|
21
|
+
# 五曜
|
|
22
|
+
#
|
|
23
|
+
class SovietFiveDayWeek < Week
|
|
24
|
+
|
|
25
|
+
Holidays = {
|
|
26
|
+
[1,22] => 5, [2,29] => 6, [5,1] => 5, [5,2] => 5, [11,7] => 5, [11,8] => 5
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
FirstDay = [0, 0, 3, 4, 4, 3, 3, 4, 0, 0, 1, 4]
|
|
30
|
+
|
|
31
|
+
SkipDay = {
|
|
32
|
+
1 => [23,1], 5 => [3,2], 11 => [9,2]
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# 暦注要素の定義
|
|
38
|
+
#
|
|
39
|
+
Notes = [When::BasicTypes::M17n, [
|
|
40
|
+
"locale:[=en:, ja=ja:, alias]",
|
|
41
|
+
"names:[SovietFiveDay]",
|
|
42
|
+
|
|
43
|
+
# 日の暦注 ----------------------------
|
|
44
|
+
[When::BasicTypes::M17n,
|
|
45
|
+
"names:[day]",
|
|
46
|
+
[When::BasicTypes::M17n,
|
|
47
|
+
"names:[FiveDay, 五曜]",
|
|
48
|
+
[DayOfWeek, "label:[I= ]", {'delta'=>5}],
|
|
49
|
+
[DayOfWeek, "label:[II= ]", {'delta'=>5}],
|
|
50
|
+
[DayOfWeek, "label:[III= ]", {'delta'=>5}],
|
|
51
|
+
[DayOfWeek, "label:[IV= ]", {'delta'=>5}],
|
|
52
|
+
[DayOfWeek, "label:[V= ]", {'delta'=>5}],
|
|
53
|
+
[DayOfWeek, "label:[Holiday=]", {'delta'=>190}],
|
|
54
|
+
[DayOfWeek, "label:[Leapday=]", {'delta'=>1461}]
|
|
55
|
+
]
|
|
56
|
+
]
|
|
57
|
+
]]
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# この日は何曜?
|
|
61
|
+
#
|
|
62
|
+
# @param [When::TM::TemporalPosition] date
|
|
63
|
+
# @param [When::TM::CalDate] base (not used)
|
|
64
|
+
#
|
|
65
|
+
# @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
|
|
66
|
+
#
|
|
67
|
+
def fiveday(date, base=nil)
|
|
68
|
+
date = _to_date_for_note(date)
|
|
69
|
+
y,m,d = date.cal_date
|
|
70
|
+
index = fiveday_index(m,d)
|
|
71
|
+
{:value=>@days_of_week[index], :position=>[index, 7]}
|
|
72
|
+
end
|
|
73
|
+
alias :week :fiveday
|
|
74
|
+
|
|
75
|
+
# @private
|
|
76
|
+
def first(date, base=nil)
|
|
77
|
+
count = 0
|
|
78
|
+
d0 = d1 = _to_date_for_note(date)
|
|
79
|
+
r0 = r1 = nil
|
|
80
|
+
loop do
|
|
81
|
+
y,m,d = d1.cal_date
|
|
82
|
+
r1 = fiveday_index(m,d)
|
|
83
|
+
break if r1 == 0
|
|
84
|
+
d0 = d1
|
|
85
|
+
r0 = r1
|
|
86
|
+
d1 = d0 - When::P1D
|
|
87
|
+
count += 1
|
|
88
|
+
end
|
|
89
|
+
date -= count if count > 0
|
|
90
|
+
date.events = [@days_of_week[r1]]
|
|
91
|
+
date
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# @private
|
|
95
|
+
def fiveday_index(m,d)
|
|
96
|
+
index = Holidays[[m,d]]
|
|
97
|
+
return index if index
|
|
98
|
+
day, shift = SkipDay[m]
|
|
99
|
+
d -= shift if day && d >= day
|
|
100
|
+
(FirstDay[m-1] + d - 1) % 5
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @private
|
|
104
|
+
def first_delta(parameter=nil)
|
|
105
|
+
When::P5D
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# 暦日をグレゴリオ暦日に変換
|
|
110
|
+
#
|
|
111
|
+
# @private
|
|
112
|
+
def _to_date_for_note(date)
|
|
113
|
+
return date if date.frame.kind_of?(When::CalendarTypes::Gregorian)
|
|
114
|
+
return When::Gregorian ^ date
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
private
|
|
118
|
+
|
|
119
|
+
# オブジェクトの正規化
|
|
120
|
+
# @private
|
|
121
|
+
def _normalize(args=[], options={})
|
|
122
|
+
@days_of_week ||= When.CalendarNote("SovietFiveDayWeek/Notes::day::FiveDay")
|
|
123
|
+
@event ||= 'first'
|
|
124
|
+
super
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# 六曜
|
|
130
|
+
#
|
|
131
|
+
class SovietSixDayWeek < Week
|
|
132
|
+
|
|
133
|
+
# @private
|
|
134
|
+
# 1 2 3 4 5 6 7 8 9 X N D
|
|
135
|
+
WeekLength = [7,6,7,6,7,6,7,7,6,7,6,7]
|
|
136
|
+
|
|
137
|
+
#
|
|
138
|
+
# 暦注要素の定義
|
|
139
|
+
#
|
|
140
|
+
Notes = [When::BasicTypes::M17n, [
|
|
141
|
+
"locale:[=en:, ja=ja:, alias]",
|
|
142
|
+
"names:[SovietSixDay]",
|
|
143
|
+
|
|
144
|
+
# 日の暦注 ----------------------------
|
|
145
|
+
[When::BasicTypes::M17n,
|
|
146
|
+
"names:[day]",
|
|
147
|
+
[When::BasicTypes::M17n,
|
|
148
|
+
"names:[SixDay, 六曜]",
|
|
149
|
+
[DayOfWeek, "label:[Первый= ]", {'delta'=>6}],
|
|
150
|
+
[DayOfWeek, "label:[Второй= ]", {'delta'=>6}],
|
|
151
|
+
[DayOfWeek, "label:[Третий= ]", {'delta'=>6}],
|
|
152
|
+
[DayOfWeek, "label:[Четвертый=]", {'delta'=>6}],
|
|
153
|
+
[DayOfWeek, "label:[Пятый= ]", {'delta'=>6}],
|
|
154
|
+
[DayOfWeek, "label:[Шестой= ]", {'delta'=>6}],
|
|
155
|
+
[DayOfWeek, "label:[Out of week= ]", {'delta'=>6}]
|
|
156
|
+
]
|
|
157
|
+
]
|
|
158
|
+
]]
|
|
159
|
+
|
|
160
|
+
#
|
|
161
|
+
# この日は何曜?
|
|
162
|
+
#
|
|
163
|
+
# @param [When::TM::TemporalPosition] date
|
|
164
|
+
# @param [When::TM::CalDate] base (not used)
|
|
165
|
+
#
|
|
166
|
+
# @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
|
|
167
|
+
#
|
|
168
|
+
def sixday(date, base=nil)
|
|
169
|
+
date = _to_date_for_note(date)
|
|
170
|
+
dow = date.cal_date[When::DAY-1]
|
|
171
|
+
index = dow == 31 ? 6 : (dow - 1) % 6
|
|
172
|
+
{:value=>@days_of_week[index], :position=>[index, WeekLength[(base||date).cal_date[When::MONTH-1]-1]]}
|
|
173
|
+
end
|
|
174
|
+
alias :week :sixday
|
|
175
|
+
|
|
176
|
+
# @private
|
|
177
|
+
def first(date, base=nil)
|
|
178
|
+
dow = _to_date_for_note(date).cal_date[When::DAY-1]
|
|
179
|
+
index = dow == 31 ? 6 : (dow - 1) % 6
|
|
180
|
+
date -= index if index > 0
|
|
181
|
+
date.events = [@days_of_week[index]]
|
|
182
|
+
date
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# @private
|
|
186
|
+
def first_delta(parameter=nil)
|
|
187
|
+
When::P6D
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
#
|
|
191
|
+
# 暦日をグレゴリオ暦日に変換
|
|
192
|
+
#
|
|
193
|
+
# @private
|
|
194
|
+
def _to_date_for_note(date)
|
|
195
|
+
return date if date.frame.kind_of?(When::CalendarTypes::Gregorian)
|
|
196
|
+
return When::Gregorian ^ date
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
private
|
|
200
|
+
|
|
201
|
+
# オブジェクトの正規化
|
|
202
|
+
# @private
|
|
203
|
+
def _normalize(args=[], options={})
|
|
204
|
+
@days_of_week ||= When.CalendarNote("SovietSixDayWeek/Notes::day::SixDay")
|
|
205
|
+
@event ||= 'first'
|
|
206
|
+
super
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
@@ -1,50 +1,50 @@
|
|
|
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
|
-
Symmetry = [self, [
|
|
13
|
-
"locale:[=en:, ja]",
|
|
14
|
-
"names:[Symmetry=]",
|
|
15
|
-
"[Sym454=en:Symmetry454, 対称454暦=]",
|
|
16
|
-
"[Sym010=http://individual.utoronto.ca/kalendis/classic.htm, 対称010暦=]"
|
|
17
|
-
]]
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
module CalendarTypes
|
|
21
|
-
|
|
22
|
-
_pattern = (0...293).to_a.map {|year| (52 * year + 146) % 293 < 52 ? 371 : 364}
|
|
23
|
-
|
|
24
|
-
#
|
|
25
|
-
# Symmetry 454 Calendar
|
|
26
|
-
#
|
|
27
|
-
Sym454 = [CyclicTableBased, {
|
|
28
|
-
'label' => 'Symmetry::Sym454',
|
|
29
|
-
'origin_of_LSC' => 1721062,
|
|
30
|
-
'rule_table' => {
|
|
31
|
-
'T' => {'Rule' =>_pattern},
|
|
32
|
-
364 => {'Length'=>[28,35,28] * 4},
|
|
33
|
-
371 => {'Length'=>[28,35,28] * 3 + [28,35,35]}
|
|
34
|
-
}
|
|
35
|
-
}]
|
|
36
|
-
|
|
37
|
-
#
|
|
38
|
-
# Symmetry 010 Calendar
|
|
39
|
-
#
|
|
40
|
-
Sym010 = [CyclicTableBased, {
|
|
41
|
-
'label' => 'Symmetry::Sym010',
|
|
42
|
-
'origin_of_LSC' => 1721062,
|
|
43
|
-
'rule_table' => {
|
|
44
|
-
'T' => {'Rule' =>_pattern},
|
|
45
|
-
364 => {'Length'=>[30,31,30] * 4},
|
|
46
|
-
371 => {'Length'=>[30,31,30] * 3 + [30,31,37]}
|
|
47
|
-
}
|
|
48
|
-
}]
|
|
49
|
-
end
|
|
50
|
-
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
|
+
Symmetry = [self, [
|
|
13
|
+
"locale:[=en:, ja]",
|
|
14
|
+
"names:[Symmetry=]",
|
|
15
|
+
"[Sym454=en:Symmetry454, 対称454暦=]",
|
|
16
|
+
"[Sym010=http://individual.utoronto.ca/kalendis/classic.htm, 対称010暦=]"
|
|
17
|
+
]]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module CalendarTypes
|
|
21
|
+
|
|
22
|
+
_pattern = (0...293).to_a.map {|year| (52 * year + 146) % 293 < 52 ? 371 : 364}
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# Symmetry 454 Calendar
|
|
26
|
+
#
|
|
27
|
+
Sym454 = [CyclicTableBased, {
|
|
28
|
+
'label' => 'Symmetry::Sym454',
|
|
29
|
+
'origin_of_LSC' => 1721062,
|
|
30
|
+
'rule_table' => {
|
|
31
|
+
'T' => {'Rule' =>_pattern},
|
|
32
|
+
364 => {'Length'=>[28,35,28] * 4},
|
|
33
|
+
371 => {'Length'=>[28,35,28] * 3 + [28,35,35]}
|
|
34
|
+
}
|
|
35
|
+
}]
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# Symmetry 010 Calendar
|
|
39
|
+
#
|
|
40
|
+
Sym010 = [CyclicTableBased, {
|
|
41
|
+
'label' => 'Symmetry::Sym010',
|
|
42
|
+
'origin_of_LSC' => 1721062,
|
|
43
|
+
'rule_table' => {
|
|
44
|
+
'T' => {'Rule' =>_pattern},
|
|
45
|
+
364 => {'Length'=>[30,31,30] * 4},
|
|
46
|
+
371 => {'Length'=>[30,31,30] * 3 + [30,31,37]}
|
|
47
|
+
}
|
|
48
|
+
}]
|
|
49
|
+
end
|
|
50
|
+
end
|
data/lib/when_exe/region/thai.rb
CHANGED
|
@@ -1,335 +1,336 @@
|
|
|
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
|
-
class BasicTypes::M17n
|
|
10
|
-
|
|
11
|
-
Thai = [self, [
|
|
12
|
-
"locale:[=en:, ja=ja:, alias]",
|
|
13
|
-
"names:[Thai=]",
|
|
14
|
-
"[ThaiLuniSolar=en:Thai_lunar_calendar, タイ太陰太陽暦=ja:%%<チャントラカティ>]",
|
|
15
|
-
|
|
16
|
-
[self,
|
|
17
|
-
"names:[IntercalaryMonth=en:Intercalation, 閏月]",
|
|
18
|
-
"[%s Śuklapakṣa=, %s 白分=, _IAST_]",
|
|
19
|
-
"[%s Kṛṣṇapakṣa=, %s 黒分=, _IAST_]",
|
|
20
|
-
"[adhika %s Śuklapakṣa=, 閏%s 白分=, _IAST_]",
|
|
21
|
-
"[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, _IAST_]"
|
|
22
|
-
],
|
|
23
|
-
|
|
24
|
-
[self,
|
|
25
|
-
"names:[LunarMonth=, 太陰月=ja:%%<月_(暦)>]",
|
|
26
|
-
"[Mārgaśīra=en:Margashirsha, マールガシールシャ=, _IAST_]",
|
|
27
|
-
"[Pauṣa=en:Pausha, パウシャ=, _IAST_]",
|
|
28
|
-
"[Māgha=en:Maagha, マーガ=, _IAST_]",
|
|
29
|
-
"[Phālguna=en:Phalguna, パールグナ=, _IAST_]",
|
|
30
|
-
"[Caitra=en:Chaitra, チャイトラ=, _IAST_]",
|
|
31
|
-
"[Vaiśākha=en:Vaisakha, ヴァイシャーカ=, _IAST_]",
|
|
32
|
-
"[Jyaiṣṭha=en:Jyeshta, ジャイシュタ=, _IAST_]",
|
|
33
|
-
"[Āṣāḍha=en:Aashaadha, アーシャーダ=, _IAST_]",
|
|
34
|
-
"[Śrāvaṇa=en:Shraavana, シュラーヴァナ=, _IAST_]",
|
|
35
|
-
"[Bhādrapada=en:Bhadrapada, バードラパダ=, _IAST_]",
|
|
36
|
-
"[Āśvina=en:Ashwin, アーシュヴィナ=, _IAST_]",
|
|
37
|
-
"[Kārttika=en:Kartika_(month), カールッティカ=, _IAST_]"
|
|
38
|
-
]
|
|
39
|
-
]]
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
module CalendarTypes
|
|
43
|
-
|
|
44
|
-
#
|
|
45
|
-
# ソンクラーンとタイ暦の暦定数
|
|
46
|
-
#
|
|
47
|
-
module Songkran
|
|
48
|
-
|
|
49
|
-
# ソンクラーン - 太陽の白羊宮入り
|
|
50
|
-
#
|
|
51
|
-
# @param [Integer] y 年
|
|
52
|
-
#
|
|
53
|
-
# @return [Integer] ソンクラーンのユリウス日
|
|
54
|
-
#
|
|
55
|
-
def songkran_(y)
|
|
56
|
-
e = _eph(y)
|
|
57
|
-
return @origin_of_LSC - 1 + e['H'][0]
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# y で指定した年の暦定数を返します。
|
|
61
|
-
#
|
|
62
|
-
# @param [Integer] y 年
|
|
63
|
-
#
|
|
64
|
-
# @return [Hash]
|
|
65
|
-
#
|
|
66
|
-
def _eph(y) # C
|
|
67
|
-
h = (y+4).divmod(9)[0] # y
|
|
68
|
-
h = (y-h).divmod(3)[0] # z
|
|
69
|
-
h = (y+1-h).divmod(2)[0] # r (2 => h?)
|
|
70
|
-
h = (36525876*y+149049-h).divmod(100000) # s
|
|
71
|
-
a = (h[0]*11+633-((h[0]+7368).divmod(8878))[0]).divmod(692)
|
|
72
|
-
m = (h[0]+a[0]+0).divmod(30)
|
|
73
|
-
return {'H'=>h, 'A'=>a, 'M'=>m}
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
#
|
|
78
|
-
# The Calendar of Thai (Prototype)
|
|
79
|
-
#
|
|
80
|
-
class ThaiP < TableBased
|
|
81
|
-
|
|
82
|
-
include Lunar
|
|
83
|
-
include Songkran
|
|
84
|
-
|
|
85
|
-
# 月番号
|
|
86
|
-
_intercalary_month = When.Resource('_m:Thai::IntercalaryMonth::*')
|
|
87
|
-
Indices = [
|
|
88
|
-
When.Index('Thai::LunarMonth', {:branch=>{0 => _intercalary_month[0],
|
|
89
|
-
0.5 => _intercalary_month[1],
|
|
90
|
-
-1.5 => _intercalary_month[2],
|
|
91
|
-
-1 => _intercalary_month[3]}}),
|
|
92
|
-
When::Coordinates::DefaultDayIndex
|
|
93
|
-
]
|
|
94
|
-
|
|
95
|
-
# 月の大小と閏
|
|
96
|
-
_NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
|
|
97
|
-
_LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9&,9*,9,9<,10,10<,11,11<,12,12<'
|
|
98
|
-
RuleTable = {
|
|
99
|
-
354 => {'Length'=>[15,15,15,14]*6, 'IDs' => _NormalIDs},
|
|
100
|
-
355 => {'Length'=>[15,15,15,14]*3 + [15]*4 + [15,15,15,14]*2, 'IDs' => _NormalIDs},
|
|
101
|
-
384 => {'Length'=>[15,15,15,14]*4 + [15]*2 + [15,15,15,14]*2, 'IDs' => _LeapIDs}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
private
|
|
105
|
-
|
|
106
|
-
# オブジェクトの正規化
|
|
107
|
-
# @private
|
|
108
|
-
def _normalize(args=[], options={})
|
|
109
|
-
@label ||= 'Thai::ThaiLuniSolar'
|
|
110
|
-
|
|
111
|
-
Rational
|
|
112
|
-
@mean_month ||= 29 + Rational( 373, 703)
|
|
113
|
-
@mean_year ||= 365 + Rational(25876, 100000)
|
|
114
|
-
@epoch_in_CE ||= 638
|
|
115
|
-
@origin_of_MSC ||= 0 # 638 + 543
|
|
116
|
-
@origin_of_LSC ||= 1954168
|
|
117
|
-
@origin_of_MSC = @origin_of_MSC.to_i
|
|
118
|
-
@origin_of_LSC = @origin_of_LSC.to_i
|
|
119
|
-
@indices ||= Indices
|
|
120
|
-
@rule_table ||= RuleTable
|
|
121
|
-
super
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
# 年初の通日
|
|
125
|
-
#
|
|
126
|
-
# @param [Array<Numeric>] date ( 年 )
|
|
127
|
-
#
|
|
128
|
-
# @return [Integer] 年初の通日
|
|
129
|
-
#
|
|
130
|
-
def _sdn_(date)
|
|
131
|
-
y = +date[0]
|
|
132
|
-
e0 = _thai(y, 0)[0]
|
|
133
|
-
e1 = _thai(y+1,0)[0]
|
|
134
|
-
case e1['T']-e0['T']
|
|
135
|
-
when 353,383 ; e0['T'] -= 1
|
|
136
|
-
when 385 ; e0['T'] += 1
|
|
137
|
-
end
|
|
138
|
-
return @origin_of_LSC - 1 + e0['T'] - 30*3 - 29*2
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
# y で指定した年の平閏、8月の大小を判定します。
|
|
142
|
-
#
|
|
143
|
-
# @param [Integer] y 年
|
|
144
|
-
# @param [Integer] dir 前後の閏状態を表すコード
|
|
145
|
-
#
|
|
146
|
-
# @return [Array<Hash, String>]
|
|
147
|
-
#
|
|
148
|
-
def _thai(y,dir)
|
|
149
|
-
# 諸元の計算
|
|
150
|
-
e = _eph(y)
|
|
151
|
-
k = 800*125 - e['H'][1]
|
|
152
|
-
t = e['M'][1]
|
|
153
|
-
|
|
154
|
-
# Jyaistha 大の判定
|
|
155
|
-
b = ((e['A'][1]<126) && (k<=207*125)) || ((e['A'][1]<137) && (k> 207*125))
|
|
156
|
-
|
|
157
|
-
# 閏年の判定
|
|
158
|
-
c = ((t<6) || (t>24))
|
|
159
|
-
c = true if ((t==24) && (_thai(y+1,+1)[1]< 'C'))
|
|
160
|
-
c = false if ((t==25) && (_thai(y+1,+1)[1]>='C'))
|
|
161
|
-
|
|
162
|
-
# Caitra 月 0 日
|
|
163
|
-
e['T'] = e['H'][0] - t
|
|
164
|
-
e['T'] -= 1 if (t==0)
|
|
165
|
-
e['T'] -= 29 if (c && (t<=6))
|
|
166
|
-
e['b'] = b
|
|
167
|
-
e['c'] = c
|
|
168
|
-
e['t'] = t
|
|
169
|
-
return e,' '
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
#
|
|
174
|
-
# The Calendar of Thai people in China (Calculation)
|
|
175
|
-
#
|
|
176
|
-
class ThaiC < ThaiP
|
|
177
|
-
|
|
178
|
-
# オブジェクトの正規化
|
|
179
|
-
# @private
|
|
180
|
-
def _normalize(args=[], options={})
|
|
181
|
-
super
|
|
182
|
-
@thoreshold
|
|
183
|
-
@
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
# 年初の通日
|
|
187
|
-
#
|
|
188
|
-
# @param [Array<Numeric>] date ( 年 )
|
|
189
|
-
#
|
|
190
|
-
# @return [Integer] 年初の通日
|
|
191
|
-
#
|
|
192
|
-
def _sdn_(date)
|
|
193
|
-
year = +date[0]
|
|
194
|
-
prev = _meton(year-1)
|
|
195
|
-
this = _meton(year)
|
|
196
|
-
this += 1 if this.floor - prev.floor > 360 && this % 1 > @thoreshold
|
|
197
|
-
this.floor
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
private
|
|
201
|
-
|
|
202
|
-
def _meton(year)
|
|
203
|
-
(((year + 9) * 235 / 19) - 111) * @mean_month + @
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
#
|
|
208
|
-
# The Calendar of Thai people in China (Table based)
|
|
209
|
-
#
|
|
210
|
-
class ThaiT < CyclicTableBased
|
|
211
|
-
|
|
212
|
-
include Lunar
|
|
213
|
-
include Songkran
|
|
214
|
-
|
|
215
|
-
Pattern =
|
|
216
|
-
B A C A C B A C A B C A A C B C A A C B A C A C B A C A A C
|
|
217
|
-
B A C A C A B C A A C B C A A C B A C A C B A C A B C A A C
|
|
218
|
-
B C A A C B A C A C B A C A B C A A C A C B A C A B C A A C
|
|
219
|
-
A C B B C A A C A C A A C B A C A B C A C A B C A A C B C A
|
|
220
|
-
A C B A C A A C B C A A C B A C A C B A C A A C B A C A C B
|
|
221
|
-
A C A B C A C A B C A A C A B C A C A B C A A C B C A A C B
|
|
222
|
-
A C A A C B C A A C B A C A C B A C A A C B A C A C B A C A)
|
|
223
|
-
|
|
224
|
-
# オブジェクトの正規化
|
|
225
|
-
# @private
|
|
226
|
-
def _normalize(args=[], options={})
|
|
227
|
-
@origin_of_LSC
|
|
228
|
-
@origin_of_MSC
|
|
229
|
-
@epoch_in_CE
|
|
230
|
-
@
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
'
|
|
240
|
-
'
|
|
241
|
-
'
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
#
|
|
248
|
-
#
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
#
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
#
|
|
274
|
-
#
|
|
275
|
-
#
|
|
276
|
-
#
|
|
277
|
-
#
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
#
|
|
288
|
-
#
|
|
289
|
-
#
|
|
290
|
-
#
|
|
291
|
-
#
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
h[
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
#
|
|
303
|
-
#
|
|
304
|
-
# @param [Integer]
|
|
305
|
-
#
|
|
306
|
-
#
|
|
307
|
-
#
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
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
|
+
class BasicTypes::M17n
|
|
10
|
+
|
|
11
|
+
Thai = [self, [
|
|
12
|
+
"locale:[=en:, ja=ja:, alias]",
|
|
13
|
+
"names:[Thai=]",
|
|
14
|
+
"[ThaiLuniSolar=en:Thai_lunar_calendar, タイ太陰太陽暦=ja:%%<チャントラカティ>]",
|
|
15
|
+
|
|
16
|
+
[self,
|
|
17
|
+
"names:[IntercalaryMonth=en:Intercalation, 閏月]",
|
|
18
|
+
"[%s Śuklapakṣa=, %s 白分=, _IAST_]",
|
|
19
|
+
"[%s Kṛṣṇapakṣa=, %s 黒分=, _IAST_]",
|
|
20
|
+
"[adhika %s Śuklapakṣa=, 閏%s 白分=, _IAST_]",
|
|
21
|
+
"[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, _IAST_]"
|
|
22
|
+
],
|
|
23
|
+
|
|
24
|
+
[self,
|
|
25
|
+
"names:[LunarMonth=, 太陰月=ja:%%<月_(暦)>]",
|
|
26
|
+
"[Mārgaśīra=en:Margashirsha, マールガシールシャ=, _IAST_]",
|
|
27
|
+
"[Pauṣa=en:Pausha, パウシャ=, _IAST_]",
|
|
28
|
+
"[Māgha=en:Maagha, マーガ=, _IAST_]",
|
|
29
|
+
"[Phālguna=en:Phalguna, パールグナ=, _IAST_]",
|
|
30
|
+
"[Caitra=en:Chaitra, チャイトラ=, _IAST_]",
|
|
31
|
+
"[Vaiśākha=en:Vaisakha, ヴァイシャーカ=, _IAST_]",
|
|
32
|
+
"[Jyaiṣṭha=en:Jyeshta, ジャイシュタ=, _IAST_]",
|
|
33
|
+
"[Āṣāḍha=en:Aashaadha, アーシャーダ=, _IAST_]",
|
|
34
|
+
"[Śrāvaṇa=en:Shraavana, シュラーヴァナ=, _IAST_]",
|
|
35
|
+
"[Bhādrapada=en:Bhadrapada, バードラパダ=, _IAST_]",
|
|
36
|
+
"[Āśvina=en:Ashwin, アーシュヴィナ=, _IAST_]",
|
|
37
|
+
"[Kārttika=en:Kartika_(month), カールッティカ=, _IAST_]"
|
|
38
|
+
]
|
|
39
|
+
]]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
module CalendarTypes
|
|
43
|
+
|
|
44
|
+
#
|
|
45
|
+
# ソンクラーンとタイ暦の暦定数
|
|
46
|
+
#
|
|
47
|
+
module Songkran
|
|
48
|
+
|
|
49
|
+
# ソンクラーン - 太陽の白羊宮入り
|
|
50
|
+
#
|
|
51
|
+
# @param [Integer] y 年
|
|
52
|
+
#
|
|
53
|
+
# @return [Integer] ソンクラーンのユリウス日
|
|
54
|
+
#
|
|
55
|
+
def songkran_(y)
|
|
56
|
+
e = _eph(y)
|
|
57
|
+
return @origin_of_LSC - 1 + e['H'][0]
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# y で指定した年の暦定数を返します。
|
|
61
|
+
#
|
|
62
|
+
# @param [Integer] y 年
|
|
63
|
+
#
|
|
64
|
+
# @return [Hash]
|
|
65
|
+
#
|
|
66
|
+
def _eph(y) # C
|
|
67
|
+
h = (y+4).divmod(9)[0] # y
|
|
68
|
+
h = (y-h).divmod(3)[0] # z
|
|
69
|
+
h = (y+1-h).divmod(2)[0] # r (2 => h?)
|
|
70
|
+
h = (36525876*y+149049-h).divmod(100000) # s
|
|
71
|
+
a = (h[0]*11+633-((h[0]+7368).divmod(8878))[0]).divmod(692)
|
|
72
|
+
m = (h[0]+a[0]+0).divmod(30)
|
|
73
|
+
return {'H'=>h, 'A'=>a, 'M'=>m}
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# The Calendar of Thai (Prototype)
|
|
79
|
+
#
|
|
80
|
+
class ThaiP < TableBased
|
|
81
|
+
|
|
82
|
+
include Lunar
|
|
83
|
+
include Songkran
|
|
84
|
+
|
|
85
|
+
# 月番号
|
|
86
|
+
_intercalary_month = When.Resource('_m:Thai::IntercalaryMonth::*')
|
|
87
|
+
Indices = [
|
|
88
|
+
When.Index('Thai::LunarMonth', {:branch=>{0 => _intercalary_month[0],
|
|
89
|
+
0.5 => _intercalary_month[1],
|
|
90
|
+
-1.5 => _intercalary_month[2],
|
|
91
|
+
-1 => _intercalary_month[3]}}),
|
|
92
|
+
When::Coordinates::DefaultDayIndex
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
# 月の大小と閏
|
|
96
|
+
_NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
|
|
97
|
+
_LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9&,9*,9,9<,10,10<,11,11<,12,12<'
|
|
98
|
+
RuleTable = {
|
|
99
|
+
354 => {'Length'=>[15,15,15,14]*6, 'IDs' => _NormalIDs},
|
|
100
|
+
355 => {'Length'=>[15,15,15,14]*3 + [15]*4 + [15,15,15,14]*2, 'IDs' => _NormalIDs},
|
|
101
|
+
384 => {'Length'=>[15,15,15,14]*4 + [15]*2 + [15,15,15,14]*2, 'IDs' => _LeapIDs}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
|
|
106
|
+
# オブジェクトの正規化
|
|
107
|
+
# @private
|
|
108
|
+
def _normalize(args=[], options={})
|
|
109
|
+
@label ||= 'Thai::ThaiLuniSolar'
|
|
110
|
+
|
|
111
|
+
Rational
|
|
112
|
+
@mean_month ||= 29 + Rational( 373, 703)
|
|
113
|
+
@mean_year ||= 365 + Rational(25876, 100000)
|
|
114
|
+
@epoch_in_CE ||= 638
|
|
115
|
+
@origin_of_MSC ||= 0 # 638 + 543
|
|
116
|
+
@origin_of_LSC ||= 1954168
|
|
117
|
+
@origin_of_MSC = @origin_of_MSC.to_i
|
|
118
|
+
@origin_of_LSC = @origin_of_LSC.to_i
|
|
119
|
+
@indices ||= Indices
|
|
120
|
+
@rule_table ||= RuleTable
|
|
121
|
+
super
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# 年初の通日
|
|
125
|
+
#
|
|
126
|
+
# @param [Array<Numeric>] date ( 年 )
|
|
127
|
+
#
|
|
128
|
+
# @return [Integer] 年初の通日
|
|
129
|
+
#
|
|
130
|
+
def _sdn_(date)
|
|
131
|
+
y = +date[0]
|
|
132
|
+
e0 = _thai(y, 0)[0]
|
|
133
|
+
e1 = _thai(y+1,0)[0]
|
|
134
|
+
case e1['T']-e0['T']
|
|
135
|
+
when 353,383 ; e0['T'] -= 1
|
|
136
|
+
when 385 ; e0['T'] += 1
|
|
137
|
+
end
|
|
138
|
+
return @origin_of_LSC - 1 + e0['T'] - 30*3 - 29*2
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# y で指定した年の平閏、8月の大小を判定します。
|
|
142
|
+
#
|
|
143
|
+
# @param [Integer] y 年
|
|
144
|
+
# @param [Integer] dir 前後の閏状態を表すコード
|
|
145
|
+
#
|
|
146
|
+
# @return [Array<Hash, String>]
|
|
147
|
+
#
|
|
148
|
+
def _thai(y,dir)
|
|
149
|
+
# 諸元の計算
|
|
150
|
+
e = _eph(y)
|
|
151
|
+
k = 800*125 - e['H'][1]
|
|
152
|
+
t = e['M'][1]
|
|
153
|
+
|
|
154
|
+
# Jyaistha 大の判定
|
|
155
|
+
b = ((e['A'][1]<126) && (k<=207*125)) || ((e['A'][1]<137) && (k> 207*125))
|
|
156
|
+
|
|
157
|
+
# 閏年の判定
|
|
158
|
+
c = ((t<6) || (t>24))
|
|
159
|
+
c = true if ((t==24) && (_thai(y+1,+1)[1]< 'C'))
|
|
160
|
+
c = false if ((t==25) && (_thai(y+1,+1)[1]>='C'))
|
|
161
|
+
|
|
162
|
+
# Caitra 月 0 日
|
|
163
|
+
e['T'] = e['H'][0] - t
|
|
164
|
+
e['T'] -= 1 if (t==0)
|
|
165
|
+
e['T'] -= 29 if (c && (t<=6))
|
|
166
|
+
e['b'] = b
|
|
167
|
+
e['c'] = c
|
|
168
|
+
e['t'] = t
|
|
169
|
+
return e,' '
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
#
|
|
174
|
+
# The Calendar of Thai people in China (Calculation)
|
|
175
|
+
#
|
|
176
|
+
class ThaiC < ThaiP
|
|
177
|
+
|
|
178
|
+
# オブジェクトの正規化
|
|
179
|
+
# @private
|
|
180
|
+
def _normalize(args=[], options={})
|
|
181
|
+
super
|
|
182
|
+
@thoreshold = (@mean_month * 13) % 1
|
|
183
|
+
@epoch_new_moon = (@origin_of_LSC - 18.90409 + 12 * @mean_month / 19)
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# 年初の通日
|
|
187
|
+
#
|
|
188
|
+
# @param [Array<Numeric>] date ( 年 )
|
|
189
|
+
#
|
|
190
|
+
# @return [Integer] 年初の通日
|
|
191
|
+
#
|
|
192
|
+
def _sdn_(date)
|
|
193
|
+
year = +date[0]
|
|
194
|
+
prev = _meton(year-1)
|
|
195
|
+
this = _meton(year)
|
|
196
|
+
this += 1 if this.floor - prev.floor > 360 && this % 1 > @thoreshold
|
|
197
|
+
this.floor - 148
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
private
|
|
201
|
+
|
|
202
|
+
def _meton(year)
|
|
203
|
+
(((year + 9) * 235 / 19) - 111) * @mean_month + @epoch_new_moon
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
#
|
|
208
|
+
# The Calendar of Thai people in China CE1840..2049 (Table based)
|
|
209
|
+
#
|
|
210
|
+
class ThaiT < CyclicTableBased
|
|
211
|
+
|
|
212
|
+
include Lunar
|
|
213
|
+
include Songkran
|
|
214
|
+
|
|
215
|
+
Pattern = %w(C
|
|
216
|
+
B A C A C B A C A B C A A C B C A A C B A C A C B A C A A C
|
|
217
|
+
B A C A C A B C A A C B C A A C B A C A C B A C A B C A A C
|
|
218
|
+
B C A A C B A C A C B A C A B C A A C A C B A C A B C A A C
|
|
219
|
+
A C B B C A A C A C A A C B A C A B C A C A B C A A C B C A
|
|
220
|
+
A C B A C A A C B C A A C B A C A C B A C A A C B A C A C B
|
|
221
|
+
A C A B C A C A B C A A C A B C A C A B C A A C B C A A C B
|
|
222
|
+
A C A A C B C A A C B A C A C B A C A A C B A C A C B A C A)
|
|
223
|
+
|
|
224
|
+
# オブジェクトの正規化
|
|
225
|
+
# @private
|
|
226
|
+
def _normalize(args=[], options={})
|
|
227
|
+
@origin_of_LSC ||= 2392666
|
|
228
|
+
@origin_of_MSC ||= 1201
|
|
229
|
+
@epoch_in_CE ||= 1839
|
|
230
|
+
@before = @after = 'ThaiC'
|
|
231
|
+
@indices ||= ThaiP::Indices
|
|
232
|
+
pattern ||= Pattern.dup
|
|
233
|
+
if @patch
|
|
234
|
+
@patch.scan(/(\d+)([ABC])/i) do |year,type|
|
|
235
|
+
pattern[year.to_i-@epoch_in_CE] = type.upcase
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
@rule_table = {
|
|
239
|
+
'T' => {'Rule' => pattern},
|
|
240
|
+
'A' => {'Rule' => [354]},
|
|
241
|
+
'B' => {'Rule' => [355]},
|
|
242
|
+
'C' => {'Rule' => [384]}}.merge(ThaiP::RuleTable)
|
|
243
|
+
super
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
#
|
|
248
|
+
# The Calendar of central Thailand
|
|
249
|
+
#
|
|
250
|
+
class Thai < ThaiP
|
|
251
|
+
|
|
252
|
+
# 年の朔閏パターン
|
|
253
|
+
YEAR_TYPE = {'A'=>354, 'B'=>355, 'C'=>384, 'D'=>384, 'E'=>384}
|
|
254
|
+
|
|
255
|
+
# 月の大小と閏
|
|
256
|
+
_NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
|
|
257
|
+
_LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8&,8*,8,8<,9,9<,10,10<,11,11<,12,12<'
|
|
258
|
+
RuleTable = {
|
|
259
|
+
354 => {'Length'=>[15,14,15,15]*6, 'IDs' => _NormalIDs},
|
|
260
|
+
355 => {'Length'=>[15,14,15,15]*3 + [15]*4 + [15,14,15,15]*2, 'IDs' => _NormalIDs},
|
|
261
|
+
384 => {'Length'=>[15,14,15,15]*4 + [15]*2 + [15,14,15,15]*2, 'IDs' => _LeapIDs }
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private
|
|
265
|
+
|
|
266
|
+
# オブジェクトの正規化
|
|
267
|
+
#
|
|
268
|
+
def _normalize(args=[], options={})
|
|
269
|
+
@rule_table ||= RuleTable
|
|
270
|
+
super
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
# 年初の通日
|
|
274
|
+
#
|
|
275
|
+
# @param [Array<Numeric>] date ( 年 )
|
|
276
|
+
#
|
|
277
|
+
# @return [Integer] 年初の通日
|
|
278
|
+
#
|
|
279
|
+
def _sdn_(date)
|
|
280
|
+
y = +date[0]
|
|
281
|
+
e0,dir0 = _thai(y, 0)
|
|
282
|
+
e1,dir1 = _thai(y+1,0)
|
|
283
|
+
e0['T'] -= 1 if (e1['T'] - e0['T'] < YEAR_TYPE[dir0])
|
|
284
|
+
return @origin_of_LSC + e0['T'] - 29*2 - 30*2
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
# y で指定した年の暦定数を返します。
|
|
288
|
+
#
|
|
289
|
+
# @param [Integer] y 年
|
|
290
|
+
#
|
|
291
|
+
# @return [Hash]
|
|
292
|
+
#
|
|
293
|
+
def _eph(y) # C
|
|
294
|
+
h = (y*292207+373+800*1).divmod(800)
|
|
295
|
+
# u = (h[0]+2611).divmod(3232)
|
|
296
|
+
a = (h[0]*11+650).divmod(692)
|
|
297
|
+
m = (h[0]+a[0]+0).divmod(30)
|
|
298
|
+
h[1] *= 125
|
|
299
|
+
return {'H'=>h, 'A'=>a, 'M'=>m}
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# y で指定した年の平閏、8月の大小を判定します。
|
|
303
|
+
#
|
|
304
|
+
# @param [Integer] y 年
|
|
305
|
+
# @param [Integer] dir 前後の閏状態を表すコード
|
|
306
|
+
#
|
|
307
|
+
# @return [Array<Hash, String>]
|
|
308
|
+
#
|
|
309
|
+
def _thai(y,dir)
|
|
310
|
+
# 諸元の計算
|
|
311
|
+
e,w = super(y,dir)
|
|
312
|
+
|
|
313
|
+
# カレンダーのタイプ
|
|
314
|
+
if (e['c'])
|
|
315
|
+
if (!e['b'])
|
|
316
|
+
return e,'C' # 普通の閏年
|
|
317
|
+
elsif ((0<e['t']) && (e['t']<6))
|
|
318
|
+
return e,'D' # 前年大の閏年
|
|
319
|
+
else
|
|
320
|
+
return e,'E' # 翌年大の閏年
|
|
321
|
+
end
|
|
322
|
+
else
|
|
323
|
+
if (e['b'])
|
|
324
|
+
return e,'B' # 大の平年
|
|
325
|
+
elsif ((dir != -1) && (_thai(y+1,+1)[1]=='D'))
|
|
326
|
+
return e,'B' # 大の平年
|
|
327
|
+
elsif ((dir != +1) && (_thai(y-1,-1)[1]=='E'))
|
|
328
|
+
return e,'B' # 大の平年
|
|
329
|
+
else
|
|
330
|
+
return e,'A' # 小の平年
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|