when_exe 0.2.100 → 0.3.1

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 (193) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/irb.rc +5 -0
  4. data/bin/locales.rb +2 -2
  5. data/bin/when.rb +16 -0
  6. data/bin/when.rb.config +7 -0
  7. data/lib/when_exe.rb +616 -14
  8. data/lib/when_exe/basictypes.rb +615 -0
  9. data/lib/when_exe/calendartypes.rb +1700 -0
  10. data/lib/when_exe/coordinates.rb +1936 -0
  11. data/lib/when_exe/core/compatibility.rb +54 -0
  12. data/lib/when_exe/core/duration.rb +72 -72
  13. data/lib/when_exe/core/extension.rb +382 -0
  14. data/lib/when_exe/ephemeris.rb +1845 -0
  15. data/lib/when_exe/googlecalendar.rb +140 -0
  16. data/lib/when_exe/icalendar.rb +1587 -0
  17. data/lib/when_exe/inspect.rb +1237 -0
  18. data/lib/when_exe/locales/af.rb +90 -0
  19. data/lib/when_exe/locales/ar.rb +145 -0
  20. data/lib/when_exe/locales/az.rb +90 -0
  21. data/lib/when_exe/locales/bg.rb +90 -0
  22. data/lib/when_exe/locales/bn.rb +94 -0
  23. data/lib/when_exe/locales/bs.rb +121 -0
  24. data/lib/when_exe/locales/ca.rb +92 -0
  25. data/lib/when_exe/locales/cs.rb +107 -0
  26. data/lib/when_exe/locales/cy.rb +150 -0
  27. data/lib/when_exe/locales/da.rb +84 -0
  28. data/lib/when_exe/locales/de.rb +92 -0
  29. data/lib/when_exe/locales/de_AT.rb +92 -0
  30. data/lib/when_exe/locales/de_CH.rb +92 -0
  31. data/lib/when_exe/locales/el.rb +93 -0
  32. data/lib/when_exe/locales/en.rb +88 -0
  33. data/lib/when_exe/locales/en_AU.rb +88 -0
  34. data/lib/when_exe/locales/en_CA.rb +88 -0
  35. data/lib/when_exe/locales/en_GB.rb +88 -0
  36. data/lib/when_exe/locales/en_IN.rb +88 -0
  37. data/lib/when_exe/locales/en_NZ.rb +88 -0
  38. data/lib/when_exe/locales/eo.rb +89 -0
  39. data/lib/when_exe/locales/es.rb +84 -0
  40. data/lib/when_exe/locales/es_419.rb +84 -0
  41. data/lib/when_exe/locales/es_AR.rb +84 -0
  42. data/lib/when_exe/locales/es_CL.rb +84 -0
  43. data/lib/when_exe/locales/es_CO.rb +84 -0
  44. data/lib/when_exe/locales/es_MX.rb +84 -0
  45. data/lib/when_exe/locales/es_PE.rb +85 -0
  46. data/lib/when_exe/locales/es_VE.rb +84 -0
  47. data/lib/when_exe/locales/et.rb +94 -0
  48. data/lib/when_exe/locales/eu.rb +95 -0
  49. data/lib/when_exe/locales/fa.rb +80 -0
  50. data/lib/when_exe/locales/fi.rb +89 -0
  51. data/lib/when_exe/locales/fr.rb +88 -0
  52. data/lib/when_exe/locales/fr_CA.rb +88 -0
  53. data/lib/when_exe/locales/fr_CH.rb +88 -0
  54. data/lib/when_exe/locales/gl.rb +81 -0
  55. data/lib/when_exe/locales/he.rb +84 -0
  56. data/lib/when_exe/locales/hi.rb +80 -0
  57. data/lib/when_exe/locales/hi_IN.rb +84 -0
  58. data/lib/when_exe/locales/hr.rb +128 -0
  59. data/lib/when_exe/locales/hu.rb +84 -0
  60. data/lib/when_exe/locales/id.rb +89 -0
  61. data/lib/when_exe/locales/is.rb +89 -0
  62. data/lib/when_exe/locales/it.rb +87 -0
  63. data/lib/when_exe/locales/it_CH.rb +87 -0
  64. data/lib/when_exe/locales/ja.rb +78 -0
  65. data/lib/when_exe/locales/kn.rb +86 -0
  66. data/lib/when_exe/locales/ko.rb +78 -0
  67. data/lib/when_exe/locales/links.rb +2342 -0
  68. data/lib/when_exe/locales/lo.rb +123 -0
  69. data/lib/when_exe/locales/locales.rb +91 -0
  70. data/lib/when_exe/locales/lt.rb +111 -0
  71. data/lib/when_exe/locales/lv.rb +118 -0
  72. data/lib/when_exe/locales/mk.rb +93 -0
  73. data/lib/when_exe/locales/mn.rb +80 -0
  74. data/lib/when_exe/locales/nb.rb +81 -0
  75. data/lib/when_exe/locales/ne.rb +81 -0
  76. data/lib/when_exe/locales/nl.rb +92 -0
  77. data/lib/when_exe/locales/nn.rb +73 -0
  78. data/lib/when_exe/locales/or.rb +84 -0
  79. data/lib/when_exe/locales/pl.rb +128 -0
  80. data/lib/when_exe/locales/pt.rb +88 -0
  81. data/lib/when_exe/locales/pt_BR.rb +88 -0
  82. data/lib/when_exe/locales/rm.rb +143 -0
  83. data/lib/when_exe/locales/ro.rb +105 -0
  84. data/lib/when_exe/locales/ru.rb +128 -0
  85. data/lib/when_exe/locales/sk.rb +109 -0
  86. data/lib/when_exe/locales/sl.rb +122 -0
  87. data/lib/when_exe/locales/sr.rb +122 -0
  88. data/lib/when_exe/locales/sv.rb +83 -0
  89. data/lib/when_exe/locales/sw.rb +89 -0
  90. data/lib/when_exe/locales/th.rb +78 -0
  91. data/lib/when_exe/locales/tl.rb +99 -0
  92. data/lib/when_exe/locales/tr.rb +96 -0
  93. data/lib/when_exe/locales/uk.rb +128 -0
  94. data/lib/when_exe/locales/uz.rb +128 -0
  95. data/lib/when_exe/locales/vi.rb +94 -0
  96. data/lib/when_exe/locales/wo.rb +82 -0
  97. data/lib/when_exe/locales/zh_CN.rb +77 -0
  98. data/lib/when_exe/locales/zh_HK.rb +77 -0
  99. data/lib/when_exe/locales/zh_TW.rb +77 -0
  100. data/lib/when_exe/mini_application.rb +252 -0
  101. data/lib/when_exe/parts/enumerator.rb +472 -0
  102. data/lib/when_exe/parts/geometric_complex.rb +379 -0
  103. data/lib/when_exe/parts/locale.rb +513 -0
  104. data/lib/when_exe/parts/method_cash.rb +207 -0
  105. data/lib/when_exe/parts/resource.rb +806 -0
  106. data/lib/when_exe/parts/timezone.rb +182 -0
  107. data/lib/when_exe/region/bahai.rb +145 -0
  108. data/lib/when_exe/region/balinese.rb +627 -0
  109. data/lib/when_exe/region/chinese.rb +896 -0
  110. data/lib/when_exe/region/chinese_calendar.rb +919 -0
  111. data/lib/when_exe/region/chinese_epoch.rb +1245 -0
  112. data/lib/when_exe/region/christian.rb +644 -0
  113. data/lib/when_exe/region/far_east.rb +192 -0
  114. data/lib/when_exe/region/french.rb +66 -0
  115. data/lib/when_exe/region/geologicalage.rb +639 -0
  116. data/lib/when_exe/region/indian.rb +1066 -0
  117. data/lib/when_exe/region/iranian.rb +66 -0
  118. data/lib/when_exe/region/islamic.rb +105 -0
  119. data/lib/when_exe/region/japanese.rb +851 -0
  120. data/lib/when_exe/region/japanese_notes.rb +964 -0
  121. data/lib/when_exe/region/japanese_residues.rb +1149 -0
  122. data/lib/when_exe/region/javanese.rb +228 -0
  123. data/lib/when_exe/region/jewish.rb +127 -0
  124. data/lib/when_exe/region/korean.rb +267 -0
  125. data/lib/when_exe/region/m17n.rb +115 -0
  126. data/lib/when_exe/region/martian.rb +215 -0
  127. data/lib/when_exe/region/mayan.rb +122 -0
  128. data/lib/when_exe/region/moon.rb +333 -0
  129. data/lib/when_exe/region/nihon_shoki.rb +73 -0
  130. data/lib/when_exe/region/planets.rb +585 -0
  131. data/lib/when_exe/region/pope.rb +298 -0
  132. data/lib/when_exe/region/residue.rb +229 -0
  133. data/lib/when_exe/region/roman.rb +325 -0
  134. data/lib/when_exe/region/ryukyu.rb +98 -0
  135. data/lib/when_exe/region/shire.rb +254 -0
  136. data/lib/when_exe/region/sun.rb +210 -0
  137. data/lib/when_exe/region/thai.rb +227 -0
  138. data/lib/when_exe/region/tibetan.rb +233 -0
  139. data/lib/when_exe/region/v50.rb +111 -0
  140. data/lib/when_exe/region/vietnamese.rb +173 -0
  141. data/lib/when_exe/region/world.rb +197 -0
  142. data/lib/when_exe/timestandard.rb +547 -0
  143. data/lib/when_exe/tmduration.rb +330 -330
  144. data/lib/when_exe/tmobjects.rb +1295 -0
  145. data/lib/when_exe/tmposition.rb +1955 -0
  146. data/lib/when_exe/tmreference.rb +1547 -0
  147. data/lib/when_exe/version.rb +10 -3
  148. data/link_to_online_documents +4 -0
  149. data/test/examples/JapanHolidays.ics +456 -0
  150. data/test/examples/Millennium.ics +17 -0
  151. data/test/examples/NewYork.ics +61 -0
  152. data/test/examples/Residue.m17n +135 -0
  153. data/test/examples/Spatial.m17n +179 -0
  154. data/test/examples/Terms.m17n +39 -0
  155. data/test/examples/Test.ics +53 -0
  156. data/test/examples/USA-DST.ics +61 -0
  157. data/test/examples/geometric_complex.rb +41 -0
  158. data/test/examples/sample.xml +14 -0
  159. data/test/examples/today.rb +61 -0
  160. data/test/test.rb +54 -19
  161. data/test/test.rb.config +1 -0
  162. data/test/test/basictypes.rb +368 -0
  163. data/test/test/calendartypes.rb +57 -0
  164. data/test/test/coordinates.rb +380 -0
  165. data/test/test/ephemeris.rb +127 -0
  166. data/test/test/googlecalendar.rb +167 -0
  167. data/test/test/icalendar.rb +848 -0
  168. data/test/test/inspect.rb +115 -0
  169. data/test/test/parts.rb +480 -0
  170. data/test/test/region/chinese.rb +161 -0
  171. data/test/test/region/french.rb +33 -0
  172. data/test/test/region/geologicalage.rb +14 -0
  173. data/test/test/region/indian.rb +55 -0
  174. data/test/test/region/iran.rb +54 -0
  175. data/test/test/region/islamic.rb +18 -0
  176. data/test/test/region/japanese.rb +62 -0
  177. data/test/test/region/jewish.rb +61 -0
  178. data/test/test/region/m17n.rb +181 -0
  179. data/test/test/region/mayan.rb +78 -0
  180. data/test/test/region/moon.rb +14 -0
  181. data/test/test/region/planets.rb +14 -0
  182. data/test/test/region/residue.rb +123 -0
  183. data/test/test/region/sun.rb +14 -0
  184. data/test/test/region/thai.rb +94 -0
  185. data/test/test/region/tibetan.rb +30 -0
  186. data/test/test/tmobjects.rb +356 -57
  187. data/test/test/tmposition.rb +237 -0
  188. data/test/test/tmreference.rb +95 -0
  189. data/when_exe.gemspec +2 -2
  190. metadata +187 -7
  191. data/doc/COPYING +0 -31
  192. data/doc/COPYING.ja +0 -25
  193. data/doc/document_url +0 -1
