when_exe 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (117) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +171 -0
  3. data/lib/when_exe.rb +78 -47
  4. data/lib/when_exe/basictypes.rb +752 -747
  5. data/lib/when_exe/calendarnote.rb +805 -801
  6. data/lib/when_exe/calendartypes.rb +1583 -1531
  7. data/lib/when_exe/coordinates.rb +16 -15
  8. data/lib/when_exe/core/duration.rb +114 -110
  9. data/lib/when_exe/core/extension.rb +504 -504
  10. data/lib/when_exe/ephemeris.rb +1917 -1913
  11. data/lib/when_exe/ephemeris/moon.rb +333 -333
  12. data/lib/when_exe/ephemeris/notes.rb +389 -387
  13. data/lib/when_exe/ephemeris/planets.rb +585 -585
  14. data/lib/when_exe/ephemeris/sun.rb +214 -214
  15. data/lib/when_exe/googlecalendar.rb +144 -140
  16. data/lib/when_exe/icalendar.rb +1636 -1636
  17. data/lib/when_exe/inspect.rb +46 -22
  18. data/lib/when_exe/locales/akt.rb +176 -176
  19. data/lib/when_exe/locales/encoding_conversion.rb +134 -126
  20. data/lib/when_exe/locales/iast.rb +90 -90
  21. data/lib/when_exe/locales/locale.rb +750 -746
  22. data/lib/when_exe/locales/transliteration_table.rb +62 -62
  23. data/lib/when_exe/mini_application.rb +307 -305
  24. data/lib/when_exe/parts/enumerator.rb +2 -2
  25. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  26. data/lib/when_exe/parts/method_cash.rb +224 -224
  27. data/lib/when_exe/parts/resource.rb +1069 -1071
  28. data/lib/when_exe/parts/timezone.rb +240 -230
  29. data/lib/when_exe/region/armenian.rb +56 -56
  30. data/lib/when_exe/region/babylonian.rb +405 -0
  31. data/lib/when_exe/region/bahai.rb +146 -146
  32. data/lib/when_exe/region/balinese.rb +622 -622
  33. data/lib/when_exe/region/chinese.rb +95 -25
  34. data/lib/when_exe/region/chinese/calendars.rb +1016 -1016
  35. data/lib/when_exe/region/chinese/epochs.rb +1 -1
  36. data/lib/when_exe/region/chinese/twins.rb +803 -795
  37. data/lib/when_exe/region/christian.rb +824 -824
  38. data/lib/when_exe/region/coptic.rb +106 -87
  39. data/lib/when_exe/region/discordian.rb +225 -225
  40. data/lib/when_exe/region/far_east.rb +188 -188
  41. data/lib/when_exe/region/french.rb +56 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +58 -58
  44. data/lib/when_exe/region/indian.rb +1254 -1251
  45. data/lib/when_exe/region/iranian.rb +8 -8
  46. data/lib/when_exe/region/islamic.rb +3 -3
  47. data/lib/when_exe/region/japanese.rb +93 -99
  48. data/lib/when_exe/region/japanese/calendars.rb +396 -397
  49. data/lib/when_exe/region/japanese/epochs.rb +26 -26
  50. data/lib/when_exe/region/japanese/nihon_shoki.rb +71 -71
  51. data/lib/when_exe/region/japanese/notes.rb +1383 -1386
  52. data/lib/when_exe/region/japanese/residues.rb +1306 -1306
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -0
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +126 -126
  57. data/lib/when_exe/region/korean.rb +378 -378
  58. data/lib/when_exe/region/m17n.rb +114 -113
  59. data/lib/when_exe/region/martian.rb +258 -255
  60. data/lib/when_exe/region/mayan.rb +32 -32
  61. data/lib/when_exe/region/residue.rb +89 -89
  62. data/lib/when_exe/region/roman.rb +36 -24
  63. data/lib/when_exe/region/ryukyu.rb +97 -97
  64. data/lib/when_exe/region/shire.rb +240 -240
  65. data/lib/when_exe/region/soviet.rb +209 -0
  66. data/lib/when_exe/region/symmetry.rb +50 -50
  67. data/lib/when_exe/region/thai.rb +336 -335
  68. data/lib/when_exe/region/tibetan.rb +316 -315
  69. data/lib/when_exe/region/vietnamese.rb +440 -439
  70. data/lib/when_exe/region/weekdate.rb +80 -80
  71. data/lib/when_exe/region/world.rb +175 -175
  72. data/lib/when_exe/region/yerm.rb +14 -14
  73. data/lib/when_exe/region/zoroastrian.rb +203 -203
  74. data/lib/when_exe/timestandard.rb +707 -681
  75. data/lib/when_exe/tmduration.rb +338 -330
  76. data/lib/when_exe/tmobjects.rb +1346 -1325
  77. data/lib/when_exe/tmposition.rb +2115 -2072
  78. data/lib/when_exe/tmreference.rb +1693 -1669
  79. data/lib/when_exe/version.rb +1 -1
  80. data/link_to_online_documents +1 -1
  81. data/test/examples/JapanHolidaysRFC6350.ics +1 -1
  82. data/test/test.rb +67 -61
  83. data/test/test/basictypes.rb +409 -409
  84. data/test/test/calendarnote.rb +86 -69
  85. data/test/test/calendartypes.rb +97 -97
  86. data/test/test/coordinates.rb +396 -396
  87. data/test/test/ephemeris.rb +83 -74
  88. data/test/test/ephemeris/moon.rb +14 -14
  89. data/test/test/ephemeris/planets.rb +14 -14
  90. data/test/test/ephemeris/sun.rb +14 -14
  91. data/test/test/googlecalendar.rb +194 -176
  92. data/test/test/icalendar.rb +867 -858
  93. data/test/test/inspect.rb +117 -117
  94. data/test/test/parts.rb +487 -487
  95. data/test/test/region/balinese.rb +34 -0
  96. data/test/test/region/chinese.rb +218 -206
  97. data/test/test/region/christian.rb +245 -245
  98. data/test/test/region/coptic.rb +27 -27
  99. data/test/test/region/french.rb +33 -33
  100. data/test/test/region/geologicalage.rb +17 -17
  101. data/test/test/region/indian.rb +57 -57
  102. data/test/test/region/iran.rb +54 -54
  103. data/test/test/region/islamic.rb +18 -18
  104. data/test/test/region/japanese.rb +237 -219
  105. data/test/test/region/jewish.rb +61 -61
  106. data/test/test/region/m17n.rb +184 -184
  107. data/test/test/region/mayan.rb +195 -195
  108. data/test/test/region/residue.rb +147 -139
  109. data/test/test/region/thai.rb +116 -116
  110. data/test/test/region/tibetan.rb +30 -30
  111. data/test/test/region/vietnamese.rb +102 -102
  112. data/test/test/region/yerm.rb +146 -146
  113. data/test/test/timestandard.rb +81 -81
  114. data/test/test/tmobjects.rb +328 -328
  115. data/test/test/tmposition.rb +397 -284
  116. data/test/test/tmreference.rb +157 -157
  117. metadata +13 -10
