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,58 +1,58 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 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
- =begin
9
-
10
- References
11
-
12
- (1) http://calendars.wikia.com/wiki/Goddess_Lunar_Calendar
13
- (2) http://www.fractal-timewave.com/mmgc/mmgc.htm
14
-
15
- =end
16
-
17
- module When
18
-
19
- class BasicTypes::M17n
20
-
21
- Goddess = [self, [
22
- "locale:[=en:, ja]",
23
- "names:[Goddess=]",
24
- "[Goddess(MMG)=http://calendars.wikia.com/wiki/Goddess_Lunar_Calendar, ゴッデス暦, *alias:Goddess]",
25
-
26
- [self,
27
- "names:[Month]",
28
- "[Athena]", "[Brigid]", "[Cerridwen]", "[Diana ]",
29
- "[Epona ]", "[Freya ]", "[Gaea ]", "[Hathor]",
30
- "[Inanna]", "[Juno ]", "[Kore ]", "[Lilith]",
31
- "[Maria ]"
32
- ]
33
- ]]
34
- end
35
-
36
- module CalendarTypes
37
-
38
- #
39
- # Goddess Calendar
40
- #
41
- Goddess = [CyclicTableBased, {
42
- 'label' => 'Goddess::Goddess',
43
- 'origin_of_LSC' => 2415611 - 180432, # 1901-08-14 Base Cycle = No.1
44
- 'indices' => [
45
- When.Index({:unit=>470}),
46
- When.Index('Goddess::Month'),
47
- When::Coordinates::DefaultDayIndex,
48
- ],
49
- 'rule_table' => {
50
- 'T' => {'Rule' =>(['L'] * 9 + ['S']) * 23 +
51
- (['L'] * 4 + ['S']) * 2 +
52
- (['L'] * 9 + ['S']) * 23},
53
- 'L' => {'Length'=>[30, 29] * 6 + [30]},
54
- 'S' => {'Length'=>[30, 29] * 6 + [29]}
55
- }
56
- }]
57
- end
58
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 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
+ =begin
9
+
10
+ References
11
+
12
+ (1) http://calendars.wikia.com/wiki/Goddess_Lunar_Calendar
13
+ (2) http://www.fractal-timewave.com/mmgc/mmgc.htm
14
+
15
+ =end
16
+
17
+ module When
18
+
19
+ class BasicTypes::M17n
20
+
21
+ Goddess = [self, [
22
+ "locale:[=en:, ja]",
23
+ "names:[Goddess=]",
24
+ "[Goddess(MMG)=http://calendars.wikia.com/wiki/Goddess_Lunar_Calendar, ゴッデス暦, *alias:Goddess]",
25
+
26
+ [self,
27
+ "names:[Month]",
28
+ "[Athena]", "[Brigid]", "[Cerridwen]", "[Diana ]",
29
+ "[Epona ]", "[Freya ]", "[Gaea ]", "[Hathor]",
30
+ "[Inanna]", "[Juno ]", "[Kore ]", "[Lilith]",
31
+ "[Maria ]"
32
+ ]
33
+ ]]
34
+ end
35
+
36
+ module CalendarTypes
37
+
38
+ #
39
+ # Goddess Calendar
40
+ #
41
+ Goddess = [CyclicTableBased, {
42
+ 'label' => 'Goddess::Goddess',
43
+ 'origin_of_LSC' => 2415611 - 180432, # 1901-08-14 Base Cycle = No.1
44
+ 'indices' => [
45
+ When.Index({:unit=>470}),
46
+ When.Index('Goddess::Month'),
47
+ When::Coordinates::DefaultDayIndex,
48
+ ],
49
+ 'rule_table' => {
50
+ 'T' => {'Rule' =>(['L'] * 9 + ['S']) * 23 +
51
+ (['L'] * 4 + ['S']) * 2 +
52
+ (['L'] * 9 + ['S']) * 23},
53
+ 'L' => {'Length'=>[30, 29] * 6 + [30]},
54
+ 'S' => {'Length'=>[30, 29] * 6 + [29]}
55
+ }
56
+ }]
57
+ end
58
+ end
@@ -1,1251 +1,1254 @@
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
- require 'when_exe/locales/iast'
9
-
10
- module When
11
- class BasicTypes::M17n
12
-
13
- Indian = [self, [
14
- "locale:[=en:, ja=ja:, hi=hi:, alias]",
15
- "names:[Indian=]",
16
- "[IndianNationalSolar=en:Indian_national_calendar, インド国定暦]",
17
- "[Nanakshahi=en:Nanakshahi_calendar, ナーナク暦=]",
18
- "[RevisedBengali=en:Bengali_calendar, 改訂ベンガル暦=]",
19
- "[HinduSolar=en:Hindu_calendar, インド太陽暦=ja:%%<ヒンドゥー暦>]",
20
- "[HinduLuniSolar=en:Hindu_calendar, インド太陰太陽暦=ja:%%<ヒンドゥー暦>]",
21
-
22
- [self,
23
- "names:[IntercalaryMonth=en:Intercalation, 閏月]",
24
- "[%s Śuklapakṣa=, %s 白分=, _IAST_=]",
25
- "[%s Kṛṣṇapakṣa=, %s 黒分=, _IAST_=]",
26
- "[adhika %s Śuklapakṣa=, 閏%s 白分=, _IAST_=]",
27
- "[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, _IAST_=]"
28
- ],
29
-
30
- [self,
31
- "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
32
- "[Double %s=, 欠= ]",
33
- "[Intercalary %s=, 重= ]"
34
- ],
35
-
36
- [self,
37
- "names:[LunarMonth=, 太陰月=ja:%%<月_(暦)>]",
38
- "[Mārgaśīra=en:Margashirsha, マールガシールシャ=, _IAST_=]",
39
- "[Pauṣa=en:Pausha, パウシャ=, _IAST_=]",
40
- "[Māgha=en:Maagha, マーガ=, _IAST_=]",
41
- "[Phālguna=en:Phalguna, パールグナ=, _IAST_=]",
42
- "[Caitra=en:Chaitra, チャイトラ=, _IAST_=]",
43
- "[Vaiśākha=en:Vaisakha, ヴァイシャーカ=, _IAST_=]",
44
- "[Jyaiṣṭha=en:Jyeshta, ジャイシュタ=, _IAST_=]",
45
- "[Āṣāḍha=en:Aashaadha, アーシャーダ=, _IAST_=]",
46
- "[Śrāvaṇa=en:Shraavana, シュラーヴァナ=, _IAST_=]",
47
- "[Bhādrapada=en:Bhadrapada, バードラパダ=, _IAST_=]",
48
- "[Āśvina=en:Ashwin, アーシュヴィナ=, _IAST_=]",
49
- "[Kārttika=en:Kartika_(month), カールッティカ=, _IAST_=]"
50
- ],
51
-
52
- [self,
53
- "names:[SolarMonth=, 太陽月=ja:%%<月_(暦)>]",
54
- "[Maysha=, 白羊宮, _IAST_=]",
55
- "[Vrushabha=, 金牛宮, _IAST_=]",
56
- "[Mithuna=, 双児宮, _IAST_=]",
57
- "[Karka=, 巨蟹宮, _IAST_=]",
58
- "[Simha=, 獅子宮, _IAST_=]",
59
- "[Kanya=, 処女宮, _IAST_=]",
60
- "[Tula=, 天秤宮, _IAST_=]",
61
- "[Vrushchika=, 天蝎宮, _IAST_=]",
62
- "[Dhanu=, 人馬宮, _IAST_=]",
63
- "[Makar=, 磨羯宮, _IAST_=]",
64
- "[Kumbha=, 宝瓶宮, _IAST_=]",
65
- "[Meena=, 双魚宮, _IAST_=]"
66
- ],
67
-
68
- [self,
69
- "names:[NanakshahiMonth=, 太陽月=ja:%%<月_(暦)>]",
70
- "[Maghar=en:Maghar_(month) ]",
71
- "[Poh ]",
72
- "[Magh=en:Magh_(Sikh_calendar)]",
73
- "[Phagun ]",
74
- "[Chet=en:Chet_(month) ]",
75
- "[Vaisakh ]",
76
- "[Jeth ]",
77
- "[Harh ]",
78
- "[Sawan ]",
79
- "[Bhadon ]",
80
- "[Assu ]",
81
- "[Katak ]"
82
- ],
83
-
84
- [self,
85
- "names:[BengaliMonth=, 太陽月=ja:%%<月_(暦)>]",
86
- "[Ogrôhayôn=]",
87
- "[Poush= ]",
88
- "[Magh= ]",
89
- "[Falgun= ]",
90
- "[Chôitrô= ]",
91
- "[Bôishakh= ]",
92
- "[Jyôishţhô=]",
93
- "[Ashaŗh= ]",
94
- "[Shrabôn= ]",
95
- "[Bhadrô= ]",
96
- "[Ashbin= ]",
97
- "[Kartik= ]"
98
- ]
99
- ]]
100
- end
101
-
102
- module Coordinates
103
-
104
- # Location of cities in India
105
- Indian = [When::BasicTypes::M17n, [
106
- "locale:[=en:, ja=ja:, alias]",
107
- "names:[Indian]",
108
- [Spatial, "long:+82.5", "lat:N23.11", "label:[CentralIndia, インド中部]" ],
109
- [Spatial, "long:+82.5", "lat:+29.0", "label:[NorthIndia, インド北部]" ],
110
- [Spatial, "long:+78.0", "lat:+27.2", "label:[Agra, アーグラ]" ],
111
- [Spatial, "long:+72.6", "lat:+23.0", "label:[Ahmedabad, アフマダーバード]" ],
112
- [Spatial, "long:+74.6", "lat:+26.5", "label:[Ajmer, アジメール]" ],
113
- [Spatial, "long:+78.1", "lat:+27.9", "label:[Aligarh, アリーガル]" ],
114
- [Spatial, "long:+74.9", "lat:+31.6", "label:[Amritsar, アムリトサル]" ],
115
- [Spatial, "long:+77.6", "lat:+13.0", "label:[Bangalore, バンガロール]" ],
116
- [Spatial, "long:+85.8", "lat:+20.2", "label:[Bhuvaneswar, ブヴァネーシュヴァル]"],
117
- [Spatial, "long:+80.3", "lat:+13.1", "label:[Chennai, チェンナイ, Madras]" ],
118
- [Spatial, "long:+79.9", "lat: +6.9", "label:[Colombo, コロンボ]" ],
119
- [Spatial, "long:+90.4", "lat:+23.7", "label:[Dacca, ダッカ]" ],
120
- [Spatial, "long:+77.2", "lat:+28.6", "label:[Delhi, デリー]" ],
121
- [Spatial, "long:+78.5", "lat:+17.4", "label:[Hyderabad, ハイデラバード]" ],
122
- [Spatial, "long:+75.8", "lat:+26.9", "label:[Jaipur, ジャイプル]" ],
123
- [Spatial, "long:+85.2", "lat:+27.7", "label:[Kathmandu, カトマンズ]" ],
124
- [Spatial, "long:+76.2", "lat:+10.0", "label:[Kochi, コーチ, Cochin]" ],
125
- [Spatial, "long:+88.4", "lat:+22.6", "label:[Kolkata, コルカタ, Calcutta]" ],
126
- [Spatial, "long:+74.3", "lat:+31.6", "label:[Lahor, ラホール]" ],
127
- [Spatial, "long:+77.7", "lat:+27.5", "label:[Mathura, マトゥラー]" ],
128
- [Spatial, "long:+72.8", "lat:+19.0", "label:[Mumbai, ムンバイ, Bombay]" ],
129
- [Spatial, "long:+76.6", "lat:+12.3", "label:[Mysore, マイソール]" ],
130
- [Spatial, "long:+85.1", "lat:+25.6", "label:[Patna, パトナ]" ],
131
- [Spatial, "long:+73.9", "lat:+18.5", "label:[Pune, プネー]" ],
132
- [Spatial, "long:+74.8", "lat:+34.1", "label:[Srinagar, シュリーナガル]" ],
133
- [Spatial, "long:+77.0", "lat: +8.5", "label:[Thiruvananthapuram, ティルヴァナンタプラム, Trivandrum]"],
134
- [Spatial, "long:+83.0", "lat:+25.3", "label:[Varanasi, ワーラーナシー]" ],
135
- [Spatial, "long:+75.8", "lat:+23.2", "label:[Ujjain, ウッジャイン]" ]
136
- ]]
137
- end
138
-
139
- module Ephemeris
140
-
141
- #
142
- # Hindu Luni-Solar Calendar Formula
143
- #
144
- class Hindu < Formula
145
-
146
- # Basic Astronomical Constants for Surya-Siddhanta
147
- Tz = 0.5+75.8/360 # time difference between JulianDayNumber and Ujjain
148
- E = 588_466 - Tz # Yuga Epoch -3101-02-18T00:00:00
149
- P = 180 # Precession cycles in yuga
150
- Ep = 1_903_318 - Tz # Precession Epoch 499-01-01
151
- Ob = 24.0 / 360.0 # Obliquity of the ecliptic
152
-
153
- Grahas = {
154
- 'SS' => { # Previous / Newest
155
- :Star => 1_582_237_800.0, # 1_582_237_500 / 1_582_237_800
156
- :Sun => 4_320_000.0,
157
- :Moon => 57_753_336.0,
158
- :Mercury => 17_937_000.0,
159
- :Venus => 7_022_388.0,
160
- :Mars => 2_296_824.0,
161
- :Jupiter => 364_220.0,
162
- :Saturn => 146_564.0,
163
- :Candrocca => 488_219.0, # 488_203 / 488_219
164
- :Rahu => -232_226.0
165
- },
166
- 'SB' => {
167
- :Star => 1_582_237_828.0,
168
- :Sun => 4_320_000.0,
169
- :Moon => 57_753_336.0,
170
- :Mercury => 17_937_060.0,
171
- :Venus => 7_022_376.0,
172
- :Mars => 2_296_832.0,
173
- :Jupiter => 364_220.0,
174
- :Saturn => 146_568.0,
175
- :Candrocca => 488_203.0, # 488_199 / 488_203
176
- :Rahu => -232_238.0
177
- }
178
- }
179
-
180
- #
181
- # 日月五惑星とラーフおよびケートゥ
182
- #
183
- # @abstract
184
- class Graha
185
- include When::Ephemeris
186
- end
187
-
188
- #
189
- # 現代的“惑星”
190
- #
191
- class ModernGraha < Graha
192
-
193
- # 真黄経
194
- #
195
- # @param [Numeric] t ユリウス日
196
- #
197
- # @return [Numeric]
198
- #
199
- def true_longitude(t)
200
- @target.coords(t, @base).phi
201
- end
202
-
203
- # オブジェクトの生成
204
- #
205
- # @param [When::Ephemeris::Datum] target 天体
206
- # @param [When::Coordinates::Spatial] base 観測地
207
- #
208
- def initialize(target, base)
209
- @target = target
210
- @base = base
211
- end
212
- end
213
-
214
- #
215
- # 古典的“惑星”
216
- #
217
- # @abstract
218
- class ClassicGraha < Graha
219
-
220
- # 平均黄経
221
- #
222
- # @param [Numeric] t ユリウス日
223
- #
224
- # @return [Numeric]
225
- #
226
- def mean_longitude(t)
227
- _mean_rotation(t - E)
228
- end
229
-
230
- # 真黄経
231
- #
232
- # @param [Numeric] t ユリウス日
233
- #
234
- # @return [Numeric]
235
- #
236
- def true_longitude(t)
237
- _true_rotation(t - E)
238
- end
239
-
240
- # 平均黄経
241
- #
242
- # @param [Numeric] ahar カリユガ暦元からの経過日数
243
- #
244
- # @return [Numeric]
245
- #
246
- def _mean_rotation(ahar)
247
- @rotation * ahar / @formula.civil_days
248
- end
249
-
250
- # オブジェクトの生成
251
- #
252
- # @param [When::Ephemeris::Formula] formula 親オブジェクト
253
- # @param [Numeric] rotation ユガあたりの回転数
254
- #
255
- def initialize(formula, rotation)
256
- @formula = formula
257
- @rotation = rotation
258
- end
259
- end
260
-
261
- # 架空の“惑星” - ラーフ / 月軌道の遠地点としてのケートゥ
262
- class VirtualGraha < ClassicGraha
263
-
264
- # 平均黄経
265
- #
266
- # @param [Numeric] ahar カリユガ暦元からの経過日数
267
- #
268
- # @return [Numeric]
269
- #
270
- def _mean_rotation(ahar)
271
- super + @rotation0
272
- end
273
- alias :_true_rotation :_mean_rotation
274
-
275
- # オブジェクトの生成
276
- #
277
- # @param [When::Ephemeris::Formula] formula 親オブジェクト
278
- # @param [Numeric] rotation ユガあたりの回転数
279
- # @param [Numeric] rotation0 カリユガ暦元での回転量
280
- #
281
- def initialize(formula, rotation, rotation0)
282
- @rotation0 = rotation0 / 360.0
283
- super(formula, rotation)
284
- end
285
- end
286
-
287
- # 実在の“惑星”
288
- # @abstract
289
- class RealGraha < ClassicGraha
290
-
291
- # マンダ補正
292
- #
293
- # @param [Numeric] rot 平均近点角など / CIRCLE
294
- #
295
- # @return [Numeric]
296
- #
297
- def _manda_equation(rot)
298
- asin(@circumm * sinc(rot)) / CIRCLE
299
- end
300
-
301
- # オブジェクトの生成
302
- #
303
- # @param [When::Ephemeris::Formula] formula 親オブジェクト
304
- # @param [Numeric] rotation ユガあたりの回転数
305
- # @param [Numeric] circumm マンダ円の半径
306
- # @param [Numeric] apogee 近点黄経 / CIRCLE
307
- #
308
- def initialize(formula, rotation, circumm, apogee)
309
- @circumm = circumm / 360.0
310
- @apogee = apogee / 360.0
311
- super(formula, rotation)
312
- end
313
- end
314
-
315
- # 太陽と月 - 逆行しない“惑星”
316
- # @abstract
317
- class ConcentricGraha < RealGraha
318
-
319
- # 平均黄経
320
- #
321
- # @param [Numeric] ahar カリユガ暦元からの経過日数
322
- #
323
- # @return [Numeric]
324
- #
325
- def _mean_rotation(ahar)
326
- super + @epoch
327
- end
328
-
329
- # オブジェクトの生成
330
- #
331
- # @param [When::Ephemeris::Formula] formula 親オブジェクト
332
- # @param [Numeric] rotation ユガあたりの回転数
333
- # @param [Numeric] circumm マンダ円の半径
334
- # @param [Numeric] apogee 近点黄経 / CIRCLE
335
- # @param [Numeric] epoch カリユガ暦元での黄経 / CIRCLE
336
- #
337
- def initialize(formula, rotation, circumm, apogee, epoch)
338
- @epoch = epoch
339
- super(formula, rotation, circumm, apogee)
340
- end
341
- end
342
-
343
- # 太陽
344
- class Sun < ConcentricGraha
345
-
346
- # 真黄経
347
- #
348
- # @param [Numeric] ahar カリユガ暦元からの経過日数
349
- #
350
- # @return [Numeric]
351
- #
352
- def _true_rotation(ahar)
353
- mean = _mean_rotation(ahar)
354
- mean - _manda_equation(mean - @apogee)
355
- end
356
- end
357
-
358
- # 月
359
- class Moon < ConcentricGraha
360
-
361
- # 真黄経
362
- #
363
- # @param [Numeric] ahar カリユガ暦元からの経過日数
364
- #
365
- # @return [Numeric]
366
- #
367
- def _true_rotation(ahar)
368
- mean = _mean_rotation(ahar)
369
- mean - _manda_equation(mean - @formula.graha[:Candrocca]._mean_rotation(ahar))
370
- end
371
- end
372
-
373
- # 惑星 - 逆行するもの
374
- # @abstract
375
- class Planet < RealGraha
376
-
377
- # シグラ補正
378
- #
379
- # @param [Numeric] anomaly 平均近点角 / CIRCLE
380
- #
381
- # @return [Numeric]
382
- #
383
- def _sighra_equation(anomaly)
384
- atan2(@circums * sinc(anomaly), @circums * cosc(anomaly) + 1) / CIRCLE
385
- end
386
-
387
- # 平均シグラ
388
- #
389
- # @param [Numeric] ahar カリユガ暦元からの経過日数
390
- #
391
- # @return [Numeric]
392
- #
393
- def _mean_sighra(ahar)
394
- @sighra * ahar / @formula.civil_days
395
- end
396
-
397
- # 真黄経
398
- #
399
- # @param [Numeric] ahar カリユガ暦元からの経過日数
400
- # @param [Numeric] rotation 基準回転量 / CIRCLE
401
- #
402
- # @return [Numeric]
403
- #
404
- def _true_rotation(ahar, rotation)
405
- # first sighra correction
406
- delta = _sighra_equation(_mean_sighra(ahar) - rotation) / 2
407
-
408
- # first manda correction
409
- mean = _mean_rotation(ahar) + delta
410
- delta = _manda_equation(mean - @apogee) / 2
411
-
412
- # second manda correction
413
- mean -= delta
414
- delta = _manda_equation(mean - @apogee)
415
-
416
- # second sighra correction
417
- mean = _mean_rotation(ahar) - delta
418
- delta = _sighra_equation(_mean_sighra(ahar) - mean)
419
-
420
- # true rotation
421
- mean + delta
422
- end
423
-
424
- # オブジェクトの生成
425
- #
426
- # @param [When::Ephemeris::Formula] formula 親オブジェクト
427
- # @param [Numeric] rotation ユガあたりの回転数
428
- # @param [Numeric] circumm マンダ円の半径
429
- # @param [Numeric] apogee 近点黄経 / CIRCLE
430
- # @param [Numeric] sighra シグラ対象のカリユガあたりの回転数
431
- # @param [Numeric] circums シグラ円の半径
432
- #
433
- def initialize(formula, rotation, circumm, apogee, sighra, circums)
434
- @sighra = sighra
435
- @circums = circums / 360.0
436
- super(formula, rotation, circumm, apogee)
437
- end
438
- end
439
-
440
- # 内惑星 - 水金
441
- class InferiorPlanet < Planet
442
-
443
- # 真黄経
444
- #
445
- # @param [Numeric] t ユリウス日
446
- #
447
- # @return [Numeric]
448
- #
449
- def true_longitude(t)
450
- ahar = t - E
451
- _true_rotation(ahar, @formula.graha[:Sun]._mean_rotation(ahar))
452
- end
453
- end
454
-
455
- # 外惑星 - 火木土
456
- class SuperiorPlanet < Planet
457
-
458
- # 真黄経
459
- #
460
- # @param [Numeric] t ユリウス日
461
- #
462
- # @return [Numeric]
463
- #
464
- def true_longitude(t)
465
- ahar = t - E
466
- _true_rotation(ahar, _mean_rotation(ahar))
467
- end
468
- end
469
-
470
- #
471
- # ユガの太陽日数
472
- #
473
- # @return [Numeric]
474
- #
475
- attr_reader :civil_days
476
-
477
- # 日の出の日時
478
- #
479
- # @param [Numeric] sdn ユリウス日
480
- # @param [When::TM::TemporalPosition] sdn
481
- # @param [nil] height 太陽高度(本クラスでは使用しない)
482
- #
483
- # @return [Integer, When::TM::DateAndTime] 日の出の日時
484
- #
485
- def sunrise(sdn, height=nil)
486
- t = sdn.to_i - @long / 360.0 - 0.25
487
- p = _mean_sun(t) + P * (t - Ep) / @civil_days
488
- _to_seed_type(t - asin(tand(@lat)*tan(asin(sinc(p)*sinc(Ob)))) / CIRCLE, sdn)
489
- end
490
-
491
- # 日の入りの日時
492
- #
493
- # @param [Numeric] sdn ユリウス日
494
- # @param [When::TM::TemporalPosition] sdn
495
- # @param [nil] height 太陽高度(本クラスでは使用しない)
496
- #
497
- # @return [Integer, When::TM::DateAndTime] 日の入りの日時
498
- #
499
- def sunset(sdn, height=nil)
500
- t = sdn.to_i - @long / 360.0 + 0.25
501
- p = _mean_sun(t) + P * (t - Ep) / @civil_days
502
- _to_seed_type(t + asin(tand(@lat)*tan(asin(sinc(p)*sinc(Ob)))) / CIRCLE, sdn)
503
- end
504
-
505
- # 太陽の南中の日時
506
- #
507
- # @param [Numeric] sdn ユリウス日
508
- # @param [When::TM::TemporalPosition] sdn
509
- #
510
- # @return [Integer, When::TM::DateAndTime] 太陽の南中の日時
511
- #
512
- def sun_noon(sdn)
513
- _to_seed_type(sdn.to_i - @long / 360.0, sdn)
514
- end
515
-
516
- private
517
-
518
- # オブジェクトの正規化
519
- def _normalize(args=[], options={})
520
- @time_standard ||= 'universal'
521
- @bija ||= 'SB'
522
- super
523
- end
524
-
525
- # 9惑星オブジェクトの生成
526
- def _normalize_grahas
527
- grahas = Grahas[@bija]
528
-
529
- # ユガあたりの暦定数
530
- @sidereal_days = grahas[:Star] # 恒星日
531
- @solar_years = grahas[:Sun] # 太陽年
532
- @civil_days = @sidereal_days - @solar_years # 太陽日
533
- @sidereal_months = grahas[:Moon] # 恒星月
534
- @synodic_months = @sidereal_months - @solar_years # 朔望月
535
- @adhimasas = @synodic_months - 12 * @solar_years # 閏月
536
- @tithis = 30 * @sidereal_months # 太陰日
537
- @ksayadinas = @tithis - @civil_days # 欠日
538
-
539
- # 9惑星
540
- @graha = {}
541
- @graha.update({
542
- :Sun => Sun.new( self, @solar_years, 13+50/60.0, 77+17/60.0, -3101)
543
- }) if @formula =~ /[SL]/i
544
- @graha.update({
545
- :Moon => Moon.new( self, @sidereal_months, 31+50/60.0, 0, -28086),
546
- :Candrocca => VirtualGraha.new( self, grahas[:Candrocca], 90.0)
547
- }) if @formula =~ /[ML]/i
548
- @graha.update({
549
- :Mercury => InferiorPlanet.new(self, @solar_years, 29.0, 220+27/60.0, grahas[:Mercury], 131.5),
550
- :Venus => InferiorPlanet.new(self, @solar_years, 11.5, 79+50/60.0, grahas[:Venus], 261.0),
551
- :Mars => SuperiorPlanet.new(self, grahas[:Mars], 73.5, 130+02/60.0, @solar_years, 233.5),
552
- :Jupiter => SuperiorPlanet.new(self, grahas[:Jupiter], 32.5, 171+18/60.0, @solar_years, 71.0),
553
- :Saturn => SuperiorPlanet.new(self, grahas[:Saturn], 48.5, 236+37/60.0, @solar_years, 39.5),
554
- :Rahu => VirtualGraha.new( self, grahas[:Rahu], 180.0)
555
- }) if @formula == '2L'
556
- end
557
- end
558
- end
559
-
560
- module CalendarTypes
561
-
562
- #
563
- # Indian national solar calendar
564
- #
565
- IndianNationalSolar = [CyclicTableBased, {
566
- 'label' => 'Indian::IndianNationalSolar',
567
- 'origin_of_LSC' => 1721140,
568
- 'origin_of_MSC' => -78,
569
- 'epoch_in_CE' => 0,
570
- 'indices' => [
571
- When.Index('Indian::LunarMonth', {:unit =>12, :shift=>4}),
572
- When::Coordinates::DefaultDayIndex
573
- ],
574
- 'rule_table' => {
575
- 'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']},
576
- 'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24},
577
- 'LC' => {'Rule' =>[366, 365, 365, 365]*25},
578
- 365 => {'Length'=>[30] + [31]*5 + [30]*6},
579
- 366 => {'Length'=> [31]*6 + [30]*6}
580
- },
581
- }]
582
-
583
- #
584
- # Nanakshahi Calendar
585
- #
586
- class Nanakshahi < TableBased
587
-
588
- private
589
-
590
- #
591
- # Object Normalization
592
- #
593
- def _normalize(args=[], options={})
594
- @label ||= 'Indian::Nanakshahi'
595
- @epoch_in_CE ||= 1468
596
- @engine ||= 'Gregorian'
597
- @engine = When.Calendar(@engine)
598
- @indices ||= [
599
- When.Index('Indian::NanakshahiMonth', {:unit=>12, :shift=>4}),
600
- When::Coordinates::DefaultDayIndex
601
- ]
602
- @rule_table ||= {
603
- 365 => {'Length'=> [31]*5 + [30]*7},
604
- 366 => {'Length'=> [31]*5 + [30]*6 + [31]}
605
- }
606
- super
607
- end
608
-
609
- # first day of year
610
- #
611
- def _sdn_(date)
612
- year = +date[0] + @epoch_in_CE
613
- @engine._coordinates_to_number(year, 2, 13)
614
- end
615
- end
616
-
617
- #
618
- # Revised Bengali Calendar
619
- #
620
- class RevisedBengali < TableBased
621
-
622
- private
623
-
624
- #
625
- # Object Normalization
626
- #
627
- def _normalize(args=[], options={})
628
- @label ||= 'Indian::RevisedBengali'
629
- @epoch_in_CE ||= 593
630
- @engine ||= 'Gregorian'
631
- @engine = When.Calendar(@engine)
632
- @indices ||= [
633
- When.Index('Indian::BengaliMonth', {:unit=>12, :shift=>5}),
634
- When::Coordinates::DefaultDayIndex
635
- ]
636
- @rule_table ||= {
637
- 365 => {'Length'=> [31]*5 + [30]*7},
638
- 366 => {'Length'=> [31]*5 + [30]*5 + [31, 30]}
639
- }
640
- super
641
- end
642
-
643
- # first day of year
644
- #
645
- def _sdn_(date)
646
- year = +date[0] + @epoch_in_CE
647
- @engine._coordinates_to_number(year, 3, 13)
648
- end
649
- end
650
-
651
- #
652
- # Hindu Solar Calendar
653
- #
654
- class HinduSolar < EphemerisBasedSolar
655
-
656
- # protected
657
-
658
- # 月初の通日
659
- #
660
- # @param [Integer] m 通月
661
- #
662
- # @return [Integer] 月初の通日
663
- #
664
- def _new_month_(m)
665
- new_month_time = @formula[0].cn_to_time(m + @cycle_offset)
666
- new_month_date = (new_month_time + 0.5 + @formula[0].long/360.0).floor
667
- sunrise_time = @formula[0].sunrise(new_month_date)
668
- (sunrise_time <= new_month_time) ? new_month_date : new_month_date-1
669
- end
670
-
671
- private
672
-
673
- # オブジェクトの正規化
674
- #
675
- # @formula[0] = 位相の計算に用いる太陽の Formula
676
- # @cycle_offset = 位相のオフセット
677
- # @start_month = 暦年の最初の月
678
- #
679
- def _normalize(args=[], options={})
680
- @label ||= 'Indian::HinduSolar'
681
- @type ||= 'SBS'
682
- raise ArgumentError, "Irregal formula: #{@formula}" unless @type.upcase =~ /^(M|SS|SB)(V|S||B|H|VZ|SZ|BZ|HZ)$/
683
-
684
- @location ||= HinduLuniSolar::Location_E[$2] || HinduLuniSolar::Location_F[$1]
685
- @cycle_offset ||= HinduLuniSolar::CycleOffset[$1]
686
- @origin_of_MSC ||= -HinduLuniSolar::YearEpoch[$2]
687
- @epoch_in_CE ||= 0
688
- @start_month ||= 1 # Maysha
689
- @start_month = @start_month.to_i
690
- @cycle_offset = @cycle_offset.to_f + (@start_month - 1)
691
- formula = @formula || HinduLuniSolar::Formula[$1]
692
- if formula.kind_of?(String)
693
- formula += (formula =~ /\?/) ? '&' : '?'
694
- @formula = [When.Resource("_ep:#{formula}location=(#{@location})&formula=12S")]
695
- end
696
- @indices ||= [
697
- When.Index('Indian::SolarMonth', {:shift=>@start_month-1}),
698
- When::Coordinates::DefaultDayIndex
699
- ]
700
-
701
- super
702
- end
703
- end
704
-
705
- #
706
- # Hindu Luni-Solar Calendar
707
- #
708
- class HinduLuniSolar < EphemerisBasedLuniSolar
709
-
710
- # Calendar Type
711
- Formula = {'M'=>'Formula', 'SS'=>'Hindu?bija=SS', 'SB'=>'Hindu?bija=SB'}
712
- Location_F = {'M'=>'_co:Indian::CentralIndia', 'SS'=>'_co:Indian::Ujjain', 'SB'=>'_co:Indian::Ujjain'}
713
- Location_E = {'B'=>'_co:Indian::Dacca', 'BZ'=>'_co:Indian::Dacca', 'H'=>'_co:Iranian::Tehran', 'HZ'=>'_co:Iranian::Tehran'}
714
- CycleOffset = {'M'=>+23.25/30, 'SS'=>0.0, 'SB'=>0.0}
715
- HinduStyle = {'A'=>0, 'P'=>1, 'PX'=>2}
716
- YearEpoch = {'V'=>-58,'VZ'=>-57,'S'=>78, 'SZ'=>79, 'B'=> 593, 'BZ'=>594, 'H'=> 621, 'HZ'=> 622}
717
-
718
- # White / black month and leap month identification table
719
-
720
- #[w]/b [n]/l #0 #1 #2
721
- LEAP_MAP = {[nil, false] => [ 0, 0, 0 ],
722
- [nil, true ] => [-1.5, -1.5, -1.5],
723
- [true, false] => [+0.5, -0.5, -2.5],
724
- [true, true ] => [-1, -2, -1 ]}
725
-
726
- # protected
727
-
728
- # 月初の通日
729
- #
730
- # @param [Integer] m 通月
731
- #
732
- # @return [Integer] 月初の通日
733
- #
734
- def _new_month_(m)
735
- new_moon_time = @formula[-1].cn_to_time(m)
736
- new_moon_date = (new_moon_time + 0.5 + @formula[-1].long/360.0).floor
737
- sunrise_time = @formula[-1].sunrise(new_moon_date)
738
- (sunrise_time >= new_moon_time) ? new_moon_date : new_moon_date+1
739
- end
740
-
741
- # 年初の通月
742
- #
743
- # @param [Integer] y 年
744
- #
745
- # @return [Integer] 年初の通月
746
- #
747
- def _new_year_month_(y)
748
- (Residue.mod(y-1) {|t| _tithi_to_coordinates(t*15)[0]})[0] + 1
749
- end
750
-
751
- # 朔望日 -> 年・月・日
752
- #
753
- # tithi : 朔望日(月の位相 / (CIRCLE/30))
754
- #
755
- # @return [Array<Numeric>] ( y, m, d )
756
- # [ y - 年(Integer) ]
757
- # [ m - 月(When::Coordinates::Pair) ]
758
- # [ d - 日(Integer) ]
759
- #
760
- def _tithi_to_coordinates(tithi)
761
- m, d = tithi.divmod(30)
762
- s = [0,1,2].map {|i| (@formula[1].time_to_cn(30*(m+i)) - @cycle_offset).floor + 1 }
763
- f = s[0]==s[1]
764
- if (d >= 15.0)
765
- d -= 15
766
- b = true
767
- n = true unless @hindu_style==0
768
- f = s[1]==s[2] if @hindu_style==1
769
- end
770
- y, m = (n ? s[1] : s[0]).divmod(12)
771
- return [y, Pair._force_pair(m+1, LEAP_MAP[[b,f]][@hindu_style]), d.floor]
772
- end
773
-
774
- # 日時要素の翻訳表の取得
775
- #
776
- # @overload _ids_(date)
777
- # @param [Array<Numeric>] date ( 年 )
778
- # @return [Array<When::Coordinates::Pair>] 1年の月の配置の翻訳表
779
- #
780
- # @overload _ids_(date)
781
- # @param [Array<Numeric>] date ( 年 月 )
782
- # @return [Array<When::Coordinates::Pair>] 1月の日の配置の翻訳表
783
- # @note 月は 0 始まりの通番
784
- #
785
- def _ids_(date)
786
- y, m = date
787
- y = +y
788
- mm = _new_year_month(y)
789
- return (_table(_new_month_(mm+m.to_i)) {|i| _new_month(mm+m+i/15.0)}) if m
790
- table = (0...26).to_a.map {|i| _tithi_to_coordinates((mm+i)*15)[1]}
791
- table.pop while table[-1].trunk < 11
792
- return table
793
- end
794
-
795
- private
796
-
797
- # 日時要素の翻訳表の作成
798
- def _table(b0)
799
- table = [Pair._force_pair(0,0)]
800
- (1..16).each do |i|
801
- b1 = yield(i)
802
- case b1-b0
803
- when 0 ; table[-1] = Pair._force_pair(i-1, -2)
804
- when 1 ; table << Pair._force_pair(i, 0)
805
- when 2 ; table << Pair._force_pair(i, 0) << Pair._force_pair(i, 1)
806
- else ; raise ArgumentError, "Irregal date span: #{b1-b0}"
807
- end
808
- b0 = b1
809
- end
810
- table.pop while table[-1].trunk >= 16
811
- table.shift
812
- return table
813
- end
814
-
815
- # オブジェクトの正規化
816
- #
817
- # @formula = 位相の計算に用いる太陽・変換・月の Formula
818
- # @cycle_offset = 位相のオフセット
819
- # @hindu_style = 閏月の表現方法
820
- # @start_month = 暦年の最初の月
821
- #
822
- def _normalize(args=[], options={})
823
- @label ||= 'Indian::HinduLuniSolar'
824
- @type ||= 'SBSA'
825
- raise ArgumentError, "Irregal formula: #{@formula}" unless @type.upcase =~ /^(M|SS|SB)(V|S||B|H|VZ|SZ|BZ|HZ)(A|P|PX)$/
826
-
827
- @location ||= Location_E[$2] || Location_F[$1]
828
- @cycle_offset ||= CycleOffset[$1]
829
- @origin_of_MSC ||= -YearEpoch[$2]
830
- @hindu_style ||= HinduStyle[$3]
831
- @epoch_in_CE ||= 0
832
- @start_month ||= 5 # Chaitra
833
- @start_month = @start_month.to_i
834
- @cycle_offset = @cycle_offset.to_f + (@start_month - 5)
835
- @hindu_style = @hindu_style.to_i
836
- @origin_of_MSC = @origin_of_MSC.to_i
837
- formula = @formula || Formula[$1]
838
- if formula.kind_of?(String)
839
- formula += (formula =~ /\?/) ? '&' : '?'
840
- @formula = When.Resource(["_ep:#{formula}formula=12S",
841
- "_ep:#{formula}formula=30L->12S",
842
- "_ep:#{formula}location=(#{@location})&formula=2L"])
843
- end
844
- intercalary_month = When.Resource('_m:Indian::IntercalaryMonth::*')
845
- intercalary_day = When.Resource('_m:Indian::IntercalaryDay::*')
846
- @indices ||= [
847
- When.Index('Indian::LunarMonth', {:branch=>{-2.5 => intercalary_month[1], # 黒分
848
- -2 => intercalary_month[3], # 閏黒分
849
- -1.5 => intercalary_month[2], # 閏白分
850
- -1 => intercalary_month[3], # 閏黒分
851
- -0.5 => intercalary_month[1], # 黒分
852
- 0 => intercalary_month[0], # 白分
853
- +0.5 => intercalary_month[1]}, # 黒分
854
- :shift=>@start_month-1}),
855
- When.Index({:branch=>{-2=>intercalary_day[0], -1=>intercalary_day[1]}})
856
- ]
857
-
858
- super
859
- end
860
- end
861
- end
862
-
863
- class CalendarNote
864
- #
865
- # ヒンドゥー系の暦注
866
- #
867
- class HinduNote < self
868
-
869
- Notes = [When::BasicTypes::M17n, [
870
- "locale:[=en:, ja=ja:, hi=hi:, alias]",
871
- "names:[Hindu]",
872
-
873
- # 年の暦注 ----------------------------
874
- [When::BasicTypes::M17n,
875
- "names:[year]",
876
- [When::BasicTypes::M17n,
877
- "names:[samvatsara, 木星年=]",
878
- "[Prabhava=, プラバヴァ=, _IAST_=]", # 1
879
- "[Vibhava=, ヴィバヴァ=, _IAST_=]", # 2
880
- "[Sukha=, スカ=, _IAST_=]", # 3
881
- "[Pramoda=, プラモーダ=, _IAST_=]", # 4
882
- "[Prajāpati=, プラジャーパティ=, _IAST_=]", # 5
883
- "[Aṅgiras=, アンギラス=, _IAST_=]", # 6
884
- "[Śrīmukha=, シュリームカ=, _IAST_=]", # 7
885
- "[Bhāva=, バーヴァ=, _IAST_=]", # 8
886
- "[Yuvan=, ユヴァン=, _IAST_=]", # 9
887
- "[Dhātṛ=, ダートリ=, _IAST_=]", # 10
888
- "[Īśvara=, イーシュヴァラ=, _IAST_=]", # 11
889
- "[Bahudhānya=, バフダーニャ=, _IAST_=]", # 12
890
- "[Pramāthin=, プラマーティン=, _IAST_=]", # 13
891
- "[Vikrama=, ヴィクラマ=, _IAST_=]", # 14
892
- "[Vṛṣa=, ヴリシャ=, _IAST_=]", # 15
893
- "[Chitrabhānu=, チトラバーヌ=, _IAST_=]", # 16
894
- "[Subhānu=, スバーヌ=, _IAST_=]", # 17
895
- "[Tāraṇa=, ターラナ=, _IAST_=]", # 18
896
- "[Pārthiva=, パールティヴァ=, _IAST_=]", # 19
897
- "[Vyaya=, ヴヤヤ=, _IAST_=]", # 20
898
- "[Sarvajit=, サルヴァジト=, _IAST_=]", # 21
899
- "[Sarvadhārin=, サルヴァダーリン=, _IAST_=]", # 22
900
- "[Virodhin=, ヴィローディン=, _IAST_=]", # 23
901
- "[Vikṛta=, ヴィクリタ=, _IAST_=]", # 24
902
- "[Khara=, カラ=, _IAST_=]", # 25
903
- "[Nandana=, ナンダナ=, _IAST_=]", # 26
904
- "[Vijaya=, ヴィジャヤ=, _IAST_=]", # 27
905
- "[Jaya=, ジャヤ=, _IAST_=]", # 28
906
- "[Manmatha=, マンマタ=, _IAST_=]", # 29
907
- "[Durmukha=, ドゥルムカ=, _IAST_=]", # 30
908
- "[Hemalamba=, ヘマラムバ=, _IAST_=]", # 31
909
- "[Vilambin=, ヴィラムビン=, _IAST_=]", # 32
910
- "[Vikārin=, ヴィカーリン=, _IAST_=]", # 33
911
- "[Śārvarin=, シャールヴァリン=, _IAST_=]", # 34
912
- "[Plava=, プラヴァ=, _IAST_=]", # 35
913
- "[Śubhakṛt=, シュバクリト=, _IAST_=]", # 36
914
- "[Śobhana=, ショバナ=, _IAST_=]", # 37
915
- "[Krodhin=, クロディン=, _IAST_=]", # 38
916
- "[Viśvāvasu=, ヴィシュヴァーヴァス=, _IAST_=]", # 39
917
- "[Parābhava=, パラーバヴァ=, _IAST_=]", # 40
918
- "[Plavaṅga=, プラヴァンガ=, _IAST_=]", # 41
919
- "[Kīlaka=, キーラカ=, _IAST_=]", # 42
920
- "[Saumya=, サウムヤ=, _IAST_=]", # 43
921
- "[Sādhāraṇa=, サーダーラナ=, _IAST_=]", # 44
922
- "[Virodhakṛt=, ヴィローダクリト=, _IAST_=]", # 45
923
- "[Paridhāvin=, パリダーヴィン=, _IAST_=]", # 46
924
- "[Pramādin=, プラマーディン=, _IAST_=]", # 47
925
- "[Ānanda=, アーナンダ=, _IAST_=]", # 48
926
- "[Rākṣasa=, ラークシャサ=, _IAST_=]", # 49
927
- "[Anala=, アナラ=, _IAST_=]", # 50
928
- "[Piṅgala=, ピンガラ=, _IAST_=]", # 51
929
- "[Kālayukta=, カーラユクタ=, _IAST_=]", # 52
930
- "[Siddhārthin=, シッダールティン=, _IAST_=]", # 53
931
- "[Raudra=, ラウドラ=, _IAST_=]", # 54
932
- "[Durmati=, ドゥルマティ=, _IAST_=]", # 55
933
- "[Dundubhi=, ドゥンドゥビ=, _IAST_=]", # 56
934
- "[Rudhirodgārin=, ルディロードガーリン=, _IAST_=]", # 57
935
- "[Raktākṣin=, ラクタークシン=, _IAST_=]", # 58
936
- "[Krodhana=, クローダナ=, _IAST_=]", # 59
937
- "[Kṣaya=, クシャヤ=, _IAST_=]" # 60
938
- ]
939
- ],
940
-
941
- # 月の暦注 ----------------------------
942
- [When::BasicTypes::M17n,
943
- "names:[month]",
944
- [When::BasicTypes::M17n,
945
- "names:[Month]"
946
- ]
947
- ],
948
-
949
- # 日の暦注 ----------------------------
950
- [When::BasicTypes::M17n,
951
- "names:[day]",
952
-
953
- [When::BasicTypes::M17n,
954
- "names:[tithi=, ティティ=ja:%%<ティティ>]",
955
- "[Amavasya, 新月, _IAST_=]", # 新月
956
- "[Pratipad=en:Prathama_(day), 1日=, _IAST_=]", # 1
957
- "[Dwitiya, 2日=, _IAST_=]", # 2
958
- "[Tritiya, 3日=, _IAST_=]", # 3
959
- "[Chaturthi, 4日=, _IAST_=]", # 4
960
- "[Panchami, 5日=, _IAST_=]", # 5
961
- "[Ṣaṣṭhī=en:Shashti, 6日=, _IAST_=]", # 6
962
- "[Saptami, 7日=, _IAST_=]", # 7
963
- "[Ashtami, 8日=, _IAST_=]", # 8
964
- "[Navami, 9日=, _IAST_=]", # 9
965
- "[Dashami, 10日=, _IAST_=]", # 10
966
- "[Ekadashi, 11日=, _IAST_=]", # 11
967
- "[Dwadashi, 12日=, _IAST_=]", # 12
968
- "[Thrayodashi, 13日=, _IAST_=]", # 13
969
- "[Chaturdashi, 14日=, _IAST_=]", # 14
970
- "[Purnima, 満月, _IAST_=]" # 満月
971
- ],
972
-
973
- [When::BasicTypes::M17n,
974
- "names:[vāra=, ヴァーラ=, _IAST_=, *vara=]",
975
- "[Ravi=en:S%C5%ABrya, 日曜日, _IAST_=]",
976
- "[Soma, 月曜日, _IAST_=]",
977
- "[Maṅgala=en:Mangala, 火曜日, _IAST_=]",
978
- "[Budha, 水曜日, _IAST_=]",
979
- "[Guru, 木曜日, _IAST_=]",
980
- "[Śukra=en:Shukra, 金曜日, _IAST_=]",
981
- "[Śani=en:Shani, 土曜日, _IAST_=]"
982
- ],
983
-
984
- [When::BasicTypes::M17n,
985
- "names:[nakṣatra=, ナクシャトラ=, _IAST_=, *naksatra=]",
986
- "[Aśvinī=en:Ashvin%C4%AB, アシュヴィニー=, _IAST_=, 婁宿]", # 1
987
- "[Bharaṇī=en:Bharan%C4%AB, バラニー=, _IAST_=, 胃宿]", # 2
988
- "[Kṛttikā=en:Krittik%C4%81, クリッティカー=, _IAST_=, 昴宿]", # 3
989
- "[Rohiṇī=en:Rohini_(nakshatra), ローヒニ―=, _IAST_=, 畢宿]", # 4
990
- "[Mṛgaśiras=en:Mrigash%C4%ABrsha, ムリガシラス=, _IAST_=, 觜宿]", # 5
991
- "[Ārdrā=en:Ardra_(nakshatra), アールドラー=, _IAST_=, 參宿]", # 6
992
- "[Punarvasu=en:Punarvasu, プナルヴァス=, _IAST_=, 井宿]", # 7
993
- "[Puṣya=en:Pushya, プシュヤ=, _IAST_=, 鬼宿]", # 8
994
- "[Aśleṣā=en:%C4%80shlesh%C4%81, アーシュレーシャー=, _IAST_=, 柳宿]", # 9
995
- "[Maghā=en:Magh%C4%81, マガー=, _IAST_=, 星宿]", # 10
996
- "[Pū. Phalguṇī=en:P%C5%ABrva_Phalgun%C4%AB, P. パールグニー=, _IAST_=, 張宿]", # 11
997
- "[U. Phalguṇī=en:Uttara_Phalgun%C4%AB, U. パールグニー=, _IAST_=, 翼宿]", # 12
998
- "[Hasta=en:Nakshatra#Divisions, ハスタ=, _IAST_=, 軫宿]", # 13
999
- "[Citrā=en:Nakshatra#Divisions, チトラー=, _IAST_=, 角宿]", # 14
1000
- "[Svāti=en:Sv%C4%81t%C4%AB, スヴァーティー=, _IAST_=, 亢宿]", # 15
1001
- "[Viśākha=en:Vish%C4%81kh%C4%81, ヴィシャーカー=, _IAST_=, 氐宿]", # 16
1002
- "[Anurādhā=en:Anur%C4%81dh%C4%81, アヌラーダー=, _IAST_=, 房宿]", # 17
1003
- "[Jyeṣṭha=en:Jyeshtha, ジェーシュター=, _IAST_=, 心宿]", # 18
1004
- "[Mūla=en:Mula_(astrology), ムーラ=, _IAST_=, 尾宿]", # 19
1005
- "[Pū. āṣāḍha=en:P%C5%ABrva_Ash%C4%81dh%C4%81, P. アーシャーダー=, _IAST_=, 箕宿]", # 20
1006
- "[U. āṣāḍha=en:Uttara_Ash%C4%81dh%C4%81, U. アーシャーダー=, _IAST_=, 斗宿]", # 21
1007
- "[Śravaṇa=en:Shravana, シュラヴァナ=, _IAST_=, 女宿]", # 22
1008
- "[Śraviṣṭhā=en:Dhanishta, ダニシュター=, _IAST_=, 虛宿]", # 23
1009
- "[Śatabhiṣak=en:Shatabhish%C4%81, シャタビシャジュ=, _IAST_=, 危宿]", # 24
1010
- "[Pū. Bhādrapadā=en:P%C5%ABrva_Bh%C4%81drapad%C4%81,P. バードラパダー=, _IAST_=, 室宿]", # 25
1011
- "[U. Bhādrapadā=en:Uttara_Bh%C4%81drapad%C4%81, U. バードラパダー=, _IAST_=, 壁宿]", # 26
1012
- "[Revatī=en:Revati_(nakshatra), レーヴァティー=, _IAST_=, 奎宿]" # 27
1013
- ],
1014
-
1015
- [When::BasicTypes::M17n,
1016
- "names:[yoga=, ヨーガ=, _IAST_=]",
1017
- "[Viṣkambha=, ヴィシュカムバ=, _IAST_=]", # 1
1018
- "[Prīti=, プリーティ=, _IAST_=]", # 2
1019
- "[Āyuśmān=, アーユシュマー=, _IAST_=]", # 3
1020
- "[Saubhāgya=, サウバーギャ=, _IAST_=]", # 4
1021
- "[Śobhana=, ショーバナ=, _IAST_=]", # 5
1022
- "[Atigaṇḍa=, アティガンダ=, _IAST_=]", # 6
1023
- "[Sukarma=, スカルマ=, _IAST_=]", # 7
1024
- "[Dhṛti, ドゥリティ=, _IAST_=]", # 8
1025
- "[Śūla=, シューラ=, _IAST_=]", # 9
1026
- "[Gaṇḍa=, ガンダ=, _IAST_=]", # 10
1027
- "[Vṛddhi=, ヴリッディ=, _IAST_=]", # 11
1028
- "[Dhruva=, ドルヴァ=, _IAST_=]", # 12
1029
- "[Vyāghāta=, ヴヤーガータ=, _IAST_=]", # 13
1030
- "[Harṣaṇa=, ハルシャナ=, _IAST_=]", # 14
1031
- "[Vajra=, ヴァジュラ=, _IAST_=]", # 15
1032
- "[Siddhi=, シッディ=, _IAST_=]", # 16
1033
- "[Vyatīpāta=, ヴヤティーパータ=, _IAST_=]", # 17
1034
- "[Varīyas=, ヴァリーヤス=, _IAST_=]", # 18
1035
- "[Parigha=, パリガ=, _IAST_=]", # 19
1036
- "[Śiva=, シヴァ=, _IAST_=]", # 20
1037
- "[Siddha=, シッダ=, _IAST_=]", # 21
1038
- "[Sādhya=, サーディヤ=, _IAST_=]", # 22
1039
- "[Śubha=, シュバ=, _IAST_=]", # 23
1040
- "[Śukla=, シュクラ=, _IAST_=]", # 24
1041
- "[Brahman=, ブラフマン=, _IAST_=]", # 25
1042
- "[Māhendra=, マーヘンドラ=, _IAST_=]", # 26
1043
- "[Vaidhṛti=, ヴァイドリティ=, _IAST_=]" # 27
1044
- ],
1045
-
1046
- [When::BasicTypes::M17n,
1047
- "names:[Karaṇa=, カラナ=, _IAST_=, *karana]",
1048
- "[Bava=, バヴァ=, _IAST_=]", # 1
1049
- "[Bālava=, バーラヴァ=, _IAST_=]", # 2
1050
- "[Kaulava=, カウラヴァ=, _IAST_=]", # 3
1051
- "[Taitila=, タイティラ=, _IAST_=]", # 4
1052
- "[Gara=, ガラ=, _IAST_=]", # 5
1053
- "[Vaṇija=, ヴァニジュ=, _IAST_=]", # 6
1054
- "[Viṣṭi=, ヴィシュティ=, _IAST_=]", # 7
1055
- "[Kiṃtughna=, キンストゥグナ=, _IAST_=]", # A
1056
- "[Śakuni=, シャクニ=, _IAST_=]", # B
1057
- "[Catuṣpāda=, チャトシュパダ=, _IAST_=]", # C
1058
- "[Nāga=, ナーガ=, _IAST_=]" # D
1059
- ]
1060
- ]
1061
- ]]
1062
-
1063
- NoteConsts = {
1064
- 'tithi' => {
1065
- :formula => 15,
1066
- :range => (-1..2),
1067
- :index => [ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
1068
- 15,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1069
- },
1070
- 'naksatra' => {
1071
- :formula => '27M',
1072
- :range => (-1..2),
1073
- :index => (0...27).to_a
1074
- },
1075
- 'yoga' => {
1076
- :formula => '27M+27S',
1077
- :range => (-1..2),
1078
- :index => (0...27).to_a
1079
- },
1080
- 'karana' => {
1081
- :formula => 30,
1082
- :range => (-2..3),
1083
- :index => [7] + (0...7).to_a * 8 + [8,9,10]
1084
- }
1085
- }
1086
-
1087
- #
1088
- # pancanga 計算に必要となる情報をまとめた内部クラス
1089
- #
1090
- class Dates
1091
-
1092
- # @private
1093
- attr_reader :o_date, :l_date, :root, :formula, :iri, :rises
1094
-
1095
- # 初期設定
1096
- # @private
1097
- def initialize(date)
1098
- @o_date = date
1099
- clock = date.clock
1100
- frame = date.frame if date.frame.kind_of?(When::CalendarTypes::HinduLuniSolar)
1101
- @l_date = (frame || When.Calendar('HinduLuniSolar?note=HinduNote')).jul_trans(date.to_i, {:clock=>'+05:30'})
1102
- @root = When.CalendarNote('HinduNote/Notes')['day']
1103
- @formula = @l_date.frame.formula[-1]
1104
- @iri = @formula.iri
1105
- @rises = [@formula.sunrise(@l_date), @formula.sunrise(@l_date+When.Duration('P1D'))]
1106
- end
1107
-
1108
- # その他のメソッドは @l_date に移譲する
1109
- def method_missing(name, *args, &block)
1110
- self.class.module_eval %Q{
1111
- def #{name}(*args, &block)
1112
- @l_date.send("#{name}", *args, &block)
1113
- end
1114
- } unless When::Parts::MethodCash.escape(name)
1115
- @l_date.send(name, *args, &block)
1116
- end
1117
- end
1118
-
1119
- #
1120
- # 任意の暦をインド太陰太陽暦日に変換
1121
- # @private
1122
- def _to_date_for_note(date)
1123
- Dates.new(date)
1124
- end
1125
-
1126
- #
1127
- # 木星年
1128
- #
1129
- # @param [Dates] dates
1130
- #
1131
- # @return [When::BasicTypes::M17n] 木星年の名称
1132
- #
1133
- # see {http://en.wikipedia.org/wiki/Samvatsara Samvatsara}
1134
- #
1135
- def samvatsara(dates)
1136
- year_kali = dates.l_date.most_significant_coordinate + dates.l_date.frame._diff_to_CE + 3101
1137
- year_mod = year_kali >= jovian ? (year_kali + 12) % 60 :
1138
- ((year_kali * 211 - 108).div(18000) + year_kali + 26) % 60
1139
- When.CalendarNote('HinduNote/Notes')['year']['samvatsara'][year_mod]
1140
- end
1141
-
1142
- #
1143
- # 木星年の計算方式に“South”を適用開始する年
1144
- #
1145
- # @return [Integer] 年(カリユガ紀元)
1146
- #
1147
- def jovian
1148
- return @jovian if @jovian.kind_of?(Integer)
1149
- @jovian = @jovian ? @jovian.to_i : 4009
1150
- end
1151
-
1152
- #
1153
- # ヴァーラ (七曜)
1154
- #
1155
- # @param [Dates] dates
1156
- #
1157
- # @return [Array<When::TM::TemporalPosition>] 日の出の時刻をイベント時刻とする
1158
- #
1159
- def vara(dates)
1160
- rise = dates.rises[0]
1161
- rise.events = [dates.root['vara'][(rise.to_i+1) % 7]]
1162
- ['V:-', rise]
1163
- end
1164
-
1165
- #
1166
- # ヴァーラ以外
1167
- #
1168
-
1169
- # 当該日付中でティティが変わる日時
1170
- # @method tithi(dates)
1171
- # @param [Dates] dates
1172
- # @return [Array<When::TM::TemporalPosition>] イベント日時
1173
-
1174
- # 当該日付中でナクシャトラが変わる日時
1175
- # @method naksatra(dates)
1176
- # @param [Dates] dates
1177
- # @return [Array<When::TM::TemporalPosition>] イベント日時
1178
-
1179
- # 当該日付中でヨーガが変わる日時
1180
- # @method yoga(dates)
1181
- # @param [Dates] dates
1182
- # @return [Array<When::TM::TemporalPosition>] イベント日時
1183
-
1184
- # 当該日付中でカラナが変わる日時
1185
- # @method karana(dates)
1186
- # @param [Dates] dates
1187
- # @return [Array<When::TM::TemporalPosition>] イベント日時
1188
- #
1189
-
1190
- # @private
1191
- NoteConsts.keys.each do |key|
1192
- module_eval %Q{
1193
- def #{key}(dates)
1194
- pancanga(dates, '#{key}').map {|event| ['#{key[0..0].upcase}:-', event]}
1195
- end
1196
- }
1197
- end
1198
-
1199
- #
1200
- # ヴァーラ以外のイベント日時
1201
- #
1202
- # @param [Dates] dates
1203
- # @param [String] key 'tithi', 'naksatra', 'yoga', 'karana' のいずれか
1204
- # @return [Array<When::TM::TemporalPosition>] イベント日時
1205
- #
1206
- def pancanga(dates, key)
1207
- pattern = NoteConsts[key]
1208
- note = dates.root[key]
1209
- if pattern[:formula].kind_of?(Numeric)
1210
- factor = pattern[:formula].to_f
1211
- formula = dates.formula
1212
- else
1213
- factor = 1.0
1214
- formula = When.Resource(dates.iri.sub(/formula=2L/, "formula=#{pattern[:formula]}"))
1215
- end
1216
- cn = (formula.time_to_cn(dates.l_date) * factor).floor
1217
- events = []
1218
- pattern[:range].each do |i|
1219
- event = formula._to_seed_type(formula.cn_to_time((cn+i)/factor), dates.l_date)
1220
- break if +event >= +dates.rises[1]
1221
- next if +event < +dates.rises[0]
1222
- event.events = [note[pattern[:index][(cn+i) % pattern[:index].length]]]
1223
- events << event
1224
- end
1225
- events
1226
- end
1227
- end
1228
-
1229
- #
1230
- # 日の出の九惑星の位置まで計算
1231
- #
1232
- class HinduNoteDetailed < HinduNote
1233
- #
1234
- # ヴァーラ (七曜)と九惑星の位置
1235
- #
1236
- # @param [Dates] dates
1237
- # @return [Array<When::TM::TemporalPosition, Hash{ 惑星シンボル=>惑星の真黄経 }>]
1238
- # 日の出の時刻をイベント時刻とし、その時刻での九惑星の位置を計算
1239
- #
1240
- def vara(dates)
1241
- rise = dates.rises[0]
1242
- rise.events = [dates.root['vara'][(rise.to_i+1) % 7]]
1243
- t = dates.formula.is_dynamical ? +rise : rise.to_f
1244
- [['V:-', rise], dates.formula.graha.keys.inject({}) {|h,p|
1245
- h.store(p, dates.formula.graha[p].true_longitude(t))
1246
- h
1247
- }]
1248
- end
1249
- end
1250
- end
1251
- 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
+ require 'when_exe/locales/iast'
9
+
10
+ module When
11
+ class BasicTypes::M17n
12
+
13
+ Indian = [self, [
14
+ "locale:[=en:, ja=ja:, hi=hi:, alias]",
15
+ "names:[Indian=]",
16
+ "[IndianNationalSolar=en:Indian_national_calendar, インド国定暦, era:SE=]",
17
+ "[Nanakshahi=en:Nanakshahi_calendar, ナーナク暦=]",
18
+ "[RevisedBengali=en:Bengali_calendar, 改訂ベンガル暦=]",
19
+ "[HinduSolar=en:Hindu_calendar, インド太陽暦=ja:%%<ヒンドゥー暦>]",
20
+ "[HinduLuniSolar=en:Hindu_calendar, インド太陰太陽暦=ja:%%<ヒンドゥー暦>]",
21
+
22
+ [self,
23
+ "names:[IntercalaryMonth=en:Intercalation, 閏月]",
24
+ "[%s Śuklapakṣa=, %s 白分=, _IAST_=]",
25
+ "[%s Kṛṣṇapakṣa=, %s 黒分=, _IAST_=]",
26
+ "[adhika %s Śuklapakṣa=, 閏%s 白分=, _IAST_=]",
27
+ "[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, _IAST_=]"
28
+ ],
29
+
30
+ [self,
31
+ "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
32
+ "[%s and next day=, %sと翌日=]",
33
+ "[Intercalary %s=, 重%s=]"
34
+ ],
35
+
36
+ [self,
37
+ "names:[LunarMonth=, 太陰月=ja:%%<月_(暦)>]",
38
+ "[Mārgaśīra=en:Margashirsha, マールガシールシャ=, _IAST_=]",
39
+ "[Pauṣa=en:Pausha, パウシャ=, _IAST_=]",
40
+ "[Māgha=en:Maagha, マーガ=, _IAST_=]",
41
+ "[Phālguna=en:Phalguna, パールグナ=, _IAST_=]",
42
+ "[Caitra=en:Chaitra, チャイトラ=, _IAST_=]",
43
+ "[Vaiśākha=en:Vaisakha, ヴァイシャーカ=, _IAST_=]",
44
+ "[Jyaiṣṭha=en:Jyeshta, ジャイシュタ=, _IAST_=]",
45
+ "[Āṣāḍha=en:Aashaadha, アーシャーダ=, _IAST_=]",
46
+ "[Śrāvaṇa=en:Shraavana, シュラーヴァナ=, _IAST_=]",
47
+ "[Bhādrapada=en:Bhadrapada, バードラパダ=, _IAST_=]",
48
+ "[Āśvina=en:Ashwin, アーシュヴィナ=, _IAST_=]",
49
+ "[Kārttika=en:Kartika_(month), カールッティカ=, _IAST_=]"
50
+ ],
51
+
52
+ [self,
53
+ "names:[SolarMonth=, 太陽月=ja:%%<月_(暦)>]",
54
+ "[Maysha=, 白羊宮, _IAST_=]",
55
+ "[Vrushabha=, 金牛宮, _IAST_=]",
56
+ "[Mithuna=, 双児宮, _IAST_=]",
57
+ "[Karka=, 巨蟹宮, _IAST_=]",
58
+ "[Simha=, 獅子宮, _IAST_=]",
59
+ "[Kanya=, 処女宮, _IAST_=]",
60
+ "[Tula=, 天秤宮, _IAST_=]",
61
+ "[Vrushchika=, 天蝎宮, _IAST_=]",
62
+ "[Dhanu=, 人馬宮, _IAST_=]",
63
+ "[Makar=, 磨羯宮, _IAST_=]",
64
+ "[Kumbha=, 宝瓶宮, _IAST_=]",
65
+ "[Meena=, 双魚宮, _IAST_=]"
66
+ ],
67
+
68
+ [self,
69
+ "names:[NanakshahiMonth=, 太陽月=ja:%%<月_(暦)>]",
70
+ "[Maghar=en:Maghar_(month) ]",
71
+ "[Poh ]",
72
+ "[Magh=en:Magh_(Sikh_calendar)]",
73
+ "[Phagun ]",
74
+ "[Chet=en:Chet_(month) ]",
75
+ "[Vaisakh ]",
76
+ "[Jeth ]",
77
+ "[Harh ]",
78
+ "[Sawan ]",
79
+ "[Bhadon ]",
80
+ "[Assu ]",
81
+ "[Katak ]"
82
+ ],
83
+
84
+ [self,
85
+ "names:[BengaliMonth=, 太陽月=ja:%%<月_(暦)>]",
86
+ "[Ogrôhayôn=]",
87
+ "[Poush= ]",
88
+ "[Magh= ]",
89
+ "[Falgun= ]",
90
+ "[Chôitrô= ]",
91
+ "[Bôishakh= ]",
92
+ "[Jyôishţhô=]",
93
+ "[Ashaŗh= ]",
94
+ "[Shrabôn= ]",
95
+ "[Bhadrô= ]",
96
+ "[Ashbin= ]",
97
+ "[Kartik= ]"
98
+ ]
99
+ ]]
100
+ end
101
+
102
+ module Coordinates
103
+
104
+ # Location of cities in India
105
+ Indian = [When::BasicTypes::M17n, [
106
+ "locale:[=en:, ja=ja:, alias]",
107
+ "names:[Indian]",
108
+ [Spatial, "long:+82.5", "lat:N23.11", "label:[CentralIndia, インド中部]" ],
109
+ [Spatial, "long:+82.5", "lat:+29.0", "label:[NorthIndia, インド北部]" ],
110
+ [Spatial, "long:+78.0", "lat:+27.2", "label:[Agra, アーグラ]" ],
111
+ [Spatial, "long:+72.6", "lat:+23.0", "label:[Ahmedabad, アフマダーバード]" ],
112
+ [Spatial, "long:+74.6", "lat:+26.5", "label:[Ajmer, アジメール]" ],
113
+ [Spatial, "long:+78.1", "lat:+27.9", "label:[Aligarh, アリーガル]" ],
114
+ [Spatial, "long:+74.9", "lat:+31.6", "label:[Amritsar, アムリトサル]" ],
115
+ [Spatial, "long:+77.6", "lat:+13.0", "label:[Bangalore, バンガロール]" ],
116
+ [Spatial, "long:+85.8", "lat:+20.2", "label:[Bhuvaneswar, ブヴァネーシュヴァル]"],
117
+ [Spatial, "long:+80.3", "lat:+13.1", "label:[Chennai, チェンナイ, Madras]" ],
118
+ [Spatial, "long:+79.9", "lat: +6.9", "label:[Colombo, コロンボ]" ],
119
+ [Spatial, "long:+90.4", "lat:+23.7", "label:[Dacca, ダッカ]" ],
120
+ [Spatial, "long:+77.2", "lat:+28.6", "label:[Delhi, デリー]" ],
121
+ [Spatial, "long:+78.5", "lat:+17.4", "label:[Hyderabad, ハイデラバード]" ],
122
+ [Spatial, "long:+75.8", "lat:+26.9", "label:[Jaipur, ジャイプル]" ],
123
+ [Spatial, "long:+85.2", "lat:+27.7", "label:[Kathmandu, カトマンズ]" ],
124
+ [Spatial, "long:+76.2", "lat:+10.0", "label:[Kochi, コーチ, Cochin]" ],
125
+ [Spatial, "long:+88.4", "lat:+22.6", "label:[Kolkata, コルカタ, Calcutta]" ],
126
+ [Spatial, "long:+74.3", "lat:+31.6", "label:[Lahor, ラホール]" ],
127
+ [Spatial, "long:+77.7", "lat:+27.5", "label:[Mathura, マトゥラー]" ],
128
+ [Spatial, "long:+72.8", "lat:+19.0", "label:[Mumbai, ムンバイ, Bombay]" ],
129
+ [Spatial, "long:+76.6", "lat:+12.3", "label:[Mysore, マイソール]" ],
130
+ [Spatial, "long:+85.1", "lat:+25.6", "label:[Patna, パトナ]" ],
131
+ [Spatial, "long:+73.9", "lat:+18.5", "label:[Pune, プネー]" ],
132
+ [Spatial, "long:+74.8", "lat:+34.1", "label:[Srinagar, シュリーナガル]" ],
133
+ [Spatial, "long:+77.0", "lat: +8.5", "label:[Thiruvananthapuram, ティルヴァナンタプラム, Trivandrum]"],
134
+ [Spatial, "long:+83.0", "lat:+25.3", "label:[Varanasi, ワーラーナシー]" ],
135
+ [Spatial, "long:+75.8", "lat:+23.2", "label:[Ujjain, ウッジャイン]" ]
136
+ ]]
137
+ end
138
+
139
+ module Ephemeris
140
+
141
+ #
142
+ # Hindu Luni-Solar Calendar Formula
143
+ #
144
+ class Hindu < Formula
145
+
146
+ # Basic Astronomical Constants for Surya-Siddhanta
147
+ Tz = 0.5+75.8/360 # time difference between JulianDayNumber and Ujjain
148
+ E = 588_466 - Tz # Yuga Epoch -3101-02-18T00:00:00
149
+ P = 180 # Precession cycles in yuga
150
+ Ep = 1_903_318 - Tz # Precession Epoch 499-01-01
151
+ Ob = 24.0 / 360.0 # Obliquity of the ecliptic
152
+
153
+ Grahas = {
154
+ 'SS' => { # Previous / Newest
155
+ :Star => 1_582_237_800.0, # 1_582_237_500 / 1_582_237_800
156
+ :Sun => 4_320_000.0,
157
+ :Moon => 57_753_336.0,
158
+ :Mercury => 17_937_000.0,
159
+ :Venus => 7_022_388.0,
160
+ :Mars => 2_296_824.0,
161
+ :Jupiter => 364_220.0,
162
+ :Saturn => 146_564.0,
163
+ :Candrocca => 488_219.0, # 488_203 / 488_219
164
+ :Rahu => -232_226.0
165
+ },
166
+ 'SB' => {
167
+ :Star => 1_582_237_828.0,
168
+ :Sun => 4_320_000.0,
169
+ :Moon => 57_753_336.0,
170
+ :Mercury => 17_937_060.0,
171
+ :Venus => 7_022_376.0,
172
+ :Mars => 2_296_832.0,
173
+ :Jupiter => 364_220.0,
174
+ :Saturn => 146_568.0,
175
+ :Candrocca => 488_203.0, # 488_199 / 488_203
176
+ :Rahu => -232_238.0
177
+ }
178
+ }
179
+
180
+ #
181
+ # 日月五惑星とラーフおよびケートゥ
182
+ #
183
+ # @abstract
184
+ class Graha
185
+ include When::Ephemeris
186
+ end
187
+
188
+ #
189
+ # 現代的“惑星”
190
+ #
191
+ class ModernGraha < Graha
192
+
193
+ # 真黄経
194
+ #
195
+ # @param [Numeric] t ユリウス日
196
+ #
197
+ # @return [Numeric]
198
+ #
199
+ def true_longitude(t)
200
+ @target.coords(t, @base).phi
201
+ end
202
+
203
+ # オブジェクトの生成
204
+ #
205
+ # @param [When::Ephemeris::Datum] target 天体
206
+ # @param [When::Coordinates::Spatial] base 観測地
207
+ #
208
+ def initialize(target, base)
209
+ @target = target
210
+ @base = base
211
+ end
212
+ end
213
+
214
+ #
215
+ # 古典的“惑星”
216
+ #
217
+ # @abstract
218
+ class ClassicGraha < Graha
219
+
220
+ # 平均黄経
221
+ #
222
+ # @param [Numeric] t ユリウス日
223
+ #
224
+ # @return [Numeric]
225
+ #
226
+ def mean_longitude(t)
227
+ _mean_rotation(t - E)
228
+ end
229
+
230
+ # 真黄経
231
+ #
232
+ # @param [Numeric] t ユリウス日
233
+ #
234
+ # @return [Numeric]
235
+ #
236
+ def true_longitude(t)
237
+ _true_rotation(t - E)
238
+ end
239
+
240
+ # 平均黄経
241
+ #
242
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
243
+ #
244
+ # @return [Numeric]
245
+ #
246
+ def _mean_rotation(ahar)
247
+ @rotation * ahar / @formula.civil_days
248
+ end
249
+
250
+ # オブジェクトの生成
251
+ #
252
+ # @param [When::Ephemeris::Formula] formula 親オブジェクト
253
+ # @param [Numeric] rotation ユガあたりの回転数
254
+ #
255
+ def initialize(formula, rotation)
256
+ @formula = formula
257
+ @rotation = rotation
258
+ end
259
+ end
260
+
261
+ # 架空の“惑星” - ラーフ / 月軌道の遠地点としてのケートゥ
262
+ class VirtualGraha < ClassicGraha
263
+
264
+ # 平均黄経
265
+ #
266
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
267
+ #
268
+ # @return [Numeric]
269
+ #
270
+ def _mean_rotation(ahar)
271
+ super + @rotation0
272
+ end
273
+ alias :_true_rotation :_mean_rotation
274
+
275
+ # オブジェクトの生成
276
+ #
277
+ # @param [When::Ephemeris::Formula] formula 親オブジェクト
278
+ # @param [Numeric] rotation ユガあたりの回転数
279
+ # @param [Numeric] rotation0 カリユガ暦元での回転量
280
+ #
281
+ def initialize(formula, rotation, rotation0)
282
+ @rotation0 = rotation0 / 360.0
283
+ super(formula, rotation)
284
+ end
285
+ end
286
+
287
+ # 実在の“惑星”
288
+ # @abstract
289
+ class RealGraha < ClassicGraha
290
+
291
+ # マンダ補正
292
+ #
293
+ # @param [Numeric] rot 平均近点角など / CIRCLE
294
+ #
295
+ # @return [Numeric]
296
+ #
297
+ def _manda_equation(rot)
298
+ asin(@circumm * sinc(rot)) / CIRCLE
299
+ end
300
+
301
+ # オブジェクトの生成
302
+ #
303
+ # @param [When::Ephemeris::Formula] formula 親オブジェクト
304
+ # @param [Numeric] rotation ユガあたりの回転数
305
+ # @param [Numeric] circumm マンダ円の半径
306
+ # @param [Numeric] apogee 近点黄経 / CIRCLE
307
+ #
308
+ def initialize(formula, rotation, circumm, apogee)
309
+ @circumm = circumm / 360.0
310
+ @apogee = apogee / 360.0
311
+ super(formula, rotation)
312
+ end
313
+ end
314
+
315
+ # 太陽と月 - 逆行しない“惑星”
316
+ # @abstract
317
+ class ConcentricGraha < RealGraha
318
+
319
+ # 平均黄経
320
+ #
321
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
322
+ #
323
+ # @return [Numeric]
324
+ #
325
+ def _mean_rotation(ahar)
326
+ super + @epoch
327
+ end
328
+
329
+ # オブジェクトの生成
330
+ #
331
+ # @param [When::Ephemeris::Formula] formula 親オブジェクト
332
+ # @param [Numeric] rotation ユガあたりの回転数
333
+ # @param [Numeric] circumm マンダ円の半径
334
+ # @param [Numeric] apogee 近点黄経 / CIRCLE
335
+ # @param [Numeric] epoch カリユガ暦元での黄経 / CIRCLE
336
+ #
337
+ def initialize(formula, rotation, circumm, apogee, epoch)
338
+ @epoch = epoch
339
+ super(formula, rotation, circumm, apogee)
340
+ end
341
+ end
342
+
343
+ # 太陽
344
+ class Sun < ConcentricGraha
345
+
346
+ # 真黄経
347
+ #
348
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
349
+ #
350
+ # @return [Numeric]
351
+ #
352
+ def _true_rotation(ahar)
353
+ mean = _mean_rotation(ahar)
354
+ mean - _manda_equation(mean - @apogee)
355
+ end
356
+ end
357
+
358
+ # 月
359
+ class Moon < ConcentricGraha
360
+
361
+ # 真黄経
362
+ #
363
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
364
+ #
365
+ # @return [Numeric]
366
+ #
367
+ def _true_rotation(ahar)
368
+ mean = _mean_rotation(ahar)
369
+ mean - _manda_equation(mean - @formula.graha[:Candrocca]._mean_rotation(ahar))
370
+ end
371
+ end
372
+
373
+ # 惑星 - 逆行するもの
374
+ # @abstract
375
+ class Planet < RealGraha
376
+
377
+ # シグラ補正
378
+ #
379
+ # @param [Numeric] anomaly 平均近点角 / CIRCLE
380
+ #
381
+ # @return [Numeric]
382
+ #
383
+ def _sighra_equation(anomaly)
384
+ atan2(@circums * sinc(anomaly), @circums * cosc(anomaly) + 1) / CIRCLE
385
+ end
386
+
387
+ # 平均シグラ
388
+ #
389
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
390
+ #
391
+ # @return [Numeric]
392
+ #
393
+ def _mean_sighra(ahar)
394
+ @sighra * ahar / @formula.civil_days
395
+ end
396
+
397
+ # 真黄経
398
+ #
399
+ # @param [Numeric] ahar カリユガ暦元からの経過日数
400
+ # @param [Numeric] rotation 基準回転量 / CIRCLE
401
+ #
402
+ # @return [Numeric]
403
+ #
404
+ def _true_rotation(ahar, rotation)
405
+ # first sighra correction
406
+ delta = _sighra_equation(_mean_sighra(ahar) - rotation) / 2
407
+
408
+ # first manda correction
409
+ mean = _mean_rotation(ahar) + delta
410
+ delta = _manda_equation(mean - @apogee) / 2
411
+
412
+ # second manda correction
413
+ mean -= delta
414
+ delta = _manda_equation(mean - @apogee)
415
+
416
+ # second sighra correction
417
+ mean = _mean_rotation(ahar) - delta
418
+ delta = _sighra_equation(_mean_sighra(ahar) - mean)
419
+
420
+ # true rotation
421
+ mean + delta
422
+ end
423
+
424
+ # オブジェクトの生成
425
+ #
426
+ # @param [When::Ephemeris::Formula] formula 親オブジェクト
427
+ # @param [Numeric] rotation ユガあたりの回転数
428
+ # @param [Numeric] circumm マンダ円の半径
429
+ # @param [Numeric] apogee 近点黄経 / CIRCLE
430
+ # @param [Numeric] sighra シグラ対象のカリユガあたりの回転数
431
+ # @param [Numeric] circums シグラ円の半径
432
+ #
433
+ def initialize(formula, rotation, circumm, apogee, sighra, circums)
434
+ @sighra = sighra
435
+ @circums = circums / 360.0
436
+ super(formula, rotation, circumm, apogee)
437
+ end
438
+ end
439
+
440
+ # 内惑星 - 水金
441
+ class InferiorPlanet < Planet
442
+
443
+ # 真黄経
444
+ #
445
+ # @param [Numeric] t ユリウス日
446
+ #
447
+ # @return [Numeric]
448
+ #
449
+ def true_longitude(t)
450
+ ahar = t - E
451
+ _true_rotation(ahar, @formula.graha[:Sun]._mean_rotation(ahar))
452
+ end
453
+ end
454
+
455
+ # 外惑星 - 火木土
456
+ class SuperiorPlanet < Planet
457
+
458
+ # 真黄経
459
+ #
460
+ # @param [Numeric] t ユリウス日
461
+ #
462
+ # @return [Numeric]
463
+ #
464
+ def true_longitude(t)
465
+ ahar = t - E
466
+ _true_rotation(ahar, _mean_rotation(ahar))
467
+ end
468
+ end
469
+
470
+ #
471
+ # ユガの太陽日数
472
+ #
473
+ # @return [Numeric]
474
+ #
475
+ attr_reader :civil_days
476
+
477
+ # 日の出の日時
478
+ #
479
+ # @param [Numeric] sdn ユリウス日
480
+ # @param [When::TM::TemporalPosition] sdn
481
+ # @param [nil] height 太陽高度(本クラスでは使用しない)
482
+ #
483
+ # @return [Integer, When::TM::DateAndTime] 日の出の日時
484
+ #
485
+ def sunrise(sdn, height=nil)
486
+ t = sdn.to_i - @long / 360.0 - 0.25
487
+ p = _mean_sun(t) + P * (t - Ep) / @civil_days
488
+ _to_seed_type(t - asin(tand(@lat)*tan(asin(sinc(p)*sinc(Ob)))) / CIRCLE, sdn)
489
+ end
490
+
491
+ # 日の入りの日時
492
+ #
493
+ # @param [Numeric] sdn ユリウス日
494
+ # @param [When::TM::TemporalPosition] sdn
495
+ # @param [nil] height 太陽高度(本クラスでは使用しない)
496
+ #
497
+ # @return [Integer, When::TM::DateAndTime] 日の入りの日時
498
+ #
499
+ def sunset(sdn, height=nil)
500
+ t = sdn.to_i - @long / 360.0 + 0.25
501
+ p = _mean_sun(t) + P * (t - Ep) / @civil_days
502
+ _to_seed_type(t + asin(tand(@lat)*tan(asin(sinc(p)*sinc(Ob)))) / CIRCLE, sdn)
503
+ end
504
+
505
+ # 太陽の南中の日時
506
+ #
507
+ # @param [Numeric] sdn ユリウス日
508
+ # @param [When::TM::TemporalPosition] sdn
509
+ #
510
+ # @return [Integer, When::TM::DateAndTime] 太陽の南中の日時
511
+ #
512
+ def sun_noon(sdn)
513
+ _to_seed_type(sdn.to_i - @long / 360.0, sdn)
514
+ end
515
+
516
+ private
517
+
518
+ # オブジェクトの正規化
519
+ def _normalize(args=[], options={})
520
+ @time_standard ||= 'universal'
521
+ @bija ||= 'SB'
522
+ super
523
+ end
524
+
525
+ # 9惑星オブジェクトの生成
526
+ def _normalize_grahas
527
+ grahas = Grahas[@bija]
528
+
529
+ # ユガあたりの暦定数
530
+ @sidereal_days = grahas[:Star] # 恒星日
531
+ @solar_years = grahas[:Sun] # 太陽年
532
+ @civil_days = @sidereal_days - @solar_years # 太陽日
533
+ @sidereal_months = grahas[:Moon] # 恒星月
534
+ @synodic_months = @sidereal_months - @solar_years # 朔望月
535
+ @adhimasas = @synodic_months - 12 * @solar_years # 閏月
536
+ @tithis = 30 * @sidereal_months # 太陰日
537
+ @ksayadinas = @tithis - @civil_days # 欠日
538
+
539
+ # 9惑星
540
+ @graha = {}
541
+ @graha.update({
542
+ :Sun => Sun.new( self, @solar_years, 13+50/60.0, 77+17/60.0, -3101)
543
+ }) if @formula =~ /[SL]/i
544
+ @graha.update({
545
+ :Moon => Moon.new( self, @sidereal_months, 31+50/60.0, 0, -28086),
546
+ :Candrocca => VirtualGraha.new( self, grahas[:Candrocca], 90.0)
547
+ }) if @formula =~ /[ML]/i
548
+ @graha.update({
549
+ :Mercury => InferiorPlanet.new(self, @solar_years, 29.0, 220+27/60.0, grahas[:Mercury], 131.5),
550
+ :Venus => InferiorPlanet.new(self, @solar_years, 11.5, 79+50/60.0, grahas[:Venus], 261.0),
551
+ :Mars => SuperiorPlanet.new(self, grahas[:Mars], 73.5, 130+02/60.0, @solar_years, 233.5),
552
+ :Jupiter => SuperiorPlanet.new(self, grahas[:Jupiter], 32.5, 171+18/60.0, @solar_years, 71.0),
553
+ :Saturn => SuperiorPlanet.new(self, grahas[:Saturn], 48.5, 236+37/60.0, @solar_years, 39.5),
554
+ :Rahu => VirtualGraha.new( self, grahas[:Rahu], 180.0)
555
+ }) if @formula == '2L'
556
+ end
557
+ end
558
+ end
559
+
560
+ module CalendarTypes
561
+
562
+ #
563
+ # Indian national solar calendar
564
+ #
565
+ IndianNationalSolar = [CyclicTableBased, {
566
+ 'label' => 'Indian::IndianNationalSolar',
567
+ 'origin_of_LSC' => 1721140,
568
+ 'origin_of_MSC' => -78,
569
+ 'epoch_in_CE' => 0,
570
+ 'indices' => [
571
+ When.Index('Indian::LunarMonth', {:unit =>12, :shift=>4}),
572
+ When::Coordinates::DefaultDayIndex
573
+ ],
574
+ 'rule_table' => {
575
+ 'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']},
576
+ 'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24},
577
+ 'LC' => {'Rule' =>[366, 365, 365, 365]*25},
578
+ 365 => {'Length'=>[30] + [31]*5 + [30]*6},
579
+ 366 => {'Length'=> [31]*6 + [30]*6}
580
+ },
581
+ }]
582
+
583
+ #
584
+ # Nanakshahi Calendar
585
+ #
586
+ class Nanakshahi < TableBased
587
+
588
+ private
589
+
590
+ #
591
+ # Object Normalization
592
+ #
593
+ def _normalize(args=[], options={})
594
+ @label ||= 'Indian::Nanakshahi'
595
+ @epoch_in_CE ||= 1468
596
+ @engine ||= 'Gregorian'
597
+ @engine = When.Calendar(@engine)
598
+ @indices ||= [
599
+ When.Index('Indian::NanakshahiMonth', {:unit=>12, :shift=>4}),
600
+ When::Coordinates::DefaultDayIndex
601
+ ]
602
+ @rule_table ||= {
603
+ 365 => {'Length'=> [31]*5 + [30]*7},
604
+ 366 => {'Length'=> [31]*5 + [30]*6 + [31]}
605
+ }
606
+ super
607
+ end
608
+
609
+ # first day of year
610
+ #
611
+ def _sdn_(date)
612
+ year = +date[0] + @epoch_in_CE
613
+ @engine._coordinates_to_number(year, 2, 13)
614
+ end
615
+ end
616
+
617
+ #
618
+ # Revised Bengali Calendar
619
+ #
620
+ class RevisedBengali < TableBased
621
+
622
+ private
623
+
624
+ #
625
+ # Object Normalization
626
+ #
627
+ def _normalize(args=[], options={})
628
+ @label ||= 'Indian::RevisedBengali'
629
+ @epoch_in_CE ||= 593
630
+ @engine ||= 'Gregorian'
631
+ @engine = When.Calendar(@engine)
632
+ @indices ||= [
633
+ When.Index('Indian::BengaliMonth', {:unit=>12, :shift=>5}),
634
+ When::Coordinates::DefaultDayIndex
635
+ ]
636
+ @rule_table ||= {
637
+ 365 => {'Length'=> [31]*5 + [30]*7},
638
+ 366 => {'Length'=> [31]*5 + [30]*5 + [31, 30]}
639
+ }
640
+ super
641
+ end
642
+
643
+ # first day of year
644
+ #
645
+ def _sdn_(date)
646
+ year = +date[0] + @epoch_in_CE
647
+ @engine._coordinates_to_number(year, 3, 13)
648
+ end
649
+ end
650
+
651
+ #
652
+ # Hindu Solar Calendar
653
+ #
654
+ class HinduSolar < EphemerisBasedSolar
655
+
656
+ # protected
657
+
658
+ # 月初の通日
659
+ #
660
+ # @param [Integer] m 通月
661
+ #
662
+ # @return [Integer] 月初の通日
663
+ #
664
+ def _new_month_(m)
665
+ new_month_time = @formula[0].cn_to_time(m + @cycle_offset)
666
+ new_month_date = (new_month_time + 0.5 + @formula[0].long/360.0).floor
667
+ sunrise_time = @formula[0].sunrise(new_month_date)
668
+ (sunrise_time <= new_month_time) ? new_month_date : new_month_date-1
669
+ end
670
+
671
+ private
672
+
673
+ # オブジェクトの正規化
674
+ #
675
+ # @formula[0] = 位相の計算に用いる太陽の Formula
676
+ # @cycle_offset = 位相のオフセット
677
+ # @start_month = 暦年の最初の月
678
+ #
679
+ def _normalize(args=[], options={})
680
+ @label ||= 'Indian::HinduSolar'
681
+ @type ||= 'SBS'
682
+ raise ArgumentError, "Irregal formula: #{@formula}" unless @type.upcase =~ /\A(M|SS|SB)(V|S||B|H|VZ|SZ|BZ|HZ)\z/
683
+
684
+ @location ||= HinduLuniSolar::Location_E[$2] || HinduLuniSolar::Location_F[$1]
685
+ @cycle_offset ||= HinduLuniSolar::CycleOffset[$1]
686
+ @origin_of_MSC ||= -HinduLuniSolar::YearEpoch[$2]
687
+ @epoch_in_CE ||= 0
688
+ @start_month ||= 1 # Maysha
689
+ @start_month = @start_month.to_i
690
+ @cycle_offset = @cycle_offset.to_f + (@start_month - 1)
691
+ formula = @formula || HinduLuniSolar::Formula[$1]
692
+ if formula.kind_of?(String)
693
+ formula += (formula =~ /\?/) ? '&' : '?'
694
+ @formula = [When.Resource("_ep:#{formula}location=(#{@location})&formula=12S")]
695
+ end
696
+ @indices ||= [
697
+ When.Index('Indian::SolarMonth', {:shift=>@start_month-1}),
698
+ When::Coordinates::DefaultDayIndex
699
+ ]
700
+
701
+ super
702
+ end
703
+ end
704
+
705
+ #
706
+ # Hindu Luni-Solar Calendar
707
+ #
708
+ class HinduLuniSolar < EphemerisBasedLuniSolar
709
+
710
+ # Calendar Type
711
+ Formula = {'M'=>'Formula', 'SS'=>'Hindu?bija=SS', 'SB'=>'Hindu?bija=SB'}
712
+ Location_F = {'M'=>'_co:Indian::CentralIndia', 'SS'=>'_co:Indian::Ujjain', 'SB'=>'_co:Indian::Ujjain'}
713
+ Location_E = {'B'=>'_co:Indian::Dacca', 'BZ'=>'_co:Indian::Dacca', 'H'=>'_co:Iranian::Tehran', 'HZ'=>'_co:Iranian::Tehran'}
714
+ CycleOffset = {'M'=>+23.25/30, 'SS'=>0.0, 'SB'=>0.0}
715
+ HinduStyle = {'A'=>0, 'P'=>1, 'PX'=>2}
716
+ YearEpoch = {'V'=>-58,'VZ'=>-57,'S'=>78, 'SZ'=>79, 'B'=> 593, 'BZ'=>594, 'H'=> 621, 'HZ'=> 622}
717
+
718
+ # White / black month and leap month identification table
719
+
720
+ #[w]/b [n]/l #0 #1 #2
721
+ LEAP_MAP = {[nil, false] => [ 0, 0, 0 ],
722
+ [nil, true ] => [-1.5, -1.5, -1.5],
723
+ [true, false] => [+0.5, -0.5, -2.5],
724
+ [true, true ] => [-1, -2, -1 ]}
725
+
726
+ # protected
727
+
728
+ # 月初の通日
729
+ #
730
+ # @param [Integer] m 通月
731
+ #
732
+ # @return [Integer] 月初の通日
733
+ #
734
+ def _new_month_(m)
735
+ new_moon_time = @formula[-1].cn_to_time(m)
736
+ new_moon_date = (new_moon_time + 0.5 + @formula[-1].long/360.0).floor
737
+ sunrise_time = @formula[-1].sunrise(new_moon_date)
738
+ (sunrise_time >= new_moon_time) ? new_moon_date : new_moon_date+1
739
+ end
740
+
741
+ # 年初の通月
742
+ #
743
+ # @param [Integer] y 年
744
+ #
745
+ # @return [Integer] 年初の通月
746
+ #
747
+ def _new_year_month_(y)
748
+ (Residue.mod(y-1) {|t| _tithi_to_coordinates(t*15)[0]})[0] + 1
749
+ end
750
+
751
+ # 朔望日 -> 年・月・日
752
+ #
753
+ # tithi : 朔望日(月の位相 / (CIRCLE/30))
754
+ #
755
+ # @return [Array<Numeric>] ( y, m, d )
756
+ # [ y - 年(Integer) ]
757
+ # [ m - 月(When::Coordinates::Pair) ]
758
+ # [ d - 日(Integer) ]
759
+ #
760
+ def _tithi_to_coordinates(tithi)
761
+ m, d = tithi.divmod(30)
762
+ s = [0,1,2].map {|i| (@formula[1].time_to_cn(30*(m+i)) - @cycle_offset).floor + 1 }
763
+ f = s[0]==s[1]
764
+ if (d >= 15.0)
765
+ d -= 15
766
+ b = true
767
+ n = true unless @hindu_style==0
768
+ f = s[1]==s[2] if @hindu_style==1
769
+ end
770
+ y, m = (n ? s[1] : s[0]).divmod(12)
771
+ return [y, Pair._force_pair(m+1, LEAP_MAP[[b,f]][@hindu_style]), d.floor]
772
+ end
773
+
774
+ # 日時要素の翻訳表の取得
775
+ #
776
+ # @overload _ids_(date)
777
+ # @param [Array<Numeric>] date ( 年 )
778
+ # @return [Array<When::Coordinates::Pair>] 1年の月の配置の翻訳表
779
+ #
780
+ # @overload _ids_(date)
781
+ # @param [Array<Numeric>] date ( 年 月 )
782
+ # @return [Array<When::Coordinates::Pair>] 1月の日の配置の翻訳表
783
+ # @note 月は 0 始まりの通番
784
+ #
785
+ def _ids_(date)
786
+ y, m = date
787
+ y = +y
788
+ mm = _new_year_month(y)
789
+ return (_table(_new_month_(mm+m.to_i)) {|i| _new_month(mm+m+i/15.0)}) if m
790
+ table = (0...26).to_a.map {|i| _tithi_to_coordinates((mm+i)*15)[1]}
791
+ table.pop while table[-1].trunk < 11
792
+ return table
793
+ end
794
+
795
+ private
796
+
797
+ # 日時要素の翻訳表の作成
798
+ def _table(b0)
799
+ table = [Pair._force_pair(0,0)]
800
+ (1..16).each do |i|
801
+ b1 = yield(i)
802
+ case b1-b0
803
+ when 0 ; table[-1] = Pair._force_pair(i-1, -2)
804
+ when 1 ; table << Pair._force_pair(i, 0)
805
+ when 2 ; table << Pair._force_pair(i, 0) << Pair._force_pair(i, 1)
806
+ else ; raise ArgumentError, "Irregal date span: #{b1-b0}"
807
+ end
808
+ b0 = b1
809
+ end
810
+ table.pop while table[-1].trunk >= 16
811
+ table.shift
812
+ return table
813
+ end
814
+
815
+ # オブジェクトの正規化
816
+ #
817
+ # @formula = 位相の計算に用いる太陽・変換・月の Formula
818
+ # @cycle_offset = 位相のオフセット
819
+ # @hindu_style = 閏月の表現方法
820
+ # @start_month = 暦年の最初の月
821
+ #
822
+ def _normalize(args=[], options={})
823
+ @label ||= 'Indian::HinduLuniSolar'
824
+ @type ||= 'SBSA'
825
+ raise ArgumentError, "Irregal formula: #{@formula}" unless @type.upcase =~ /\A(M|SS|SB)(V|S||B|H|VZ|SZ|BZ|HZ)(A|P|PX)\z/
826
+
827
+ @location ||= Location_E[$2] || Location_F[$1]
828
+ @cycle_offset ||= CycleOffset[$1]
829
+ @origin_of_MSC ||= -YearEpoch[$2]
830
+ @hindu_style ||= HinduStyle[$3]
831
+ @epoch_in_CE ||= 0
832
+ @start_month ||= 5 # Chaitra
833
+ @start_month = @start_month.to_i
834
+ @cycle_offset = @cycle_offset.to_f + (@start_month - 5)
835
+ @hindu_style = @hindu_style.to_i
836
+ @origin_of_MSC = @origin_of_MSC.to_i
837
+ formula = @formula || Formula[$1]
838
+ if formula.kind_of?(String)
839
+ formula += (formula =~ /\?/) ? '&' : '?'
840
+ @formula = When.Resource(["_ep:#{formula}formula=12S",
841
+ "_ep:#{formula}formula=30L->12S",
842
+ "_ep:#{formula}location=(#{@location})&formula=2L"])
843
+ end
844
+ intercalary_month = When.Resource('_m:Indian::IntercalaryMonth::*')
845
+ intercalary_day = When.Resource('_m:Indian::IntercalaryDay::*')
846
+ @indices ||= [
847
+ When.Index('Indian::LunarMonth', {:branch=>{-2.5 => intercalary_month[1], # 黒分
848
+ -2 => intercalary_month[3], # 閏黒分
849
+ -1.5 => intercalary_month[2], # 閏白分
850
+ -1 => intercalary_month[3], # 閏黒分
851
+ -0.5 => intercalary_month[1], # 黒分
852
+ 0 => intercalary_month[0], # 白分
853
+ +0.5 => intercalary_month[1]}, # 黒分
854
+ :shift=>@start_month-1}),
855
+ When.Index({:branch=>{-2=>intercalary_day[0], +1=>intercalary_day[1]}})
856
+ ]
857
+
858
+ super
859
+ end
860
+ end
861
+ end
862
+
863
+ class CalendarNote
864
+ #
865
+ # ヒンドゥー系の暦注
866
+ #
867
+ class HinduNote < self
868
+
869
+ Notes = [When::BasicTypes::M17n, [
870
+ "locale:[=en:, ja=ja:, hi=hi:, alias]",
871
+ "names:[Hindu]",
872
+
873
+ # 年の暦注 ----------------------------
874
+ [When::BasicTypes::M17n,
875
+ "names:[year]",
876
+ [When::BasicTypes::M17n,
877
+ "names:[samvatsara, 木星年=]",
878
+ "[Prabhava=, プラバヴァ=, _IAST_=]", # 1
879
+ "[Vibhava=, ヴィバヴァ=, _IAST_=]", # 2
880
+ "[Sukha=, スカ=, _IAST_=]", # 3
881
+ "[Pramoda=, プラモーダ=, _IAST_=]", # 4
882
+ "[Prajāpati=, プラジャーパティ=, _IAST_=]", # 5
883
+ "[Aṅgiras=, アンギラス=, _IAST_=]", # 6
884
+ "[Śrīmukha=, シュリームカ=, _IAST_=]", # 7
885
+ "[Bhāva=, バーヴァ=, _IAST_=]", # 8
886
+ "[Yuvan=, ユヴァン=, _IAST_=]", # 9
887
+ "[Dhātṛ=, ダートリ=, _IAST_=]", # 10
888
+ "[Īśvara=, イーシュヴァラ=, _IAST_=]", # 11
889
+ "[Bahudhānya=, バフダーニャ=, _IAST_=]", # 12
890
+ "[Pramāthin=, プラマーティン=, _IAST_=]", # 13
891
+ "[Vikrama=, ヴィクラマ=, _IAST_=]", # 14
892
+ "[Vṛṣa=, ヴリシャ=, _IAST_=]", # 15
893
+ "[Chitrabhānu=, チトラバーヌ=, _IAST_=]", # 16
894
+ "[Subhānu=, スバーヌ=, _IAST_=]", # 17
895
+ "[Tāraṇa=, ターラナ=, _IAST_=]", # 18
896
+ "[Pārthiva=, パールティヴァ=, _IAST_=]", # 19
897
+ "[Vyaya=, ヴヤヤ=, _IAST_=]", # 20
898
+ "[Sarvajit=, サルヴァジト=, _IAST_=]", # 21
899
+ "[Sarvadhārin=, サルヴァダーリン=, _IAST_=]", # 22
900
+ "[Virodhin=, ヴィローディン=, _IAST_=]", # 23
901
+ "[Vikṛta=, ヴィクリタ=, _IAST_=]", # 24
902
+ "[Khara=, カラ=, _IAST_=]", # 25
903
+ "[Nandana=, ナンダナ=, _IAST_=]", # 26
904
+ "[Vijaya=, ヴィジャヤ=, _IAST_=]", # 27
905
+ "[Jaya=, ジャヤ=, _IAST_=]", # 28
906
+ "[Manmatha=, マンマタ=, _IAST_=]", # 29
907
+ "[Durmukha=, ドゥルムカ=, _IAST_=]", # 30
908
+ "[Hemalamba=, ヘマラムバ=, _IAST_=]", # 31
909
+ "[Vilambin=, ヴィラムビン=, _IAST_=]", # 32
910
+ "[Vikārin=, ヴィカーリン=, _IAST_=]", # 33
911
+ "[Śārvarin=, シャールヴァリン=, _IAST_=]", # 34
912
+ "[Plava=, プラヴァ=, _IAST_=]", # 35
913
+ "[Śubhakṛt=, シュバクリト=, _IAST_=]", # 36
914
+ "[Śobhana=, ショバナ=, _IAST_=]", # 37
915
+ "[Krodhin=, クロディン=, _IAST_=]", # 38
916
+ "[Viśvāvasu=, ヴィシュヴァーヴァス=, _IAST_=]", # 39
917
+ "[Parābhava=, パラーバヴァ=, _IAST_=]", # 40
918
+ "[Plavaṅga=, プラヴァンガ=, _IAST_=]", # 41
919
+ "[Kīlaka=, キーラカ=, _IAST_=]", # 42
920
+ "[Saumya=, サウムヤ=, _IAST_=]", # 43
921
+ "[Sādhāraṇa=, サーダーラナ=, _IAST_=]", # 44
922
+ "[Virodhakṛt=, ヴィローダクリト=, _IAST_=]", # 45
923
+ "[Paridhāvin=, パリダーヴィン=, _IAST_=]", # 46
924
+ "[Pramādin=, プラマーディン=, _IAST_=]", # 47
925
+ "[Ānanda=, アーナンダ=, _IAST_=]", # 48
926
+ "[Rākṣasa=, ラークシャサ=, _IAST_=]", # 49
927
+ "[Anala=, アナラ=, _IAST_=]", # 50
928
+ "[Piṅgala=, ピンガラ=, _IAST_=]", # 51
929
+ "[Kālayukta=, カーラユクタ=, _IAST_=]", # 52
930
+ "[Siddhārthin=, シッダールティン=, _IAST_=]", # 53
931
+ "[Raudra=, ラウドラ=, _IAST_=]", # 54
932
+ "[Durmati=, ドゥルマティ=, _IAST_=]", # 55
933
+ "[Dundubhi=, ドゥンドゥビ=, _IAST_=]", # 56
934
+ "[Rudhirodgārin=, ルディロードガーリン=, _IAST_=]", # 57
935
+ "[Raktākṣin=, ラクタークシン=, _IAST_=]", # 58
936
+ "[Krodhana=, クローダナ=, _IAST_=]", # 59
937
+ "[Kṣaya=, クシャヤ=, _IAST_=]" # 60
938
+ ]
939
+ ],
940
+
941
+ # 月の暦注 ----------------------------
942
+ [When::BasicTypes::M17n,
943
+ "names:[month]",
944
+ [When::BasicTypes::M17n,
945
+ "names:[Month]"
946
+ ]
947
+ ],
948
+
949
+ # 日の暦注 ----------------------------
950
+ [When::BasicTypes::M17n,
951
+ "names:[day]",
952
+
953
+ [When::BasicTypes::M17n,
954
+ "names:[tithi=, ティティ=ja:%%<ティティ>]",
955
+ "[Amavasya, 新月, _IAST_=]", # 新月
956
+ "[Pratipad=en:Prathama_(day), 1日=, _IAST_=]", # 1
957
+ "[Dwitiya, 2日=, _IAST_=]", # 2
958
+ "[Tritiya, 3日=, _IAST_=]", # 3
959
+ "[Chaturthi, 4日=, _IAST_=]", # 4
960
+ "[Panchami, 5日=, _IAST_=]", # 5
961
+ "[Ṣaṣṭhī=en:Shashti, 6日=, _IAST_=]", # 6
962
+ "[Saptami, 7日=, _IAST_=]", # 7
963
+ "[Ashtami, 8日=, _IAST_=]", # 8
964
+ "[Navami, 9日=, _IAST_=]", # 9
965
+ "[Dashami, 10日=, _IAST_=]", # 10
966
+ "[Ekadashi, 11日=, _IAST_=]", # 11
967
+ "[Dwadashi, 12日=, _IAST_=]", # 12
968
+ "[Thrayodashi, 13日=, _IAST_=]", # 13
969
+ "[Chaturdashi, 14日=, _IAST_=]", # 14
970
+ "[Purnima, 満月, _IAST_=]" # 満月
971
+ ],
972
+
973
+ [When::BasicTypes::M17n,
974
+ "names:[vāra=, ヴァーラ=, _IAST_=, *vara=]",
975
+ "[Ravi=en:S%C5%ABrya, 日曜日, _IAST_=]",
976
+ "[Soma, 月曜日, _IAST_=]",
977
+ "[Maṅgala=en:Mangala, 火曜日, _IAST_=]",
978
+ "[Budha, 水曜日, _IAST_=]",
979
+ "[Guru, 木曜日, _IAST_=]",
980
+ "[Śukra=en:Shukra, 金曜日, _IAST_=]",
981
+ "[Śani=en:Shani, 土曜日, _IAST_=]"
982
+ ],
983
+
984
+ [When::BasicTypes::M17n,
985
+ "names:[nakṣatra=, ナクシャトラ=, _IAST_=, *naksatra=]",
986
+ "[Aśvinī=en:Ashvin%C4%AB, アシュヴィニー=, _IAST_=, 婁宿]", # 1
987
+ "[Bharaṇī=en:Bharan%C4%AB, バラニー=, _IAST_=, 胃宿]", # 2
988
+ "[Kṛttikā=en:Krittik%C4%81, クリッティカー=, _IAST_=, 昴宿]", # 3
989
+ "[Rohiṇī=en:Rohini_(nakshatra), ローヒニ―=, _IAST_=, 畢宿]", # 4
990
+ "[Mṛgaśiras=en:Mrigash%C4%ABrsha, ムリガシラス=, _IAST_=, 觜宿]", # 5
991
+ "[Ārdrā=en:Ardra_(nakshatra), アールドラー=, _IAST_=, 參宿]", # 6
992
+ "[Punarvasu=en:Punarvasu, プナルヴァス=, _IAST_=, 井宿]", # 7
993
+ "[Puṣya=en:Pushya, プシュヤ=, _IAST_=, 鬼宿]", # 8
994
+ "[Aśleṣā=en:%C4%80shlesh%C4%81, アーシュレーシャー=, _IAST_=, 柳宿]", # 9
995
+ "[Maghā=en:Magh%C4%81, マガー=, _IAST_=, 星宿]", # 10
996
+ "[Pū. Phalguṇī=en:P%C5%ABrva_Phalgun%C4%AB, P. パールグニー=, _IAST_=, 張宿]", # 11
997
+ "[U. Phalguṇī=en:Uttara_Phalgun%C4%AB, U. パールグニー=, _IAST_=, 翼宿]", # 12
998
+ "[Hasta=en:Nakshatra#Divisions, ハスタ=, _IAST_=, 軫宿]", # 13
999
+ "[Citrā=en:Nakshatra#Divisions, チトラー=, _IAST_=, 角宿]", # 14
1000
+ "[Svāti=en:Sv%C4%81t%C4%AB, スヴァーティー=, _IAST_=, 亢宿]", # 15
1001
+ "[Viśākha=en:Vish%C4%81kh%C4%81, ヴィシャーカー=, _IAST_=, 氐宿]", # 16
1002
+ "[Anurādhā=en:Anur%C4%81dh%C4%81, アヌラーダー=, _IAST_=, 房宿]", # 17
1003
+ "[Jyeṣṭha=en:Jyeshtha, ジェーシュター=, _IAST_=, 心宿]", # 18
1004
+ "[Mūla=en:Mula_(astrology), ムーラ=, _IAST_=, 尾宿]", # 19
1005
+ "[Pū. āṣāḍha=en:P%C5%ABrva_Ash%C4%81dh%C4%81, P. アーシャーダー=, _IAST_=, 箕宿]", # 20
1006
+ "[U. āṣāḍha=en:Uttara_Ash%C4%81dh%C4%81, U. アーシャーダー=, _IAST_=, 斗宿]", # 21
1007
+ "[Śravaṇa=en:Shravana, シュラヴァナ=, _IAST_=, 女宿]", # 22
1008
+ "[Śraviṣṭhā=en:Dhanishta, ダニシュター=, _IAST_=, 虛宿]", # 23
1009
+ "[Śatabhiṣak=en:Shatabhish%C4%81, シャタビシャジュ=, _IAST_=, 危宿]", # 24
1010
+ "[Pū. Bhādrapadā=en:P%C5%ABrva_Bh%C4%81drapad%C4%81,P. バードラパダー=, _IAST_=, 室宿]", # 25
1011
+ "[U. Bhādrapadā=en:Uttara_Bh%C4%81drapad%C4%81, U. バードラパダー=, _IAST_=, 壁宿]", # 26
1012
+ "[Revatī=en:Revati_(nakshatra), レーヴァティー=, _IAST_=, 奎宿]" # 27
1013
+ ],
1014
+
1015
+ [When::BasicTypes::M17n,
1016
+ "names:[yoga=, ヨーガ=, _IAST_=]",
1017
+ "[Viṣkambha=, ヴィシュカムバ=, _IAST_=]", # 1
1018
+ "[Prīti=, プリーティ=, _IAST_=]", # 2
1019
+ "[Āyuśmān=, アーユシュマー=, _IAST_=]", # 3
1020
+ "[Saubhāgya=, サウバーギャ=, _IAST_=]", # 4
1021
+ "[Śobhana=, ショーバナ=, _IAST_=]", # 5
1022
+ "[Atigaṇḍa=, アティガンダ=, _IAST_=]", # 6
1023
+ "[Sukarma=, スカルマ=, _IAST_=]", # 7
1024
+ "[Dhṛti, ドゥリティ=, _IAST_=]", # 8
1025
+ "[Śūla=, シューラ=, _IAST_=]", # 9
1026
+ "[Gaṇḍa=, ガンダ=, _IAST_=]", # 10
1027
+ "[Vṛddhi=, ヴリッディ=, _IAST_=]", # 11
1028
+ "[Dhruva=, ドルヴァ=, _IAST_=]", # 12
1029
+ "[Vyāghāta=, ヴヤーガータ=, _IAST_=]", # 13
1030
+ "[Harṣaṇa=, ハルシャナ=, _IAST_=]", # 14
1031
+ "[Vajra=, ヴァジュラ=, _IAST_=]", # 15
1032
+ "[Siddhi=, シッディ=, _IAST_=]", # 16
1033
+ "[Vyatīpāta=, ヴヤティーパータ=, _IAST_=]", # 17
1034
+ "[Varīyas=, ヴァリーヤス=, _IAST_=]", # 18
1035
+ "[Parigha=, パリガ=, _IAST_=]", # 19
1036
+ "[Śiva=, シヴァ=, _IAST_=]", # 20
1037
+ "[Siddha=, シッダ=, _IAST_=]", # 21
1038
+ "[Sādhya=, サーディヤ=, _IAST_=]", # 22
1039
+ "[Śubha=, シュバ=, _IAST_=]", # 23
1040
+ "[Śukla=, シュクラ=, _IAST_=]", # 24
1041
+ "[Brahman=, ブラフマン=, _IAST_=]", # 25
1042
+ "[Māhendra=, マーヘンドラ=, _IAST_=]", # 26
1043
+ "[Vaidhṛti=, ヴァイドリティ=, _IAST_=]" # 27
1044
+ ],
1045
+
1046
+ [When::BasicTypes::M17n,
1047
+ "names:[Karaṇa=, カラナ=, _IAST_=, *karana]",
1048
+ "[Bava=, バヴァ=, _IAST_=]", # 1
1049
+ "[Bālava=, バーラヴァ=, _IAST_=]", # 2
1050
+ "[Kaulava=, カウラヴァ=, _IAST_=]", # 3
1051
+ "[Taitila=, タイティラ=, _IAST_=]", # 4
1052
+ "[Gara=, ガラ=, _IAST_=]", # 5
1053
+ "[Vaṇija=, ヴァニジュ=, _IAST_=]", # 6
1054
+ "[Viṣṭi=, ヴィシュティ=, _IAST_=]", # 7
1055
+ "[Kiṃtughna=, キンストゥグナ=, _IAST_=]", # A
1056
+ "[Śakuni=, シャクニ=, _IAST_=]", # B
1057
+ "[Catuṣpāda=, チャトシュパダ=, _IAST_=]", # C
1058
+ "[Nāga=, ナーガ=, _IAST_=]" # D
1059
+ ]
1060
+ ]
1061
+ ]]
1062
+
1063
+ NoteConsts = {
1064
+ 'tithi' => {
1065
+ :formula => 15,
1066
+ :range => (-1..2),
1067
+ :index => [ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
1068
+ 15,1,2,3,4,5,6,7,8,9,10,11,12,13,14]
1069
+ },
1070
+ 'naksatra' => {
1071
+ :formula => '27M',
1072
+ :range => (-1..2),
1073
+ :index => (0...27).to_a
1074
+ },
1075
+ 'yoga' => {
1076
+ :formula => '27M+27S',
1077
+ :range => (-1..2),
1078
+ :index => (0...27).to_a
1079
+ },
1080
+ 'karana' => {
1081
+ :formula => 30,
1082
+ :range => (-2..3),
1083
+ :index => [7] + (0...7).to_a * 8 + [8,9,10]
1084
+ }
1085
+ }
1086
+
1087
+ #
1088
+ # pancanga 計算に必要となる情報をまとめた内部クラス
1089
+ #
1090
+ class Dates
1091
+
1092
+ # @private
1093
+ attr_reader :o_date, :l_date, :root, :formula, :iri, :rises
1094
+
1095
+ # 初期設定
1096
+ # @private
1097
+ def initialize(date)
1098
+ @o_date = date
1099
+ clock = date.clock
1100
+ frame = date.frame if date.frame.kind_of?(When::CalendarTypes::HinduLuniSolar)
1101
+ @l_date = (frame || When.Calendar('HinduLuniSolar?note=HinduNote')).jul_trans(date.to_i, {:clock=>'+05:30'})
1102
+ @root = When.CalendarNote('HinduNote/Notes')['day']
1103
+ @formula = @l_date.frame.formula[-1]
1104
+ @iri = @formula.iri
1105
+ @rises = [@formula.sunrise(@l_date), @formula.sunrise(@l_date+When.Duration('P1D'))]
1106
+ end
1107
+
1108
+ # その他のメソッドは @l_date に移譲する
1109
+ def method_missing(name, *args, &block)
1110
+ self.class.module_eval %Q{
1111
+ def #{name}(*args, &block)
1112
+ @l_date.send("#{name}", *args, &block)
1113
+ end
1114
+ } unless When::Parts::MethodCash.escape(name)
1115
+ @l_date.send(name, *args, &block)
1116
+ end
1117
+ end
1118
+
1119
+ #
1120
+ # 任意の暦をインド太陰太陽暦日に変換
1121
+ # @private
1122
+ def _to_date_for_note(date)
1123
+ Dates.new(date)
1124
+ end
1125
+
1126
+ #
1127
+ # 木星年
1128
+ #
1129
+ # @param [Dates] dates
1130
+ #
1131
+ # @return [When::BasicTypes::M17n] 木星年の名称
1132
+ #
1133
+ # see {http://en.wikipedia.org/wiki/Samvatsara Samvatsara}
1134
+ #
1135
+ def samvatsara(dates)
1136
+ year_kali = dates.l_date.most_significant_coordinate + dates.l_date.frame._diff_to_CE + 3101
1137
+ year_mod = year_kali >= jovian ? (year_kali + 12) % 60 :
1138
+ ((year_kali * 211 - 108).div(18000) + year_kali + 26) % 60
1139
+ When.CalendarNote('HinduNote/Notes')['year']['samvatsara'][year_mod]
1140
+ end
1141
+
1142
+ #
1143
+ # 木星年の計算方式に“South”を適用開始する年
1144
+ #
1145
+ # @return [Integer] 年(カリユガ紀元)
1146
+ #
1147
+ def jovian
1148
+ return @jovian if @jovian.kind_of?(Integer)
1149
+ @jovian = @jovian ? @jovian.to_i : 4009
1150
+ end
1151
+
1152
+ #
1153
+ # ヴァーラ (七曜)
1154
+ #
1155
+ # @param [Dates] dates
1156
+ #
1157
+ # @return [Array<When::TM::TemporalPosition>] 日の出の時刻をイベント時刻とする
1158
+ #
1159
+ def vara(dates)
1160
+ rise = dates.rises[0]
1161
+ rise.events = [dates.root['vara'][(rise.to_i+1) % 7]]
1162
+ ['V:-', rise]
1163
+ end
1164
+
1165
+ #
1166
+ # ヴァーラ以外
1167
+ #
1168
+
1169
+ # 当該日付中でティティが変わる日時
1170
+ # @method tithi(dates)
1171
+ # @param [Dates] dates
1172
+ # @return [Array<When::TM::TemporalPosition>] イベント日時
1173
+
1174
+ # 当該日付中でナクシャトラが変わる日時
1175
+ # @method naksatra(dates)
1176
+ # @param [Dates] dates
1177
+ # @return [Array<When::TM::TemporalPosition>] イベント日時
1178
+
1179
+ # 当該日付中でヨーガが変わる日時
1180
+ # @method yoga(dates)
1181
+ # @param [Dates] dates
1182
+ # @return [Array<When::TM::TemporalPosition>] イベント日時
1183
+
1184
+ # 当該日付中でカラナが変わる日時
1185
+ # @method karana(dates)
1186
+ # @param [Dates] dates
1187
+ # @return [Array<When::TM::TemporalPosition>] イベント日時
1188
+ #
1189
+
1190
+ # @private
1191
+ NoteConsts.keys.each do |key|
1192
+ module_eval %Q{
1193
+ def #{key}(dates)
1194
+ pancanga(dates, '#{key}').map {|event| ['#{key[0..0].upcase}:-', event]}
1195
+ end
1196
+ }
1197
+ end
1198
+
1199
+ #
1200
+ # ヴァーラ以外のイベント日時
1201
+ #
1202
+ # @param [Dates] dates
1203
+ # @param [String] key 'tithi', 'naksatra', 'yoga', 'karana' のいずれか
1204
+ # @return [Array<When::TM::TemporalPosition>] イベント日時
1205
+ #
1206
+ def pancanga(dates, key)
1207
+ pattern = NoteConsts[key]
1208
+ note = dates.root[key]
1209
+ if pattern[:formula].kind_of?(Numeric)
1210
+ factor = pattern[:formula].to_f
1211
+ formula = dates.formula
1212
+ else
1213
+ factor = 1.0
1214
+ formula = When.Resource(dates.iri.sub(/formula=2L/, "formula=#{pattern[:formula]}"))
1215
+ end
1216
+ cn = (formula.time_to_cn(dates.l_date) * factor).floor
1217
+ events = []
1218
+ pattern[:range].each do |i|
1219
+ event = formula._to_seed_type(formula.cn_to_time((cn+i)/factor), dates.l_date)
1220
+ break if +event >= +dates.rises[1]
1221
+ next if +event < +dates.rises[0]
1222
+ event.events = [note[pattern[:index][(cn+i) % pattern[:index].length]]]
1223
+ events << event
1224
+ end
1225
+ events
1226
+ end
1227
+ end
1228
+
1229
+ #
1230
+ # 日の出の九惑星の位置まで計算
1231
+ #
1232
+ class HinduNoteDetailed < HinduNote
1233
+
1234
+ Notes = HinduNote::Notes
1235
+
1236
+ #
1237
+ # ヴァーラ (七曜)と九惑星の位置
1238
+ #
1239
+ # @param [Dates] dates
1240
+ # @return [Array<When::TM::TemporalPosition, Hash{ 惑星シンボル=>惑星の真黄経 }>]
1241
+ # 日の出の時刻をイベント時刻とし、その時刻での九惑星の位置を計算
1242
+ #
1243
+ def vara(dates)
1244
+ rise = dates.rises[0]
1245
+ rise.events = [dates.root['vara'][(rise.to_i+1) % 7]]
1246
+ t = dates.formula.is_dynamical ? +rise : rise.to_f
1247
+ [['V:-', rise], dates.formula.graha.keys.inject({}) {|h,p|
1248
+ h.store(p, dates.formula.graha[p].true_longitude(t))
1249
+ h
1250
+ }]
1251
+ end
1252
+ end
1253
+ end
1254
+ end