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