@@ -1,315 +1,316 @@
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
- Tibetan = [self, [
12
- "locale:[=en:, ja=ja:, alias]",
13
- "names:[Tibetan=]",
14
- "[Tibetan=en:Tibetan_calendar, 時輪暦=ja:%%<チベット暦>]",
15
-
16
- [self,
17
- "names:[IntercalaryMonth=en:Intercalation, 閏月]",
18
- "[%s=, %s宿月= ]",
19
- "[Adika %s=, 閏%s宿月=]"
20
- ],
21
-
22
- [self,
23
- "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
24
- "[Double %s=, 欠=]",
25
- "[Intercalary %s=, 重=]"
26
- ],
27
-
28
- [self,
29
- "names:[Month, 月=ja:%%<月_(暦)>]",
30
- "[Margasirsa, 觜=]",
31
- "[Pausha, 鬼=]",
32
- "[Magha, 星=]",
33
- "[Phalguna, 翼=]",
34
- "[Chaitra, 角=]",
35
- "[Vaisakha, 氐=]",
36
- "[Jyeshta, 心=]",
37
- "[Ashada, 箕=]",
38
- "[Sravana, 牛=]",
39
- "[Bhadrapada, 室=]",
40
- "[Asvina, 婁=]",
41
- "[Kartika, 昴=]"
42
- ]
43
- ]]
44
- end
45
-
46
- module Coordinates
47
-
48
- # 六十干支
49
- Tibetan = [When::BasicTypes::M17n, [
50
- "locale:[=en:, ja=ja:, alias]",
51
- "names:[Tibetan]",
52
-
53
- [StemBranch,
54
- "label:[Stem-Branch, *干支]", "divisor:60", "day:11", "year:4",
55
- [StemBranch, "label:[Wood-Rat=, *木男鼠=]", "remainder: 0"],
56
- [StemBranch, "label:[Wood-Ox=, *木女牛=]", "remainder: 1"],
57
- [StemBranch, "label:[Fire-Tiger=, *火男虎=]", "remainder: 2"],
58
- [StemBranch, "label:[Fire-Rabbit=, *火女兎=]", "remainder: 3"],
59
- [StemBranch, "label:[Earth-Dragon=, *土男龍=]", "remainder: 4"],
60
- [StemBranch, "label:[Earth-Snake=, *土女蛇=]", "remainder: 5"],
61
- [StemBranch, "label:[Iron-Horse=, *金男馬=]", "remainder: 6"],
62
- [StemBranch, "label:[Iron-Goat=, *金女羊=]", "remainder: 7"],
63
- [StemBranch, "label:[Water-Monkey=, *水男猴=]", "remainder: 8"],
64
- [StemBranch, "label:[Water-Rooster=, *水女鷄=]", "remainder: 9"],
65
- [StemBranch, "label:[Wood-Dog=, *木男狗=]", "remainder:10"],
66
- [StemBranch, "label:[Wood-Pig=, *木女猪=]", "remainder:11"],
67
- [StemBranch, "label:[Fire-Rat=, *火男鼠=]", "remainder:12"],
68
- [StemBranch, "label:[Fire-Ox=, *火女牛=]", "remainder:13"],
69
- [StemBranch, "label:[Earth-Tiger=, *土男虎=]", "remainder:14"],
70
- [StemBranch, "label:[Earth-Rabbit=, *土女兎=]", "remainder:15"],
71
- [StemBranch, "label:[Iron-Dragon=, *金男龍=]", "remainder:16"],
72
- [StemBranch, "label:[Iron-Snake=, *金女蛇=]", "remainder:17"],
73
- [StemBranch, "label:[Water-Horse=, *水男馬=]", "remainder:18"],
74
- [StemBranch, "label:[Water-Goat=, *水女羊=]", "remainder:19"],
75
- [StemBranch, "label:[Wood-Monkey=, *木男猴=]", "remainder:20"],
76
- [StemBranch, "label:[Wood-Rooster=, *木女鷄=]", "remainder:21"],
77
- [StemBranch, "label:[Fire-Dog=, *火男狗=]", "remainder:22"],
78
- [StemBranch, "label:[Fire-Pig=, *火女猪=]", "remainder:23"],
79
- [StemBranch, "label:[Earth-Rat=, *土男鼠=]", "remainder:24"],
80
- [StemBranch, "label:[Earth-Ox=, *土女牛=]", "remainder:25"],
81
- [StemBranch, "label:[Iron-Tiger=, *金男虎=]", "remainder:26"],
82
- [StemBranch, "label:[Iron-Rabbit=, *金女兎=]", "remainder:27"],
83
- [StemBranch, "label:[Water-Dragon=, *水男龍=]", "remainder:28"],
84
- [StemBranch, "label:[Water-Snake=, *水女蛇=]", "remainder:29"],
85
- [StemBranch, "label:[Wood-Horse=, *木男馬=]", "remainder:30"],
86
- [StemBranch, "label:[Wood-Goat=, *木女羊=]", "remainder:31"],
87
- [StemBranch, "label:[Fire-Monkey=, *火男猴=]", "remainder:32"],
88
- [StemBranch, "label:[Fire-Rooster=, *火女鷄=]", "remainder:33"],
89
- [StemBranch, "label:[Earth-Dog=, *土男狗=]", "remainder:34"],
90
- [StemBranch, "label:[Earth-Pig=, *土女猪=]", "remainder:35"],
91
- [StemBranch, "label:[Iron-Rat=, *金男鼠=]", "remainder:36"],
92
- [StemBranch, "label:[Iron-Ox=, *金女牛=]", "remainder:37"],
93
- [StemBranch, "label:[Water-Tiger=, *水男虎=]", "remainder:38"],
94
- [StemBranch, "label:[Water-Rabbit=, *水女兎=]", "remainder:39"],
95
- [StemBranch, "label:[Wood-Dragon=, *木男龍=]", "remainder:40"],
96
- [StemBranch, "label:[Wood-Snake=, *木女蛇=]", "remainder:41"],
97
- [StemBranch, "label:[Fire-Horse=, *火男馬=]", "remainder:42"],
98
- [StemBranch, "label:[Fire-Goat=, *火女羊=]", "remainder:43"],
99
- [StemBranch, "label:[Earth-Monkey=, *土男猴=]", "remainder:44"],
100
- [StemBranch, "label:[Earth-Rooster=, *土女鷄=]", "remainder:45"],
101
- [StemBranch, "label:[Iron-Dog=, *金男狗=]", "remainder:46"],
102
- [StemBranch, "label:[Iron-Pig=, *金女猪=]", "remainder:47"],
103
- [StemBranch, "label:[Water-Rat=, *水男鼠=]", "remainder:48"],
104
- [StemBranch, "label:[Water-Ox=, *水女牛=]", "remainder:49"],
105
- [StemBranch, "label:[Wood-Tiger=, *木男虎=]", "remainder:50"],
106
- [StemBranch, "label:[Wood-Rabbit=, *木女兎=]", "remainder:51"],
107
- [StemBranch, "label:[Fire-Dragon=, *火男龍=]", "remainder:52"],
108
- [StemBranch, "label:[Fire-Snake=, *火女蛇=]", "remainder:53"],
109
- [StemBranch, "label:[Earth-Horse=, *土男馬=]", "remainder:54"],
110
- [StemBranch, "label:[Earth-Goat=, *土女羊=]", "remainder:55"],
111
- [StemBranch, "label:[Iron-Monkey=, *金男猴=]", "remainder:56"],
112
- [StemBranch, "label:[Iron-Rooster=, *金女鷄=]", "remainder:57"],
113
- [StemBranch, "label:[Water-Dog=, *水男狗=]", "remainder:58"],
114
- [StemBranch, "label:[Water-Pig=, *水女猪=]", "remainder:59"]
115
- ]
116
- ]]
117
- end
118
-
119
- class CalendarNote
120
- Tibetan = [['Tibetan::干支'], ['_m:Calendar::Month'], ['Common::Week']]
121
- end
122
-
123
- module CalendarTypes
124
-
125
- #
126
- # Tibetan Calendar
127
- #
128
- class Tibetan < EphemerisBasedLuniSolar
129
-
130
- #
131
- # 定数
132
- #
133
- Y0 = 1827 # 元期の西暦年
134
- D0 = 2388440 # 元期のユリウス日
135
- V0 = (6.0+45/60.0) # 白羊宮入りのオフセット
136
- Am = (2.0+1.0/126) # 月の近地点
137
-
138
- Rem = 1 # 余りのインデックス
139
- Quot = 0 # 商のインデックス
140
- Ddd = 0 # 差分のインデックス
141
- Sum = 1 # 積算値のインデックス
142
- Jm = [ # 月の中心差
143
- [ 5, 0], [ 5, 5], [ 5,10], [ 5,15], [ 4,19], [ 3,22], [ 2,24],
144
- [ 1,25], [-1,24], [-2,22], [-3,19], [-4,15], [-5,10], [-5, 5],
145
- [-5, 0], [-5,-5]
146
- ]
147
- Js = [ # 太陽の中心差
148
- [ 6, 0], [ 6, 6], [ 4,10], [ 1,11], [-1,10], [-4, 6], [-6, 0],
149
- [-6,-6]
150
- ]
151
-
152
- private
153
-
154
- # オブジェクトの正規化
155
- #
156
- # @type = 体系派なら 1, 作用派なら 2
157
- # @parameter = 太陽と月の位相計算用のテーブル
158
- #
159
- def _normalize(args=[], options={})
160
- intercalary_month = When.Resource('_m:Tibetan::IntercalaryMonth::*')
161
- intercalary_day = When.Resource('_m:Tibetan::IntercalaryDay::*')
162
- @indices ||= @index_of_MSC && @index_of_MSC.to_i == 1 ?
163
- [
164
- When.Index({:unit=>60}),
165
- When.Index('Tibetan::Month', {:branch=>{0=>intercalary_month[0], 1=>intercalary_month[1]}, :shift=>2}),
166
- When.Index({:branch=>{-2=>intercalary_day[0], -1=>intercalary_day[1]}})
167
- ] :
168
- [
169
- When.Index('Tibetan::Month', {:branch=>{0=>intercalary_month[0], 1=>intercalary_month[1]}, :shift=>2}),
170
- When.Index({:branch=>{-2=>intercalary_day[0], -1=>intercalary_day[1]}})
171
- ]
172
- @label ||= 'Tibetan::Tibetan'
173
- @epoch_in_CE ||= 0
174
- @type ||= 1
175
- @parameter = case @type.to_i
176
- when 1
177
- {'M0'=>(60+15),
178
- 'Wo'=>Z(29,31,50,0,480),
179
- 'W0'=>Z( 3,37,43,2,140),
180
- 'Wd'=>Z( 0,59, 3,4, 16),
181
- 'So'=>K( 2,10,58,1, 17),
182
- 'S0'=>K(24,59, 6,1, 41),
183
- 'Sd'=>K( 0, 4,21,5, 43),
184
- 'A0'=>22.0
185
- }
186
- when 2
187
- {'M0'=>(64+15),
188
- 'Wo'=>Z(29,31,50,0, 0),
189
- 'W0'=>Z( 3,21,20,0, 0),
190
- 'Wd'=>Z( 0,59, 3,4, 0),
191
- 'So'=>L( 2,10,58,2, 10),
192
- 'S0'=>L(25,42,12,1, 11),
193
- 'Sd'=>L( 0, 4,21,5, 9),
194
- 'A0'=>(22.0+28.0/126)
195
- }
196
- end
197
- @note = 'Tibetan'
198
- super
199
- end
200
-
201
- # @private
202
- def Z(z,q,d,m,s)
203
- ((((s/707.0+m)/6.0+d)/60.0+q)/60.0+z)
204
- end
205
-
206
- # @private
207
- def K(k,q,d,m,s)
208
- ((((s/67.0+m)/6.0+d)/60.0+q)/60.0+k)
209
- end
210
-
211
- # @private
212
- def L(k,q,d,m,s)
213
- ((((s/13.0+m)/6.0+d)/60.0+q)/60.0+k)
214
- end
215
-
216
- #
217
- # 太陽または月の位置の中心差による差分
218
- # @private
219
- def _sn(t,m,p)
220
- t0 = t.floor
221
- r = t0.divmod(m)
222
- s = (1.0/60.0)
223
- s = -s unless r[Quot] % 2 == 0
224
- return s * (p[r[Rem]][Sum] + (t-t0) * p[r[Rem]+1][Ddd])
225
- end
226
-
227
- # 積月計算
228
- #
229
- # @param [Integer] y 年
230
- # @param [Integer] m(デフォルト 0)
231
- #
232
- # @return [Integer] 積月
233
- #
234
- # m に 0 以外を指定することで、積月の跳び(閏)を検出できる
235
- #
236
- def _new_year_month_(y, m=0)
237
- mm = (y-Y0) * 12 + (m - 2)
238
- mm += (mm * 2 + @parameter['M0']).divmod(65)[Quot]
239
- return mm
240
- end
241
-
242
- # 月初の通日
243
- #
244
- # @param [Integer] m 通月
245
- #
246
- # @return [Integer] 月初の通日
247
- #
248
- def _new_month_(m)
249
- sdn = [0,-1].map {|d| _new_month_day(m, d)}
250
- sdn[0]-sdn[1] == 1 ? sdn[0] : sdn[0]-1
251
- end
252
-
253
- #
254
- # 積日計算
255
- #
256
- # @param [Integer] m 通月
257
- # @param [Integer] d
258
- #
259
- # @return [Integer] 積日
260
- #
261
- # 積日の跳び(重日)、ダブり(欠日)を検出できる
262
- #
263
- def _new_month_day_(m, d)
264
- d += 1
265
- w = m * @parameter['Wo'] + @parameter['W0'] + d * @parameter['Wd'] # 中曜
266
- s = m * @parameter['So'] + @parameter['S0'] + d * @parameter['Sd'] # 中日
267
- sdn = D0 + w
268
- sdn += _sn(m*Am+@parameter['A0']+d, 14, Jm)
269
- sdn -= _sn((s-V0)*(60.0/135.0), 6, Js)
270
- return sdn.floor
271
- end
272
-
273
- #
274
- # 日時要素の翻訳表の取得
275
- #
276
- # @overload _ids_(date)
277
- # @param [Array<Numeric>] date ( 年 )
278
- # @return [Array<When::Coordinates::Pair>] 1年の月の配置の翻訳表
279
- #
280
- # @overload _ids_(date)
281
- # @param [Array<Numeric>] date ( 年 月 )
282
- # @return [Array<When::Coordinates::Pair>] 1月の日の配置の翻訳表
283
- # @note 月は 0 始まりの通番
284
- #
285
- def _ids_(date)
286
- y, m = date
287
- y = +y
288
- mm = _new_year_month(y)
289
- return (_table(mm, 12, 0, 1) {|i| _new_year_month(y,i)}) unless m
290
- mm += m
291
- table = _table(_new_month_day(mm,0), 30, 1, 0) {|i| _new_month_day(mm,i)}
292
- table[1,0] = Pair._force_pair(1,1) unless _new_month(mm) == _new_month_day(mm,0)
293
- return table
294
- end
295
-
296
- # 日時要素の翻訳表の作成
297
- # @private
298
- def _table(b0, n, k0, k1)
299
- table = [Pair._force_pair(1,0)]
300
- (1..n).each do |i|
301
- b1 = yield(i)
302
- case b1-b0
303
- when 0 ; table[-1] = Pair._force_pair(i, -2)
304
- when 1 ; table << Pair._force_pair(i+1, 0 )
305
- when 2 ; table << Pair._force_pair(i+k0,k1) << Pair._force_pair(i+1, k0)
306
- else ; raise ArgumentError, "Irregal date span: #{b1-b0}"
307
- end
308
- b0 = b1
309
- end
310
- table.pop while table[-1].trunk > n
311
- return table
312
- end
313
- end
314
- end
315
- 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
+ Tibetan = [self, [
12
+ "locale:[=en:, ja=ja:, alias]",
13
+ "names:[Tibetan=]",
14
+ "[Tibetan=en:Tibetan_calendar, 時輪暦=ja:%%<チベット暦>]",
15
+
16
+ [self,
17
+ "names:[IntercalaryMonth=en:Intercalation, 閏月]",
18
+ "[%s=, %s宿月= ]",
19
+ "[Adika %s=, 閏%s宿月=]"
20
+ ],
21
+
22
+ [self,
23
+ "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
24
+ "[%s and next day=, %sと翌日=]",
25
+ "[Intercalary %s=, 重%s=]"
26
+ ],
27
+
28
+ [self,
29
+ "names:[Month, 月=ja:%%<月_(暦)>]",
30
+ "[Margasirsa, 觜=]",
31
+ "[Pausha, 鬼=]",
32
+ "[Magha, 星=]",
33
+ "[Phalguna, 翼=]",
34
+ "[Chaitra, 角=]",
35
+ "[Vaisakha, 氐=]",
36
+ "[Jyeshta, 心=]",
37
+ "[Ashada, 箕=]",
38
+ "[Sravana, 牛=]",
39
+ "[Bhadrapada, 室=]",
40
+ "[Asvina, 婁=]",
41
+ "[Kartika, 昴=]"
42
+ ]
43
+ ]]
44
+ end
45
+
46
+ module Coordinates
47
+
48
+ # 六十干支
49
+ Tibetan = [When::BasicTypes::M17n, [
50
+ "locale:[=en:, ja=ja:, alias]",
51
+ "names:[Tibetan]",
52
+
53
+ [StemBranch,
54
+ "label:[Stem-Branch, *干支]", "divisor:60", "day:11", "year:4",
55
+ [StemBranch, "label:[Wood-Rat=, *木男鼠=]", "remainder: 0"],
56
+ [StemBranch, "label:[Wood-Ox=, *木女牛=]", "remainder: 1"],
57
+ [StemBranch, "label:[Fire-Tiger=, *火男虎=]", "remainder: 2"],
58
+ [StemBranch, "label:[Fire-Rabbit=, *火女兎=]", "remainder: 3"],
59
+ [StemBranch, "label:[Earth-Dragon=, *土男龍=]", "remainder: 4"],
60
+ [StemBranch, "label:[Earth-Snake=, *土女蛇=]", "remainder: 5"],
61
+ [StemBranch, "label:[Iron-Horse=, *金男馬=]", "remainder: 6"],
62
+ [StemBranch, "label:[Iron-Goat=, *金女羊=]", "remainder: 7"],
63
+ [StemBranch, "label:[Water-Monkey=, *水男猴=]", "remainder: 8"],
64
+ [StemBranch, "label:[Water-Rooster=, *水女鷄=]", "remainder: 9"],
65
+ [StemBranch, "label:[Wood-Dog=, *木男狗=]", "remainder:10"],
66
+ [StemBranch, "label:[Wood-Pig=, *木女猪=]", "remainder:11"],
67
+ [StemBranch, "label:[Fire-Rat=, *火男鼠=]", "remainder:12"],
68
+ [StemBranch, "label:[Fire-Ox=, *火女牛=]", "remainder:13"],
69
+ [StemBranch, "label:[Earth-Tiger=, *土男虎=]", "remainder:14"],
70
+ [StemBranch, "label:[Earth-Rabbit=, *土女兎=]", "remainder:15"],
71
+ [StemBranch, "label:[Iron-Dragon=, *金男龍=]", "remainder:16"],
72
+ [StemBranch, "label:[Iron-Snake=, *金女蛇=]", "remainder:17"],
73
+ [StemBranch, "label:[Water-Horse=, *水男馬=]", "remainder:18"],
74
+ [StemBranch, "label:[Water-Goat=, *水女羊=]", "remainder:19"],
75
+ [StemBranch, "label:[Wood-Monkey=, *木男猴=]", "remainder:20"],
76
+ [StemBranch, "label:[Wood-Rooster=, *木女鷄=]", "remainder:21"],
77
+ [StemBranch, "label:[Fire-Dog=, *火男狗=]", "remainder:22"],
78
+ [StemBranch, "label:[Fire-Pig=, *火女猪=]", "remainder:23"],
79
+ [StemBranch, "label:[Earth-Rat=, *土男鼠=]", "remainder:24"],
80
+ [StemBranch, "label:[Earth-Ox=, *土女牛=]", "remainder:25"],
81
+ [StemBranch, "label:[Iron-Tiger=, *金男虎=]", "remainder:26"],
82
+ [StemBranch, "label:[Iron-Rabbit=, *金女兎=]", "remainder:27"],
83
+ [StemBranch, "label:[Water-Dragon=, *水男龍=]", "remainder:28"],
84
+ [StemBranch, "label:[Water-Snake=, *水女蛇=]", "remainder:29"],
85
+ [StemBranch, "label:[Wood-Horse=, *木男馬=]", "remainder:30"],
86
+ [StemBranch, "label:[Wood-Goat=, *木女羊=]", "remainder:31"],
87
+ [StemBranch, "label:[Fire-Monkey=, *火男猴=]", "remainder:32"],
88
+ [StemBranch, "label:[Fire-Rooster=, *火女鷄=]", "remainder:33"],
89
+ [StemBranch, "label:[Earth-Dog=, *土男狗=]", "remainder:34"],
90
+ [StemBranch, "label:[Earth-Pig=, *土女猪=]", "remainder:35"],
91
+ [StemBranch, "label:[Iron-Rat=, *金男鼠=]", "remainder:36"],
92
+ [StemBranch, "label:[Iron-Ox=, *金女牛=]", "remainder:37"],
93
+ [StemBranch, "label:[Water-Tiger=, *水男虎=]", "remainder:38"],
94
+ [StemBranch, "label:[Water-Rabbit=, *水女兎=]", "remainder:39"],
95
+ [StemBranch, "label:[Wood-Dragon=, *木男龍=]", "remainder:40"],
96
+ [StemBranch, "label:[Wood-Snake=, *木女蛇=]", "remainder:41"],
97
+ [StemBranch, "label:[Fire-Horse=, *火男馬=]", "remainder:42"],
98
+ [StemBranch, "label:[Fire-Goat=, *火女羊=]", "remainder:43"],
99
+ [StemBranch, "label:[Earth-Monkey=, *土男猴=]", "remainder:44"],
100
+ [StemBranch, "label:[Earth-Rooster=, *土女鷄=]", "remainder:45"],
101
+ [StemBranch, "label:[Iron-Dog=, *金男狗=]", "remainder:46"],
102
+ [StemBranch, "label:[Iron-Pig=, *金女猪=]", "remainder:47"],
103
+ [StemBranch, "label:[Water-Rat=, *水男鼠=]", "remainder:48"],
104
+ [StemBranch, "label:[Water-Ox=, *水女牛=]", "remainder:49"],
105
+ [StemBranch, "label:[Wood-Tiger=, *木男虎=]", "remainder:50"],
106
+ [StemBranch, "label:[Wood-Rabbit=, *木女兎=]", "remainder:51"],
107
+ [StemBranch, "label:[Fire-Dragon=, *火男龍=]", "remainder:52"],
108
+ [StemBranch, "label:[Fire-Snake=, *火女蛇=]", "remainder:53"],
109
+ [StemBranch, "label:[Earth-Horse=, *土男馬=]", "remainder:54"],
110
+ [StemBranch, "label:[Earth-Goat=, *土女羊=]", "remainder:55"],
111
+ [StemBranch, "label:[Iron-Monkey=, *金男猴=]", "remainder:56"],
112
+ [StemBranch, "label:[Iron-Rooster=, *金女鷄=]", "remainder:57"],
113
+ [StemBranch, "label:[Water-Dog=, *水男狗=]", "remainder:58"],
114
+ [StemBranch, "label:[Water-Pig=, *水女猪=]", "remainder:59"]
115
+ ]
116
+ ]]
117
+ end
118
+
119
+ class CalendarNote
120
+ Tibetan = [['Tibetan::干支'], ['_m:Calendar::Month'], ['Common::Week']]
121
+ end
122
+
123
+ module CalendarTypes
124
+
125
+ #
126
+ # Tibetan Calendar
127
+ #
128
+ class Tibetan < EphemerisBasedLuniSolar
129
+
130
+ #
131
+ # 定数
132
+ #
133
+ Y0 = 1827 # 元期の西暦年
134
+ D0 = 2388440 # 元期のユリウス日
135
+ V0 = (6.0+45/60.0) # 白羊宮入りのオフセット
136
+ Am = (2.0+1.0/126) # 月の近地点
137
+
138
+ Rem = 1 # 余りのインデックス
139
+ Quot = 0 # 商のインデックス
140
+ Ddd = 0 # 差分のインデックス
141
+ Sum = 1 # 積算値のインデックス
142
+ Jm = [ # 月の中心差
143
+ [ 5, 0], [ 5, 5], [ 5,10], [ 5,15], [ 4,19], [ 3,22], [ 2,24],
144
+ [ 1,25], [-1,24], [-2,22], [-3,19], [-4,15], [-5,10], [-5, 5],
145
+ [-5, 0], [-5,-5]
146
+ ]
147
+ Js = [ # 太陽の中心差
148
+ [ 6, 0], [ 6, 6], [ 4,10], [ 1,11], [-1,10], [-4, 6], [-6, 0],
149
+ [-6,-6]
150
+ ]
151
+
152
+ private
153
+
154
+ # オブジェクトの正規化
155
+ #
156
+ # @type = 体系派なら 1, 作用派なら 2
157
+ # @parameter = 太陽と月の位相計算用のテーブル
158
+ #
159
+ def _normalize(args=[], options={})
160
+ intercalary_month = When.Resource('_m:Tibetan::IntercalaryMonth::*')
161
+ intercalary_day = When.Resource('_m:Tibetan::IntercalaryDay::*')
162
+ # trunk_of_day = (1..30).to_a.map {|d| When.m17n(d.to_s)}
163
+ @indices ||= @index_of_MSC && @index_of_MSC.to_i == 1 ?
164
+ [
165
+ When.Index({:unit=>60}),
166
+ When.Index('Tibetan::Month', {:branch=>{0=>intercalary_month[0], 1=>intercalary_month[1]}, :shift=>2}),
167
+ When.Index({:branch=>{-2=>intercalary_day[0], +1=>intercalary_day[1]}})
168
+ ] :
169
+ [
170
+ When.Index('Tibetan::Month', {:branch=>{0=>intercalary_month[0], 1=>intercalary_month[1]}, :shift=>2}),
171
+ When.Index({:branch=>{-2=>intercalary_day[0], +1=>intercalary_day[1]}})
172
+ ]
173
+ @label ||= 'Tibetan::Tibetan'
174
+ @epoch_in_CE ||= 0
175
+ @type ||= 1
176
+ @parameter = case @type.to_i
177
+ when 1
178
+ {'M0'=>(60+15),
179
+ 'Wo'=>Z(29,31,50,0,480),
180
+ 'W0'=>Z( 3,37,43,2,140),
181
+ 'Wd'=>Z( 0,59, 3,4, 16),
182
+ 'So'=>K( 2,10,58,1, 17),
183
+ 'S0'=>K(24,59, 6,1, 41),
184
+ 'Sd'=>K( 0, 4,21,5, 43),
185
+ 'A0'=>22.0
186
+ }
187
+ when 2
188
+ {'M0'=>(64+15),
189
+ 'Wo'=>Z(29,31,50,0, 0),
190
+ 'W0'=>Z( 3,21,20,0, 0),
191
+ 'Wd'=>Z( 0,59, 3,4, 0),
192
+ 'So'=>L( 2,10,58,2, 10),
193
+ 'S0'=>L(25,42,12,1, 11),
194
+ 'Sd'=>L( 0, 4,21,5, 9),
195
+ 'A0'=>(22.0+28.0/126)
196
+ }
197
+ end
198
+ @note = 'Tibetan'
199
+ super
200
+ end
201
+
202
+ # @private
203
+ def Z(z,q,d,m,s)
204
+ ((((s/707.0+m)/6.0+d)/60.0+q)/60.0+z)
205
+ end
206
+
207
+ # @private
208
+ def K(k,q,d,m,s)
209
+ ((((s/67.0+m)/6.0+d)/60.0+q)/60.0+k)
210
+ end
211
+
212
+ # @private
213
+ def L(k,q,d,m,s)
214
+ ((((s/13.0+m)/6.0+d)/60.0+q)/60.0+k)
215
+ end
216
+
217
+ #
218
+ # 太陽または月の位置の中心差による差分
219
+ # @private
220
+ def _sn(t,m,p)
221
+ t0 = t.floor
222
+ r = t0.divmod(m)
223
+ s = (1.0/60.0)
224
+ s = -s unless r[Quot] % 2 == 0
225
+ return s * (p[r[Rem]][Sum] + (t-t0) * p[r[Rem]+1][Ddd])
226
+ end
227
+
228
+ # 積月計算
229
+ #
230
+ # @param [Integer] y
231
+ # @param [Integer] m 年(デフォルト 0)
232
+ #
233
+ # @return [Integer] 積月
234
+ #
235
+ # m に 0 以外を指定することで、積月の跳び(閏)を検出できる
236
+ #
237
+ def _new_year_month_(y, m=0)
238
+ mm = (y-Y0) * 12 + (m - 2)
239
+ mm += (mm * 2 + @parameter['M0']).divmod(65)[Quot]
240
+ return mm
241
+ end
242
+
243
+ # 月初の通日
244
+ #
245
+ # @param [Integer] m 通月
246
+ #
247
+ # @return [Integer] 月初の通日
248
+ #
249
+ def _new_month_(m)
250
+ sdn = [0,-1].map {|d| _new_month_day(m, d)}
251
+ sdn[0]-sdn[1] == 1 ? sdn[0] : sdn[0]-1
252
+ end
253
+
254
+ #
255
+ # 積日計算
256
+ #
257
+ # @param [Integer] m 通月
258
+ # @param [Integer] d 日
259
+ #
260
+ # @return [Integer] 積日
261
+ #
262
+ # 積日の跳び(重日)、ダブり(欠日)を検出できる
263
+ #
264
+ def _new_month_day_(m, d)
265
+ d += 1
266
+ w = m * @parameter['Wo'] + @parameter['W0'] + d * @parameter['Wd'] # 中曜
267
+ s = m * @parameter['So'] + @parameter['S0'] + d * @parameter['Sd'] # 中日
268
+ sdn = D0 + w
269
+ sdn += _sn(m*Am+@parameter['A0']+d, 14, Jm)
270
+ sdn -= _sn((s-V0)*(60.0/135.0), 6, Js)
271
+ return sdn.floor
272
+ end
273
+
274
+ #
275
+ # 日時要素の翻訳表の取得
276
+ #
277
+ # @overload _ids_(date)
278
+ # @param [Array<Numeric>] date ( 年 )
279
+ # @return [Array<When::Coordinates::Pair>] 1年の月の配置の翻訳表
280
+ #
281
+ # @overload _ids_(date)
282
+ # @param [Array<Numeric>] date ( 年 月 )
283
+ # @return [Array<When::Coordinates::Pair>] 1月の日の配置の翻訳表
284
+ # @note 月は 0 始まりの通番
285
+ #
286
+ def _ids_(date)
287
+ y, m = date
288
+ y = +y
289
+ mm = _new_year_month(y)
290
+ return (_table(mm, 12, 0, 1) {|i| _new_year_month(y,i)}) unless m
291
+ mm += m
292
+ table = _table(_new_month_day(mm,0), 30, 1, 0) {|i| _new_month_day(mm,i)}
293
+ table[1,0] = Pair._force_pair(1,1) unless _new_month(mm) == _new_month_day(mm,0)
294
+ return table
295
+ end
296
+
297
+ # 日時要素の翻訳表の作成
298
+ # @private
299
+ def _table(b0, n, k0, k1)
300
+ table = [Pair._force_pair(1,0)]
301
+ (1..n).each do |i|
302
+ b1 = yield(i)
303
+ case b1-b0
304
+ when 0 ; table[-1] = Pair._force_pair(i, -2)
305
+ when 1 ; table << Pair._force_pair(i+1, 0 )
306
+ when 2 ; table << Pair._force_pair(i+k0,k1) << Pair._force_pair(i+1, k0)
307
+ else ; raise ArgumentError, "Irregal date span: #{b1-b0}"
308
+ end
309
+ b0 = b1
310
+ end
311
+ table.pop while table[-1].trunk > n
312
+ return table
313
+ end
314
+ end
315
+ end
316
+ end