when_exe 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -33
  3. data/bin/locales.rb +1 -1
  4. data/bin/make_ttl.rb.config +1 -1
  5. data/lib/when_exe.rb +27 -16
  6. data/lib/when_exe/basictypes.rb +772 -771
  7. data/lib/when_exe/calendartypes.rb +1485 -1453
  8. data/lib/when_exe/coordinates.rb +5 -0
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +147 -116
  11. data/lib/when_exe/core/extension.rb +499 -497
  12. data/lib/when_exe/ephemeris.rb +1952 -1951
  13. data/lib/when_exe/ephemeris/eclipse.rb +5 -4
  14. data/lib/when_exe/ephemeris/notes.rb +457 -421
  15. data/lib/when_exe/ephemeris/planets.rb +585 -585
  16. data/lib/when_exe/ephemeris/sun.rb +214 -214
  17. data/lib/when_exe/google_api.rb +153 -0
  18. data/lib/when_exe/icalendar.rb +1640 -1632
  19. data/lib/when_exe/inspect.rb +42 -20
  20. data/lib/when_exe/linkeddata.rb +28 -7
  21. data/lib/when_exe/locales/autoload.rb +2 -1
  22. data/lib/when_exe/locales/locale.rb +35 -15
  23. data/lib/when_exe/locales/zh.rb +77 -0
  24. data/lib/when_exe/mini_application.rb +3 -1
  25. data/lib/when_exe/{googlecalendar.rb → obsolete/googlecalendar.rb} +144 -144
  26. data/lib/when_exe/parts/enumerator.rb +498 -486
  27. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  28. data/lib/when_exe/parts/timezone.rb +246 -241
  29. data/lib/when_exe/region/armenian.rb +55 -56
  30. data/lib/when_exe/region/babylonian.rb +406 -405
  31. data/lib/when_exe/region/bahai.rb +107 -106
  32. data/lib/when_exe/region/balinese.rb +624 -622
  33. data/lib/when_exe/region/chinese.rb +1071 -1026
  34. data/lib/when_exe/region/chinese/epochs.rb +28 -28
  35. data/lib/when_exe/region/chinese/notes.rb +219 -0
  36. data/lib/when_exe/region/chinese/twins.rb +803 -803
  37. data/lib/when_exe/region/christian.rb +21 -15
  38. data/lib/when_exe/region/coptic.rb +107 -106
  39. data/lib/when_exe/region/discordian.rb +218 -218
  40. data/lib/when_exe/region/east_asian.rb +1 -1
  41. data/lib/when_exe/region/french.rb +126 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +60 -58
  44. data/lib/when_exe/region/hanke_henry.rb +2 -2
  45. data/lib/when_exe/region/indian.rb +1225 -1222
  46. data/lib/when_exe/region/international_fixed.rb +96 -97
  47. data/lib/when_exe/region/iranian.rb +206 -203
  48. data/lib/when_exe/region/islamic.rb +102 -102
  49. data/lib/when_exe/region/japanese.rb +126 -71
  50. data/lib/when_exe/region/japanese/epochs.rb +426 -426
  51. data/lib/when_exe/region/japanese/notes.rb +101 -81
  52. data/lib/when_exe/region/japanese/residues.rb +1345 -1311
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -112
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +130 -131
  57. data/lib/when_exe/region/m17n.rb +114 -114
  58. data/lib/when_exe/region/martian.rb +258 -258
  59. data/lib/when_exe/region/mayan.rb +11 -8
  60. data/lib/when_exe/region/pax.rb +4 -5
  61. data/lib/when_exe/region/pope.rb +1 -1
  62. data/lib/when_exe/region/positivist.rb +100 -100
  63. data/lib/when_exe/region/residue.rb +162 -162
  64. data/lib/when_exe/region/roman.rb +333 -333
  65. data/lib/when_exe/region/{soviet.rb → russian.rb} +221 -209
  66. data/lib/when_exe/region/shire.rb +222 -223
  67. data/lib/when_exe/region/symmetry.rb +50 -50
  68. data/lib/when_exe/region/thai.rb +336 -336
  69. data/lib/when_exe/region/tibetan.rb +315 -316
  70. data/lib/when_exe/region/tranquility.rb +207 -208
  71. data/lib/when_exe/region/vanishing_leprechaun.rb +3 -1
  72. data/lib/when_exe/region/vietnamese.rb +449 -440
  73. data/lib/when_exe/region/weekdate.rb +80 -80
  74. data/lib/when_exe/region/world.rb +170 -171
  75. data/lib/when_exe/region/world_season.rb +89 -89
  76. data/lib/when_exe/region/yerm.rb +3 -3
  77. data/lib/when_exe/region/zoroastrian.rb +205 -205
  78. data/lib/when_exe/timestandard.rb +708 -707
  79. data/lib/when_exe/tmduration.rb +338 -338
  80. data/lib/when_exe/tmobjects.rb +1356 -1356
  81. data/lib/when_exe/tmposition.rb +66 -31
  82. data/lib/when_exe/version.rb +16 -2
  83. data/test/examples/Residue.m17n +83 -83
  84. data/test/examples/Terms.m17n +2 -2
  85. data/test/test.rb +2 -2
  86. data/test/test/google_api.rb +65 -0
  87. data/test/test/linkeddata.rb +1 -1
  88. data/test/test/{googlecalendar.rb → obsolete/googlecalendar.rb} +194 -194
  89. data/test/test/region/indian.rb +90 -85
  90. data/test/test/region/m17n.rb +7 -7
  91. data/test/test/region/mayan.rb +195 -195
  92. data/test/test/region/residue.rb +153 -153
  93. data/test/test/tmposition.rb +11 -1
  94. data/when_exe.gemspec +2 -2
  95. metadata +95 -8
  96. data/test/test.rb.config +0 -1
@@ -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-2015 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, zh]",
14
+ "names:[Dr. Irv Bromberg's Symmetry Calendar=, Bromberg博士の対称暦=, *alias:Symmetry]",
15
+ "[Sym454=en:Symmetry454, 対称454暦=, 対称454曆=]",
16
+ "[Sym010=http://individual.utoronto.ca/kalendis/classic.htm, 対称010暦=, 対称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,336 +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:, hi=hi:, 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 ||= 638
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-(@origin_of_MSC+@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
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2015 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:, zh=zh:, hi=hi:, alias]",
13
+ "names:[Thailand, タイ=ja:タイ王国, 泰国, *alias:Thai]",
14
+ "[ThaiLuniSolar=en:Thai_lunar_calendar, タイ太陰太陽暦=ja:%%<チャントラカティ>, 傣曆]",
15
+
16
+ [self,
17
+ "names:[HalfMonth=, 半月=, zh:半月=, *alias:IntercalaryMonth=en:Intercalation]",
18
+ "[%s Śuklapakṣa=, %s 白分=, %s 上弦月=, _IAST_]",
19
+ "[%s Kṛṣṇapakṣa=, %s 黒分=, %s 下弦月=, _IAST_]",
20
+ "[adhika %s Śuklapakṣa=, 閏%s 白分=, 閏%s 上弦月=, _IAST_]",
21
+ "[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, 閏%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 ||= 638
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-(@origin_of_MSC+@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