@@ -0,0 +1,210 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2013 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
+ module Ephemeris
10
+
11
+ #------------------------------------------
12
+ # 太陽・地球 位置計算用データ
13
+ #------------------------------------------
14
+
15
+ # 太陽の地心黄経
16
+ # @private
17
+ P3L =
18
+ [[LIN , 279.0357964 , 360.007693787, 3.02500E-8],
19
+ [SIN , 353.06 , 719.981008 , 0.02009 ,-2.98832E-8],
20
+ [SIN , 248.64 , -19.34136 , -0.0048 ],
21
+ [SIN , 285.0 , 329.6446699, 0.0020 ,+8.0E-9 ],
22
+ [SIN , 334.2 , -4452.671109 , 0.0018 ,-0.1634E-6 ],
23
+
24
+ [SIN , 293.7 , -0.2020 , 0.00178 ],
25
+ [SIN , 242.4 , 450.3688 , 0.0015 ,+1.4E-9 ],
26
+ [SIN , 211.1 , 225.1844 , 0.0013 ,+0.7E-9 ],
27
+ [SIN , 208.0 , 659.2893 , 0.0008 ,+1.6E-8 ],
28
+ [SIN , 53.5 , 90.3783 , 0.0007 ],
29
+
30
+ [SIN , 12.1 , -30.35 , 0.0007 ],
31
+ [SIN , 239.1 , 337.18 , 0.0006 ],
32
+ [SIN , 10.1 , -1.50 , 0.0005 ],
33
+ [SIN , 99.1 , -22.81 , 0.0005 ],
34
+ [SIN , 264.8 , 315.56 , 0.0004 ],
35
+
36
+ [SIN , 233.8 , 299.30 , 0.0004 ],
37
+ [SIN , 198.1 , 720.02 , -0.0004 ],
38
+ [SIN , 349.6 , 1079.97 , 0.0003 ],
39
+ [SIN , 241.2 , -44.43 , 0.0003 ]]
40
+ # [SIN , 65.0 , -44.43 , 0.0003 ]], 旧版
41
+ # 太陽の動径の対数
42
+ # @private
43
+ P3Q =
44
+ [[COS , 356.53 , 359.990504 , -0.007261 ,-1.49416E-8],
45
+ [COST , 356.53 , 359.990504 , 0.0000002,-1.49416E-8],
46
+ [COS , 353.1 , 719.981008 , -0.000091 ,-2.98832E-8],
47
+ [COS , 205.8 , 4452.671109 , 0.000013 ,-0.1634E-6 ],
48
+ [COS , 62.0 , 450.4 , 0.000007 ,+1.4E-9 ],
49
+ [COS , 105.0 , 329.6 , 0.000007 ,+8.0E-9 ]]
50
+
51
+ #
52
+ # The Sun
53
+ #
54
+ class Sun < Datum
55
+ class << self
56
+
57
+ include Ephemeris
58
+
59
+ S0=[356.531, 359.990504, -1.49416E-8] # 太陽の中心差の位相
60
+ S1=[ 1.9159, -4.8E-5 , -1.44444E-9] # 太陽の中心差の振幅
61
+
62
+ # 視黄経 / CIRCLE
63
+ #
64
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
65
+ # @param [When::TM::TemporalPosition] t
66
+ #
67
+ # @return [Numeric]
68
+ #
69
+ def true_longitude(t)
70
+ y = julian_year_from_1975(+t)
71
+ return (sind(S0[0]+y*(S0[1]+y*S0[2]))*(S1[0]+y*(S1[1]+y*S1[2])) +
72
+ trigonometric(y, P3L)) / 360.0 + 1974.0
73
+ end
74
+
75
+ # 距離 / AU
76
+ #
77
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
78
+ # @param [When::TM::TemporalPosition] t
79
+ #
80
+ # @return [Numeric]
81
+ #
82
+ def pi(t)
83
+ return 10.0**(0.000030+trigonometric(julian_year_from_1975(+t), P3Q))
84
+ end
85
+
86
+ # 平均黄経 / CIRCLE
87
+ #
88
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
89
+ # @param [When::TM::TemporalPosition] t
90
+ #
91
+ # @return [Numeric]
92
+ #
93
+ def mean_longitude(t)
94
+ return trigonometric(julian_year_from_1975(+t), P3L, 0.0, 1) / 360.0 + 1974.0
95
+ end
96
+ end
97
+
98
+ # 位置 (黄道座標)
99
+ #
100
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
101
+ # @param [When::TM::TemporalPosition] t
102
+ #
103
+ # @return [When::Ephemeris::Coords]
104
+ #
105
+ def _coords(t)
106
+ Coords.polar(0, 0, 0, 0)
107
+ end
108
+
109
+ # 視黄経 / CIRCLE
110
+ #
111
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
112
+ # @param [When::TM::TemporalPosition] t
113
+ #
114
+ # @return [0]
115
+ #
116
+ def true_longitude(t)
117
+ 0
118
+ end
119
+
120
+ # 平均黄経 / CIRCLE
121
+ #
122
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
123
+ # @param [When::TM::TemporalPosition] t
124
+ #
125
+ # @return [0]
126
+ #
127
+ def mean_longitude(t)
128
+ 0
129
+ end
130
+
131
+ # 平均運動 / (DEG/YEAR)
132
+ #
133
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
134
+ # @param [When::TM::TemporalPosition] t
135
+ #
136
+ # @return [0]
137
+ #
138
+ def mean_motion
139
+ 0
140
+ end
141
+
142
+ # オブジェクトの生成
143
+ # @private
144
+ def initialize(*args)
145
+ options = [args.pop] if args[-1].kind_of?(Hash)
146
+ surface_radius, aberration, luminosity, *rest = args
147
+ surface_radius ||= 696000.0
148
+ aberration ||= 0.00000
149
+ luminosity ||= 4.58
150
+ args = [surface_radius, aberration, luminosity] + rest
151
+ args += options if options
152
+ super(*args)
153
+ end
154
+ end
155
+
156
+ #
157
+ # The Earth
158
+ #
159
+ class Earth < Datum
160
+
161
+ # 地球の位置 (黄道座標)
162
+ #
163
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
164
+ # @param [When::TM::TemporalPosition] t
165
+ #
166
+ # @return [When::Ephemeris::Coords]
167
+ #
168
+ def _coords(t)
169
+ t = +t
170
+ radius = Sun.pi(t)
171
+ dl = 0.5 + @aberration / radius / 360 # 略算式に含まれる光行差をキャンセルする
172
+ Coords.polar(Sun.true_longitude(t)+dl, 0, radius, Sun.mean_longitude(t)+dl)
173
+ end
174
+
175
+ # 地球の平均運動 / (DEG/YEAR)
176
+ #
177
+ # @return [Numeric]
178
+ #
179
+ def mean_motion
180
+ P3L[0][2]
181
+ end
182
+
183
+ # オブジェクトの生成
184
+ # @private
185
+ def initialize(*args)
186
+ options = {
187
+ 'shape' => [0.998327112, +0.001676399, -0.000003519, -11.514/60.0],
188
+ 'sid' => [6.697375, 2400.0513369, 0.0000259],
189
+ 'zeros' => {'Z'=>0, 'A'=>-0.58555, '0'=>-0.85255, 'T'=>-7.36111},
190
+ 'air' => [10.0, 0.40, 20.0]
191
+ }
192
+ options.update(args.pop) if args[-1].kind_of?(Hash)
193
+ surface_radius, aberration, luminosity, *rest = args
194
+ surface_radius ||= 6378.14
195
+ aberration ||= 0.0056932
196
+ luminosity ||= -3.50
197
+ args = [surface_radius, aberration, luminosity] + rest + [options]
198
+ super(*args)
199
+ end
200
+ end
201
+
202
+ #
203
+ # Typical Geometrical Datum
204
+ #
205
+ # provisionally same as When::Ephemeris::Earth
206
+ #
207
+ class JGD2000 < Earth # TODO
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,227 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2012 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
+ ThaiTerms = [self, [
12
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
13
+ "locale:[=en:, ja=ja:, alias]",
14
+ "names:[ThaiTerms]",
15
+ "[ThaiLuniSolar=en:Thai_lunar_calendar, タイ太陰太陽暦=ja:%E3%83%81%E3%83%A3%E3%83%B3%E3%83%88%E3%83%A9%E3%82%AB%E3%83%86%E3%82%A3]"
16
+ ]]
17
+ end
18
+
19
+ module CalendarTypes
20
+
21
+ #
22
+ # The Calendar of Thai people in China
23
+ #
24
+ class ThaiC < TableBased
25
+
26
+ NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
27
+ LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9&,9*,9,9<,10,10<,11,11<,12,12<'
28
+
29
+ # ソンクラーン - 太陽の白羊宮入り
30
+ #
31
+ # @param [Integer] y 年
32
+ #
33
+ # @return [Integer] ソンクラーンのユリウス日
34
+ #
35
+ def songkran_(y)
36
+ e = _eph(y)
37
+ return @origin_of_LSC - 1 + e['H'][0]
38
+ end
39
+
40
+ private
41
+
42
+ # ThaiC+オブジェクトの性質定義を初期設定します。
43
+ #
44
+ # オブジェクトの正規化
45
+ # @private
46
+ def _normalize(args=[], options={})
47
+ @label ||= When.Resource('_m:ThaiTerms::ThaiLuniSolar')
48
+
49
+ Rational
50
+ @mean_month ||= 29 + Rational( 373, 703)
51
+ @mean_year ||= 365 + Rational(25876, 100000)
52
+ @epoch_in_CE ||= 638
53
+ @origin_of_MSC ||= 0 # 638 + 543
54
+ @origin_of_LSC ||= 1954168
55
+ @origin_of_MSC = @origin_of_MSC.to_i
56
+ @origin_of_LSC = @origin_of_LSC.to_i
57
+
58
+ intercalary_month = When.Resource('_m:IndianTerms::IntercalaryMonth::*')
59
+ @indices ||= [
60
+ Coordinates::Index.new({:branch=>{0 => intercalary_month[0],
61
+ 0.5 => intercalary_month[1],
62
+ -1.5 => intercalary_month[2],
63
+ -1 => intercalary_month[3]},
64
+ :trunk =>When.Resource('_m:IndianTerms::LunarMonth::*')}),
65
+ Coordinates::Index.new
66
+ ]
67
+ @rule_table ||= {
68
+ 354 => {'Length'=>[15,15,15,14]*6, 'IDs' => NormalIDs},
69
+ 355 => {'Length'=>[15,15,15,14]*3 + [15]*4 + [15,15,15,14]*2, 'IDs' => NormalIDs},
70
+ 356 => {'Length'=>[15,15,15,14]*3 + [15]*7 + [14] + [15]*4, 'IDs' => NormalIDs},
71
+ 383 => {'Length'=>[15,14,15,15]*6 + [15,14], 'IDs' => LeapIDs},
72
+ 384 => {'Length'=>[15,15,15,14]*4 + [15]*2 + [15,15,15,14]*2, 'IDs' => LeapIDs}
73
+ }
74
+
75
+ super
76
+ end
77
+
78
+ # 年初の通日
79
+ #
80
+ # @param [Array<Numeric>] date ( 年 )
81
+ #
82
+ # @return [Integer] 年初の通日
83
+ #
84
+ def _sdn_(date)
85
+ y = +date[0]
86
+ e0 = _thai(y, 0)[0]
87
+ e1 = _thai(y+1,0)[0]
88
+ e0['T'] -= 1 if (e1['T']-e0['T'] == 353)
89
+ return @origin_of_LSC - 1 + e0['T'] - 30*3 - 29*2
90
+ end
91
+
92
+ # y で指定した年の暦定数を返します。
93
+ #
94
+ # @param [Integer] y 年
95
+ #
96
+ # @return [Hash]
97
+ #
98
+ def _eph(y) # C
99
+ h = (y+4).divmod(9)[0] # y
100
+ h = (y-h).divmod(3)[0] # z
101
+ h = (y+1-h).divmod(2)[0] # r (2 => h?)
102
+ h = (36525876*y+149049-h).divmod(100000) # s
103
+ a = (h[0]*11+633-((h[0]+7368).divmod(8878))[0]).divmod(692)
104
+ m = (h[0]+a[0]+0).divmod(30)
105
+ return {'H'=>h, 'A'=>a, 'M'=>m}
106
+ end
107
+
108
+ # y で指定した年の平閏、8月の大小を判定します。
109
+ #
110
+ # @param [Integer] y 年
111
+ # @param [Integer] dir 前後の閏状態を表すコード
112
+ #
113
+ # @return [Array<Hash, String>]
114
+ #
115
+ def _thai(y,dir)
116
+ # 諸元の計算
117
+ e = _eph(y)
118
+ k = 800*125 - e['H'][1]
119
+ t = e['M'][1]
120
+
121
+ # Jyaistha 大の判定
122
+ b = ((e['A'][1]<126) && (k<=207*125)) || ((e['A'][1]<137) && (k> 207*125))
123
+
124
+ # 閏年の判定
125
+ c = ((t<6) || (t>24))
126
+ c = true if ((t==24) && (_thai(y+1,+1)[1]< 'C'))
127
+ c = false if ((t==25) && (_thai(y+1,+1)[1]>='C'))
128
+
129
+ # Caitra 月 0 日
130
+ e['T'] = e['H'][0] - t
131
+ e['T'] -= 1 if (t==0)
132
+ e['T'] -= 29 if (c && (t<=6))
133
+ e['b'] = b
134
+ e['c'] = c
135
+ e['t'] = t
136
+ return e,' '
137
+ end
138
+ end
139
+
140
+ #
141
+ # The Calendar of central Thailand
142
+ #
143
+ class ThaiB < ThaiC
144
+
145
+ YEAR_TYPE = {'A'=>354, 'B'=>355, 'C'=>384, 'D'=>384, 'E'=>384}
146
+
147
+ NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
148
+ LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8&,8*,8,8<,9,9<,10,10<,11,11<,12,12<'
149
+
150
+ private
151
+
152
+ # オブジェクトの正規化
153
+ #
154
+ def _normalize(args=[], options={})
155
+ @rule_table ||= {
156
+ 354 => {'Length'=>[15,14,15,15]*6, 'IDs' => NormalIDs},
157
+ 355 => {'Length'=>[15,14,15,15]*3 + [15]*4 + [15,14,15,15]*2, 'IDs' => NormalIDs},
158
+ 384 => {'Length'=>[15,14,15,15]*4 + [15]*2 + [15,14,15,15]*2, 'IDs' => LeapIDs }
159
+ }
160
+
161
+ super
162
+ end
163
+
164
+ # 年初の通日
165
+ #
166
+ # @param [Array<Numeric>] date ( 年 )
167
+ #
168
+ # @return [Integer] 年初の通日
169
+ #
170
+ def _sdn_(date)
171
+ y = +date[0]
172
+ e0,dir0 = _thai(y, 0)
173
+ e1,dir1 = _thai(y+1,0)
174
+ e0['T'] -= 1 if (e1['T'] - e0['T'] < YEAR_TYPE[dir0])
175
+ return @origin_of_LSC + e0['T'] - 29*2 - 30*2
176
+ end
177
+
178
+ # y で指定した年の暦定数を返します。
179
+ #
180
+ # @param [Integer] y 年
181
+ #
182
+ # @return [Hash]
183
+ #
184
+ def _eph(y) # C
185
+ h = (y*292207+373+800*1).divmod(800)
186
+ # u = (h[0]+2611).divmod(3232)
187
+ a = (h[0]*11+650).divmod(692)
188
+ m = (h[0]+a[0]+0).divmod(30)
189
+ h[1] *= 125
190
+ return {'H'=>h, 'A'=>a, 'M'=>m}
191
+ end
192
+
193
+ # y で指定した年の平閏、8月の大小を判定します。
194
+ #
195
+ # @param [Integer] y 年
196
+ # @param [Integer] dir 前後の閏状態を表すコード
197
+ #
198
+ # @return [Array<Hash, String>]
199
+ #
200
+ def _thai(y,dir)
201
+ # 諸元の計算
202
+ e,w = super(y,dir)
203
+
204
+ # カレンダーのタイプ
205
+ if (e['c'])
206
+ if (!e['b'])
207
+ return e,'C' # 普通の閏年
208
+ elsif ((0<e['t']) && (e['t']<6))
209
+ return e,'D' # 前年大の閏年
210
+ else
211
+ return e,'E' # 翌年大の閏年
212
+ end
213
+ else
214
+ if (e['b'])
215
+ return e,'B' # 大の平年
216
+ elsif ((dir != -1) && (_thai(y+1,+1)[1]=='D'))
217
+ return e,'B' # 大の平年
218
+ elsif ((dir != +1) && (_thai(y-1,-1)[1]=='E'))
219
+ return e,'B' # 大の平年
220
+ else
221
+ return e,'A' # 小の平年
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
@@ -0,0 +1,233 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2012 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
+ TibetanTerms = [self, [
12
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
13
+ "locale:[=en:, ja=ja:, alias]",
14
+ "names:[TibetanTerms]",
15
+ "[Tibetan=en:Tibetan_calendar, 時輪暦=ja:%E3%83%81%E3%83%99%E3%83%83%E3%83%88%E6%9A%A6]",
16
+
17
+ [self,
18
+ "names:[IntercalaryMonth=en:Intercalation, 閏月]",
19
+ "[%s=, %s宿月= ]",
20
+ "[Adika %s=, 閏%s宿月=]"
21
+ ],
22
+
23
+ [self,
24
+ "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%E9%96%8F]",
25
+ "[Double %s=, 欠=]",
26
+ "[Intercalary %s=, 重=]"
27
+ ],
28
+
29
+ [self,
30
+ "names:[Month, 月=ja:%E6%9C%88_(%E6%9A%A6)]",
31
+ "[Margasirsa, 觜=]",
32
+ "[Pausha, 鬼=]",
33
+ "[Magha, 星=]",
34
+ "[Phalguna, 翼=]",
35
+ "[Chaitra, 角=]",
36
+ "[Vaisakha, 氐=]",
37
+ "[Jyeshta, 心=]",
38
+ "[Ashada, 箕=]",
39
+ "[Sravana, 牛=]",
40
+ "[Bhadrapada, 室=]",
41
+ "[Asvina, 婁=]",
42
+ "[Kartika, 昴=]"
43
+ ]
44
+ ]]
45
+ end
46
+
47
+ module CalendarTypes
48
+
49
+ #
50
+ # Tibetan Calendar
51
+ #
52
+ class Tibetan < EphemerisBasedLuniSolar
53
+
54
+ #
55
+ # 定数
56
+ #
57
+ Y0 = 1827 # 元期の西暦年
58
+ D0 = 2388440 # 元期のユリウス日
59
+ V0 = (6.0+45/60.0) # 白羊宮入りのオフセット
60
+ Am = (2.0+1.0/126) # 月の近地点
61
+
62
+ Rem = 1 # 余りのインデックス
63
+ Quot = 0 # 商のインデックス
64
+ Ddd = 0 # 差分のインデックス
65
+ Sum = 1 # 積算値のインデックス
66
+ Jm = [ # 月の中心差
67
+ [ 5, 0], [ 5, 5], [ 5,10], [ 5,15], [ 4,19], [ 3,22], [ 2,24],
68
+ [ 1,25], [-1,24], [-2,22], [-3,19], [-4,15], [-5,10], [-5, 5],
69
+ [-5, 0], [-5,-5]
70
+ ]
71
+ Js = [ # 太陽の中心差
72
+ [ 6, 0], [ 6, 6], [ 4,10], [ 1,11], [-1,10], [-4, 6], [-6, 0],
73
+ [-6,-6]
74
+ ]
75
+
76
+ private
77
+
78
+ # オブジェクトの正規化
79
+ #
80
+ # @type = 体系派なら 1, 作用派なら 2
81
+ # @parameter = 太陽と月の位相計算用のテーブル
82
+ #
83
+ def _normalize(args=[], options={})
84
+ intercalary_month = When.Resource('_m:TibetanTerms::IntercalaryMonth::*')
85
+ intercalary_day = When.Resource('_m:TibetanTerms::IntercalaryDay::*')
86
+ @indices ||= [
87
+ Coordinates::Index.new({:branch=>{0=>intercalary_month[0], 1=>intercalary_month[1]},
88
+ :trunk=>When.Resource('_m:TibetanTerms::Month::*'), :shift=>2}),
89
+ Coordinates::Index.new({:branch=>{-2=>intercalary_day[0], -1=>intercalary_day[1]}})
90
+ ]
91
+ @label ||= When.Resource('_m:TibetanTerms::Tibetan')
92
+ @epoch_in_CE ||= 0
93
+ @type ||= 1
94
+ @parameter = case @type.to_i
95
+ when 1
96
+ {'M0'=>(60+15),
97
+ 'Wo'=>Z(29,31,50,0,480),
98
+ 'W0'=>Z( 3,37,43,2,140),
99
+ 'Wd'=>Z( 0,59, 3,4, 16),
100
+ 'So'=>K( 2,10,58,1, 17),
101
+ 'S0'=>K(24,59, 6,1, 41),
102
+ 'Sd'=>K( 0, 4,21,5, 43),
103
+ 'A0'=>22.0
104
+ }
105
+ when 2
106
+ {'M0'=>(64+15),
107
+ 'Wo'=>Z(29,31,50,0, 0),
108
+ 'W0'=>Z( 3,21,20,0, 0),
109
+ 'Wd'=>Z( 0,59, 3,4, 0),
110
+ 'So'=>L( 2,10,58,2, 10),
111
+ 'S0'=>L(25,42,12,1, 11),
112
+ 'Sd'=>L( 0, 4,21,5, 9),
113
+ 'A0'=>(22.0+28.0/126)
114
+ }
115
+ end
116
+ super
117
+ end
118
+
119
+ # @private
120
+ def Z(z,q,d,m,s)
121
+ ((((s/707.0+m)/6.0+d)/60.0+q)/60.0+z)
122
+ end
123
+
124
+ # @private
125
+ def K(k,q,d,m,s)
126
+ ((((s/67.0+m)/6.0+d)/60.0+q)/60.0+k)
127
+ end
128
+
129
+ # @private
130
+ def L(k,q,d,m,s)
131
+ ((((s/13.0+m)/6.0+d)/60.0+q)/60.0+k)
132
+ end
133
+
134
+ #
135
+ # 太陽または月の位置の中心差による差分
136
+ # @private
137
+ def _sn(t,m,p)
138
+ t0 = t.floor
139
+ r = t0.divmod(m)
140
+ s = (1.0/60.0)
141
+ s = -s unless r[Quot] % 2 == 0
142
+ return s * (p[r[Rem]][Sum] + (t-t0) * p[r[Rem]+1][Ddd])
143
+ end
144
+
145
+ # 積月計算
146
+ #
147
+ # @param [Integer] y 年
148
+ # @param [Integer] m 年(デフォルト 0)
149
+ #
150
+ # @return [Integer] 積月
151
+ #
152
+ # m に 0 以外を指定することで、積月の跳び(閏)を検出できる
153
+ #
154
+ def _new_year_month_(y, m=0)
155
+ mm = (y-Y0) * 12 + (m - 2)
156
+ mm += (mm * 2 + @parameter['M0']).divmod(65)[Quot]
157
+ return mm
158
+ end
159
+
160
+ # 月初の通日
161
+ #
162
+ # @param [Integer] m 通月
163
+ #
164
+ # @return [Integer] 月初の通日
165
+ #
166
+ def _new_month_(m)
167
+ sdn = [0,-1].map {|d| _new_month_day(m, d)}
168
+ sdn[0]-sdn[1] == 1 ? sdn[0] : sdn[0]-1
169
+ end
170
+
171
+ #
172
+ # 積日計算
173
+ #
174
+ # @param [Integer] m 通月
175
+ # @param [Integer] d 日
176
+ #
177
+ # @return [Integer] 積日
178
+ #
179
+ # 積日の跳び(重日)、ダブり(欠日)を検出できる
180
+ #
181
+ def _new_month_day_(m, d)
182
+ d += 1
183
+ w = m * @parameter['Wo'] + @parameter['W0'] + d * @parameter['Wd'] # 中曜
184
+ s = m * @parameter['So'] + @parameter['S0'] + d * @parameter['Sd'] # 中日
185
+ sdn = D0 + w
186
+ sdn += _sn(m*Am+@parameter['A0']+d, 14, Jm)
187
+ sdn -= _sn((s-V0)*(60.0/135.0), 6, Js)
188
+ return sdn.floor
189
+ end
190
+
191
+ #
192
+ # 日時要素の翻訳表の取得
193
+ #
194
+ # @overload _ids_(date)
195
+ # @param [Array<Numeric>] date ( 年 )
196
+ # @return [Array<When::Coordinates::Pair>] 1年の月の配置の翻訳表
197
+ #
198
+ # @overload _ids_(date)
199
+ # @param [Array<Numeric>] date ( 年 月 )
200
+ # @return [Array<When::Coordinates::Pair>] 1月の日の配置の翻訳表
201
+ # @note 月は 0 始まりの通番
202
+ #
203
+ def _ids_(date)
204
+ y, m = date
205
+ y = +y
206
+ mm = _new_year_month(y)
207
+ return (_table(mm, 12, 0, 1) {|i| _new_year_month(y,i)}) unless m
208
+ mm += m
209
+ table = _table(_new_month_day(mm,0), 30, 1, 0) {|i| _new_month_day(mm,i)}
210
+ table[1,0] = Pair._force_pair(1,1) unless _new_month(mm) == _new_month_day(mm,0)
211
+ return table
212
+ end
213
+
214
+ # 日時要素の翻訳表の作成
215
+ # @private
216
+ def _table(b0, n, k0, k1)
217
+ table = [Pair._force_pair(1,0)]
218
+ (1..n).each do |i|
219
+ b1 = yield(i)
220
+ case b1-b0
221
+ when 0 ; table[-1] = Pair._force_pair(i, -2)
222
+ when 1 ; table << Pair._force_pair(i+1, 0 )
223
+ when 2 ; table << Pair._force_pair(i+k0,k1) << Pair._force_pair(i+1, k0)
224
+ else ; raise ArgumentError, "Irregal date span: #{b1-b0}"
225
+ end
226
+ b0 = b1
227
+ end
228
+ table.pop while table[-1].trunk > n
229
+ return table
230
+ end
231
+ end
232
+ end
233
+ end