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,316 +1,315 @@
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:, hi=hi:, alias]",
13
- "names:[Tibetan=]",
14
- "[Tibetan=en:Tibetan_calendar, 時輪暦=ja:%%<チベット暦>]",
15
-
16
- [self,
17
- "names:[IntercalaryMonth=en:Intercalation, 閏月]",
18
- "[%s=, %s宿月=, _IAST_=]",
19
- "[adhika %s=, 閏%s宿月=, _IAST_=]"
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
- "[Mārgaśīra=en:Margashirsha, 觜=, _IAST_=]",
31
- "[Pauṣa=en:Pausha, 鬼=, _IAST_=]",
32
- "[Māgha=en:Maagha, 星=, _IAST_=]",
33
- "[Phālguna=en:Phalguna, 翼=, _IAST_=]",
34
- "[Caitra=en:Chaitra, 角=, _IAST_=]",
35
- "[Vaiśākha=en:Vaisakha, 氐=, _IAST_=]",
36
- "[Jyaiṣṭha=en:Jyeshta, 心=, _IAST_=]",
37
- "[Āṣāḍha=en:Aashaadha, 箕=, _IAST_=]",
38
- "[Śrāvaṇa=en:Shraavana, 牛=, _IAST_=]",
39
- "[Bhādrapada=en:Bhadrapada, 室=, _IAST_=]",
40
- "[Āśvina=en:Ashwin, 婁=, _IAST_=]",
41
- "[Kārttika=en:Kartika_(month), 昴=, _IAST_=]"
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
- @diff_to_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
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
+ Tibetan = [self, [
12
+ "locale:[=en:, ja=ja:, zh=zh:, hi=hi:, alias]",
13
+ "names:[Tibetan=en:Tibetan_calendar, 時輪暦=ja:%%<チベット暦>, 藏曆]",
14
+
15
+ [self,
16
+ "names:[Month=, 月の名前=, 該月的名稱=, *alias:IntercalaryMonth=en:Intercalation]",
17
+ "[%s=, %s宿月=, %s宿月=, _IAST_=]",
18
+ "[adhika %s=, 閏%s宿月=, 閏%s宿月=, _IAST_=]"
19
+ ],
20
+
21
+ [self,
22
+ "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
23
+ "[%s and next day=, %sと翌日=, %s和第二天=]",
24
+ "[Intercalary %s=, 重%s=, 重%s= ]"
25
+ ],
26
+
27
+ [self,
28
+ "names:[month name=en:Month, 月の名前=ja:%%<月_(暦)>, 該月的名稱=, *alias:Month=]",
29
+ "[Mārgaśīra=en:Margashirsha, 觜=ja:%%<觜宿>, 觜=zh:%%<觜宿>, _IAST_=]",
30
+ "[Pauṣa=en:Pausha, 鬼=ja:%%<鬼宿>, 鬼=zh:%%<鬼宿>, _IAST_=]",
31
+ "[Māgha=en:Maagha, 星=ja:%%<星宿>, 星=zh:%%<星宿>, _IAST_=]",
32
+ "[Phālguna=en:Phalguna, 翼=ja:%%<翼宿>, 翼=zh:%%<翼宿>, _IAST_=]",
33
+ "[Caitra=en:Chaitra, 角=ja:%%<角宿>, 角=zh:%%<角宿>, _IAST_=]",
34
+ "[Vaiśākha=en:Vaisakha, 氐=ja:%%<氐宿>, 氐=zh:%%<氐宿>, _IAST_=]",
35
+ "[Jyaiṣṭha=en:Jyeshta, 心=ja:%%<心宿>, 心=zh:%%<心宿>, _IAST_=]",
36
+ "[Āṣāḍha=en:Aashaadha, 箕=ja:%%<箕宿>, 箕=zh:%%<箕宿>, _IAST_=]",
37
+ "[Śrāvaṇa=en:Shraavana, 牛=ja:%%<牛宿>, 牛=zh:%%<牛宿>, _IAST_=]",
38
+ "[Bhādrapada=en:Bhadrapada, 室=ja:%%<室宿>, 室=zh:%%<室宿>, _IAST_=]",
39
+ "[Āśvina=en:Ashwin, 婁=ja:%%<婁宿>, 婁=zh:%%<婁宿>, _IAST_=]",
40
+ "[Kārttika=en:Kartika_(month), 昴=ja:%%<昴宿>, 昴=zh:%%<昴宿>, _IAST_=]"
41
+ ]
42
+ ]]
43
+ end
44
+
45
+ module Coordinates
46
+
47
+ # 六十干支
48
+ Tibetan = [When::BasicTypes::M17n, [
49
+ "locale:[=en:, ja=ja:, alias]",
50
+ "names:[Tibetan]",
51
+
52
+ [StemBranch,
53
+ "label:[Stem-Branch, *干支]", "divisor:60", "day:11", "year:4",
54
+ [StemBranch, "label:[Wood-Rat=, *木男鼠=]", "remainder: 0"],
55
+ [StemBranch, "label:[Wood-Ox=, *木女牛=]", "remainder: 1"],
56
+ [StemBranch, "label:[Fire-Tiger=, *火男虎=]", "remainder: 2"],
57
+ [StemBranch, "label:[Fire-Rabbit=, *火女兎=]", "remainder: 3"],
58
+ [StemBranch, "label:[Earth-Dragon=, *土男龍=]", "remainder: 4"],
59
+ [StemBranch, "label:[Earth-Snake=, *土女蛇=]", "remainder: 5"],
60
+ [StemBranch, "label:[Iron-Horse=, *金男馬=]", "remainder: 6"],
61
+ [StemBranch, "label:[Iron-Goat=, *金女羊=]", "remainder: 7"],
62
+ [StemBranch, "label:[Water-Monkey=, *水男猴=]", "remainder: 8"],
63
+ [StemBranch, "label:[Water-Rooster=, *水女鷄=]", "remainder: 9"],
64
+ [StemBranch, "label:[Wood-Dog=, *木男狗=]", "remainder:10"],
65
+ [StemBranch, "label:[Wood-Pig=, *木女猪=]", "remainder:11"],
66
+ [StemBranch, "label:[Fire-Rat=, *火男鼠=]", "remainder:12"],
67
+ [StemBranch, "label:[Fire-Ox=, *火女牛=]", "remainder:13"],
68
+ [StemBranch, "label:[Earth-Tiger=, *土男虎=]", "remainder:14"],
69
+ [StemBranch, "label:[Earth-Rabbit=, *土女兎=]", "remainder:15"],
70
+ [StemBranch, "label:[Iron-Dragon=, *金男龍=]", "remainder:16"],
71
+ [StemBranch, "label:[Iron-Snake=, *金女蛇=]", "remainder:17"],
72
+ [StemBranch, "label:[Water-Horse=, *水男馬=]", "remainder:18"],
73
+ [StemBranch, "label:[Water-Goat=, *水女羊=]", "remainder:19"],
74
+ [StemBranch, "label:[Wood-Monkey=, *木男猴=]", "remainder:20"],
75
+ [StemBranch, "label:[Wood-Rooster=, *木女鷄=]", "remainder:21"],
76
+ [StemBranch, "label:[Fire-Dog=, *火男狗=]", "remainder:22"],
77
+ [StemBranch, "label:[Fire-Pig=, *火女猪=]", "remainder:23"],
78
+ [StemBranch, "label:[Earth-Rat=, *土男鼠=]", "remainder:24"],
79
+ [StemBranch, "label:[Earth-Ox=, *土女牛=]", "remainder:25"],
80
+ [StemBranch, "label:[Iron-Tiger=, *金男虎=]", "remainder:26"],
81
+ [StemBranch, "label:[Iron-Rabbit=, *金女兎=]", "remainder:27"],
82
+ [StemBranch, "label:[Water-Dragon=, *水男龍=]", "remainder:28"],
83
+ [StemBranch, "label:[Water-Snake=, *水女蛇=]", "remainder:29"],
84
+ [StemBranch, "label:[Wood-Horse=, *木男馬=]", "remainder:30"],
85
+ [StemBranch, "label:[Wood-Goat=, *木女羊=]", "remainder:31"],
86
+ [StemBranch, "label:[Fire-Monkey=, *火男猴=]", "remainder:32"],
87
+ [StemBranch, "label:[Fire-Rooster=, *火女鷄=]", "remainder:33"],
88
+ [StemBranch, "label:[Earth-Dog=, *土男狗=]", "remainder:34"],
89
+ [StemBranch, "label:[Earth-Pig=, *土女猪=]", "remainder:35"],
90
+ [StemBranch, "label:[Iron-Rat=, *金男鼠=]", "remainder:36"],
91
+ [StemBranch, "label:[Iron-Ox=, *金女牛=]", "remainder:37"],
92
+ [StemBranch, "label:[Water-Tiger=, *水男虎=]", "remainder:38"],
93
+ [StemBranch, "label:[Water-Rabbit=, *水女兎=]", "remainder:39"],
94
+ [StemBranch, "label:[Wood-Dragon=, *木男龍=]", "remainder:40"],
95
+ [StemBranch, "label:[Wood-Snake=, *木女蛇=]", "remainder:41"],
96
+ [StemBranch, "label:[Fire-Horse=, *火男馬=]", "remainder:42"],
97
+ [StemBranch, "label:[Fire-Goat=, *火女羊=]", "remainder:43"],
98
+ [StemBranch, "label:[Earth-Monkey=, *土男猴=]", "remainder:44"],
99
+ [StemBranch, "label:[Earth-Rooster=, *土女鷄=]", "remainder:45"],
100
+ [StemBranch, "label:[Iron-Dog=, *金男狗=]", "remainder:46"],
101
+ [StemBranch, "label:[Iron-Pig=, *金女猪=]", "remainder:47"],
102
+ [StemBranch, "label:[Water-Rat=, *水男鼠=]", "remainder:48"],
103
+ [StemBranch, "label:[Water-Ox=, *水女牛=]", "remainder:49"],
104
+ [StemBranch, "label:[Wood-Tiger=, *木男虎=]", "remainder:50"],
105
+ [StemBranch, "label:[Wood-Rabbit=, *木女兎=]", "remainder:51"],
106
+ [StemBranch, "label:[Fire-Dragon=, *火男龍=]", "remainder:52"],
107
+ [StemBranch, "label:[Fire-Snake=, *火女蛇=]", "remainder:53"],
108
+ [StemBranch, "label:[Earth-Horse=, *土男馬=]", "remainder:54"],
109
+ [StemBranch, "label:[Earth-Goat=, *土女羊=]", "remainder:55"],
110
+ [StemBranch, "label:[Iron-Monkey=, *金男猴=]", "remainder:56"],
111
+ [StemBranch, "label:[Iron-Rooster=, *金女鷄=]", "remainder:57"],
112
+ [StemBranch, "label:[Water-Dog=, *水男狗=]", "remainder:58"],
113
+ [StemBranch, "label:[Water-Pig=, *水女猪=]", "remainder:59"]
114
+ ]
115
+ ]]
116
+ end
117
+
118
+ class CalendarNote
119
+ Tibetan = [['Tibetan::干支'], ['_m:Calendar::Month'], ['Common::Week']]
120
+ end
121
+
122
+ module CalendarTypes
123
+
124
+ #
125
+ # Tibetan Calendar
126
+ #
127
+ class Tibetan < EphemerisBasedLuniSolar
128
+
129
+ #
130
+ # 定数
131
+ #
132
+ Y0 = 1827 # 元期の西暦年
133
+ D0 = 2388440 # 元期のユリウス日
134
+ V0 = (6.0+45/60.0) # 白羊宮入りのオフセット
135
+ Am = (2.0+1.0/126) # 月の近地点
136
+
137
+ Rem = 1 # 余りのインデックス
138
+ Quot = 0 # 商のインデックス
139
+ Ddd = 0 # 差分のインデックス
140
+ Sum = 1 # 積算値のインデックス
141
+ Jm = [ # 月の中心差
142
+ [ 5, 0], [ 5, 5], [ 5,10], [ 5,15], [ 4,19], [ 3,22], [ 2,24],
143
+ [ 1,25], [-1,24], [-2,22], [-3,19], [-4,15], [-5,10], [-5, 5],
144
+ [-5, 0], [-5,-5]
145
+ ]
146
+ Js = [ # 太陽の中心差
147
+ [ 6, 0], [ 6, 6], [ 4,10], [ 1,11], [-1,10], [-4, 6], [-6, 0],
148
+ [-6,-6]
149
+ ]
150
+
151
+ private
152
+
153
+ # オブジェクトの正規化
154
+ #
155
+ # @type = 体系派なら 1, 作用派なら 2
156
+ # @parameter = 太陽と月の位相計算用のテーブル
157
+ #
158
+ def _normalize(args=[], options={})
159
+ intercalary_month = When.Resource('_m:Tibetan::IntercalaryMonth::*')
160
+ intercalary_day = When.Resource('_m:Tibetan::IntercalaryDay::*')
161
+ # trunk_of_day = (1..30).to_a.map {|d| When.m17n(d.to_s)}
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'
173
+ @diff_to_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