when_exe 0.4.1 → 0.4.2

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.
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