when_exe 0.2.100 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.ja.txt +25 -25
- data/LICENSE.txt +31 -31
- data/bin/irb.rc +5 -0
- data/bin/locales.rb +2 -2
- data/bin/when.rb +16 -0
- data/bin/when.rb.config +7 -0
- data/lib/when_exe.rb +616 -14
- data/lib/when_exe/basictypes.rb +615 -0
- data/lib/when_exe/calendartypes.rb +1700 -0
- data/lib/when_exe/coordinates.rb +1936 -0
- data/lib/when_exe/core/compatibility.rb +54 -0
- data/lib/when_exe/core/duration.rb +72 -72
- data/lib/when_exe/core/extension.rb +382 -0
- data/lib/when_exe/ephemeris.rb +1845 -0
- data/lib/when_exe/googlecalendar.rb +140 -0
- data/lib/when_exe/icalendar.rb +1587 -0
- data/lib/when_exe/inspect.rb +1237 -0
- data/lib/when_exe/locales/af.rb +90 -0
- data/lib/when_exe/locales/ar.rb +145 -0
- data/lib/when_exe/locales/az.rb +90 -0
- data/lib/when_exe/locales/bg.rb +90 -0
- data/lib/when_exe/locales/bn.rb +94 -0
- data/lib/when_exe/locales/bs.rb +121 -0
- data/lib/when_exe/locales/ca.rb +92 -0
- data/lib/when_exe/locales/cs.rb +107 -0
- data/lib/when_exe/locales/cy.rb +150 -0
- data/lib/when_exe/locales/da.rb +84 -0
- data/lib/when_exe/locales/de.rb +92 -0
- data/lib/when_exe/locales/de_AT.rb +92 -0
- data/lib/when_exe/locales/de_CH.rb +92 -0
- data/lib/when_exe/locales/el.rb +93 -0
- data/lib/when_exe/locales/en.rb +88 -0
- data/lib/when_exe/locales/en_AU.rb +88 -0
- data/lib/when_exe/locales/en_CA.rb +88 -0
- data/lib/when_exe/locales/en_GB.rb +88 -0
- data/lib/when_exe/locales/en_IN.rb +88 -0
- data/lib/when_exe/locales/en_NZ.rb +88 -0
- data/lib/when_exe/locales/eo.rb +89 -0
- data/lib/when_exe/locales/es.rb +84 -0
- data/lib/when_exe/locales/es_419.rb +84 -0
- data/lib/when_exe/locales/es_AR.rb +84 -0
- data/lib/when_exe/locales/es_CL.rb +84 -0
- data/lib/when_exe/locales/es_CO.rb +84 -0
- data/lib/when_exe/locales/es_MX.rb +84 -0
- data/lib/when_exe/locales/es_PE.rb +85 -0
- data/lib/when_exe/locales/es_VE.rb +84 -0
- data/lib/when_exe/locales/et.rb +94 -0
- data/lib/when_exe/locales/eu.rb +95 -0
- data/lib/when_exe/locales/fa.rb +80 -0
- data/lib/when_exe/locales/fi.rb +89 -0
- data/lib/when_exe/locales/fr.rb +88 -0
- data/lib/when_exe/locales/fr_CA.rb +88 -0
- data/lib/when_exe/locales/fr_CH.rb +88 -0
- data/lib/when_exe/locales/gl.rb +81 -0
- data/lib/when_exe/locales/he.rb +84 -0
- data/lib/when_exe/locales/hi.rb +80 -0
- data/lib/when_exe/locales/hi_IN.rb +84 -0
- data/lib/when_exe/locales/hr.rb +128 -0
- data/lib/when_exe/locales/hu.rb +84 -0
- data/lib/when_exe/locales/id.rb +89 -0
- data/lib/when_exe/locales/is.rb +89 -0
- data/lib/when_exe/locales/it.rb +87 -0
- data/lib/when_exe/locales/it_CH.rb +87 -0
- data/lib/when_exe/locales/ja.rb +78 -0
- data/lib/when_exe/locales/kn.rb +86 -0
- data/lib/when_exe/locales/ko.rb +78 -0
- data/lib/when_exe/locales/links.rb +2342 -0
- data/lib/when_exe/locales/lo.rb +123 -0
- data/lib/when_exe/locales/locales.rb +91 -0
- data/lib/when_exe/locales/lt.rb +111 -0
- data/lib/when_exe/locales/lv.rb +118 -0
- data/lib/when_exe/locales/mk.rb +93 -0
- data/lib/when_exe/locales/mn.rb +80 -0
- data/lib/when_exe/locales/nb.rb +81 -0
- data/lib/when_exe/locales/ne.rb +81 -0
- data/lib/when_exe/locales/nl.rb +92 -0
- data/lib/when_exe/locales/nn.rb +73 -0
- data/lib/when_exe/locales/or.rb +84 -0
- data/lib/when_exe/locales/pl.rb +128 -0
- data/lib/when_exe/locales/pt.rb +88 -0
- data/lib/when_exe/locales/pt_BR.rb +88 -0
- data/lib/when_exe/locales/rm.rb +143 -0
- data/lib/when_exe/locales/ro.rb +105 -0
- data/lib/when_exe/locales/ru.rb +128 -0
- data/lib/when_exe/locales/sk.rb +109 -0
- data/lib/when_exe/locales/sl.rb +122 -0
- data/lib/when_exe/locales/sr.rb +122 -0
- data/lib/when_exe/locales/sv.rb +83 -0
- data/lib/when_exe/locales/sw.rb +89 -0
- data/lib/when_exe/locales/th.rb +78 -0
- data/lib/when_exe/locales/tl.rb +99 -0
- data/lib/when_exe/locales/tr.rb +96 -0
- data/lib/when_exe/locales/uk.rb +128 -0
- data/lib/when_exe/locales/uz.rb +128 -0
- data/lib/when_exe/locales/vi.rb +94 -0
- data/lib/when_exe/locales/wo.rb +82 -0
- data/lib/when_exe/locales/zh_CN.rb +77 -0
- data/lib/when_exe/locales/zh_HK.rb +77 -0
- data/lib/when_exe/locales/zh_TW.rb +77 -0
- data/lib/when_exe/mini_application.rb +252 -0
- data/lib/when_exe/parts/enumerator.rb +472 -0
- data/lib/when_exe/parts/geometric_complex.rb +379 -0
- data/lib/when_exe/parts/locale.rb +513 -0
- data/lib/when_exe/parts/method_cash.rb +207 -0
- data/lib/when_exe/parts/resource.rb +806 -0
- data/lib/when_exe/parts/timezone.rb +182 -0
- data/lib/when_exe/region/bahai.rb +145 -0
- data/lib/when_exe/region/balinese.rb +627 -0
- data/lib/when_exe/region/chinese.rb +896 -0
- data/lib/when_exe/region/chinese_calendar.rb +919 -0
- data/lib/when_exe/region/chinese_epoch.rb +1245 -0
- data/lib/when_exe/region/christian.rb +644 -0
- data/lib/when_exe/region/far_east.rb +192 -0
- data/lib/when_exe/region/french.rb +66 -0
- data/lib/when_exe/region/geologicalage.rb +639 -0
- data/lib/when_exe/region/indian.rb +1066 -0
- data/lib/when_exe/region/iranian.rb +66 -0
- data/lib/when_exe/region/islamic.rb +105 -0
- data/lib/when_exe/region/japanese.rb +851 -0
- data/lib/when_exe/region/japanese_notes.rb +964 -0
- data/lib/when_exe/region/japanese_residues.rb +1149 -0
- data/lib/when_exe/region/javanese.rb +228 -0
- data/lib/when_exe/region/jewish.rb +127 -0
- data/lib/when_exe/region/korean.rb +267 -0
- data/lib/when_exe/region/m17n.rb +115 -0
- data/lib/when_exe/region/martian.rb +215 -0
- data/lib/when_exe/region/mayan.rb +122 -0
- data/lib/when_exe/region/moon.rb +333 -0
- data/lib/when_exe/region/nihon_shoki.rb +73 -0
- data/lib/when_exe/region/planets.rb +585 -0
- data/lib/when_exe/region/pope.rb +298 -0
- data/lib/when_exe/region/residue.rb +229 -0
- data/lib/when_exe/region/roman.rb +325 -0
- data/lib/when_exe/region/ryukyu.rb +98 -0
- data/lib/when_exe/region/shire.rb +254 -0
- data/lib/when_exe/region/sun.rb +210 -0
- data/lib/when_exe/region/thai.rb +227 -0
- data/lib/when_exe/region/tibetan.rb +233 -0
- data/lib/when_exe/region/v50.rb +111 -0
- data/lib/when_exe/region/vietnamese.rb +173 -0
- data/lib/when_exe/region/world.rb +197 -0
- data/lib/when_exe/timestandard.rb +547 -0
- data/lib/when_exe/tmduration.rb +330 -330
- data/lib/when_exe/tmobjects.rb +1295 -0
- data/lib/when_exe/tmposition.rb +1955 -0
- data/lib/when_exe/tmreference.rb +1547 -0
- data/lib/when_exe/version.rb +10 -3
- data/link_to_online_documents +4 -0
- data/test/examples/JapanHolidays.ics +456 -0
- data/test/examples/Millennium.ics +17 -0
- data/test/examples/NewYork.ics +61 -0
- data/test/examples/Residue.m17n +135 -0
- data/test/examples/Spatial.m17n +179 -0
- data/test/examples/Terms.m17n +39 -0
- data/test/examples/Test.ics +53 -0
- data/test/examples/USA-DST.ics +61 -0
- data/test/examples/geometric_complex.rb +41 -0
- data/test/examples/sample.xml +14 -0
- data/test/examples/today.rb +61 -0
- data/test/test.rb +54 -19
- data/test/test.rb.config +1 -0
- data/test/test/basictypes.rb +368 -0
- data/test/test/calendartypes.rb +57 -0
- data/test/test/coordinates.rb +380 -0
- data/test/test/ephemeris.rb +127 -0
- data/test/test/googlecalendar.rb +167 -0
- data/test/test/icalendar.rb +848 -0
- data/test/test/inspect.rb +115 -0
- data/test/test/parts.rb +480 -0
- data/test/test/region/chinese.rb +161 -0
- data/test/test/region/french.rb +33 -0
- data/test/test/region/geologicalage.rb +14 -0
- data/test/test/region/indian.rb +55 -0
- data/test/test/region/iran.rb +54 -0
- data/test/test/region/islamic.rb +18 -0
- data/test/test/region/japanese.rb +62 -0
- data/test/test/region/jewish.rb +61 -0
- data/test/test/region/m17n.rb +181 -0
- data/test/test/region/mayan.rb +78 -0
- data/test/test/region/moon.rb +14 -0
- data/test/test/region/planets.rb +14 -0
- data/test/test/region/residue.rb +123 -0
- data/test/test/region/sun.rb +14 -0
- data/test/test/region/thai.rb +94 -0
- data/test/test/region/tibetan.rb +30 -0
- data/test/test/tmobjects.rb +356 -57
- data/test/test/tmposition.rb +237 -0
- data/test/test/tmreference.rb +95 -0
- data/when_exe.gemspec +2 -2
- metadata +187 -7
- data/doc/COPYING +0 -31
- data/doc/COPYING.ja +0 -25
- 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
|