when_exe 0.3.2 → 0.3.3
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.
- data/LICENSE.ja.txt +25 -25
- data/LICENSE.txt +31 -31
- data/bin/locales.rb +2 -1
- data/bin/when.rb.config +1 -1
- data/lib/when_exe.rb +70 -48
- data/lib/when_exe/basictypes.rb +99 -65
- data/lib/when_exe/calendartypes.rb +40 -178
- data/lib/when_exe/coordinates.rb +156 -62
- data/lib/when_exe/core/compatibility.rb +10 -0
- data/lib/when_exe/core/extension.rb +40 -0
- data/lib/when_exe/ephemeris.rb +112 -50
- data/lib/when_exe/icalendar.rb +125 -91
- data/lib/when_exe/inspect.rb +100 -48
- data/lib/when_exe/locales/ar.rb +48 -48
- data/lib/when_exe/locales/bg.rb +1 -1
- data/lib/when_exe/locales/bs.rb +4 -2
- data/lib/when_exe/locales/ca.rb +1 -1
- data/lib/when_exe/locales/en_CA.rb +3 -4
- data/lib/when_exe/locales/en_IE.rb +88 -0
- data/lib/when_exe/locales/en_US.rb +87 -0
- data/lib/when_exe/locales/es_CR.rb +84 -0
- data/lib/when_exe/locales/es_EC.rb +85 -0
- data/lib/when_exe/locales/es_PA.rb +85 -0
- data/lib/when_exe/locales/fr.rb +39 -39
- data/lib/when_exe/locales/hu.rb +15 -14
- data/lib/when_exe/locales/it.rb +1 -1
- data/lib/when_exe/locales/ja.rb +2 -2
- data/lib/when_exe/locales/locales.rb +7 -0
- data/lib/when_exe/locales/lt.rb +21 -19
- data/lib/when_exe/locales/ms.rb +84 -0
- data/lib/when_exe/locales/nl.rb +2 -2
- data/lib/when_exe/locales/ru.rb +1 -1
- data/lib/when_exe/locales/uk.rb +1 -1
- data/lib/when_exe/locales/ur.rb +84 -0
- data/lib/when_exe/mini_application.rb +44 -43
- data/lib/when_exe/parts/enumerator.rb +3 -3
- data/lib/when_exe/parts/geometric_complex.rb +6 -1
- data/lib/when_exe/parts/locale.rb +49 -18
- data/lib/when_exe/parts/method_cash.rb +61 -0
- data/lib/when_exe/parts/resource.rb +221 -106
- data/lib/when_exe/parts/timezone.rb +70 -33
- data/lib/when_exe/region/bahai.rb +2 -2
- data/lib/when_exe/region/balinese.rb +40 -43
- data/lib/when_exe/region/chinese.rb +93 -33
- data/lib/when_exe/region/chinese_calendar.rb +117 -1
- data/lib/when_exe/region/chinese_epoch.rb +65 -10
- data/lib/when_exe/region/christian.rb +97 -2
- data/lib/when_exe/region/ephemeric_notes.rb +353 -0
- data/lib/when_exe/region/french.rb +1 -1
- data/lib/when_exe/region/geologicalage.rb +171 -171
- data/lib/when_exe/region/indian.rb +18 -14
- data/lib/when_exe/region/iranian.rb +1 -1
- data/lib/when_exe/region/japanese.rb +49 -12
- data/lib/when_exe/region/japanese_notes.rb +838 -507
- data/lib/when_exe/region/japanese_residues.rb +724 -662
- data/lib/when_exe/region/javanese.rb +7 -7
- data/lib/when_exe/region/mayan.rb +19 -17
- data/lib/when_exe/region/nihon_shoki.rb +3 -3
- data/lib/when_exe/region/residue.rb +29 -28
- data/lib/when_exe/region/shire.rb +2 -2
- data/lib/when_exe/region/tibetan.rb +87 -5
- data/lib/when_exe/region/world.rb +1 -1
- data/lib/when_exe/timestandard.rb +85 -7
- data/lib/when_exe/tmobjects.rb +32 -4
- data/lib/when_exe/tmposition.rb +104 -55
- data/lib/when_exe/tmreference.rb +157 -60
- data/lib/when_exe/version.rb +2 -2
- data/test/examples/JapanHolidays.ics +3 -3
- data/test/examples/JapanHolidaysRFC6350.ics +499 -0
- data/test/examples/Residue.m17n +3 -2
- data/test/examples/Spatial.m17n +3 -3
- data/test/examples/USA-DST.ics +27 -27
- data/test/examples/today.rb +1 -1
- data/test/test.rb +4 -2
- data/test/test/basictypes.rb +40 -15
- data/test/test/coordinates.rb +9 -4
- data/test/test/icalendar.rb +24 -14
- data/test/test/inspect.rb +5 -3
- data/test/test/parts.rb +11 -2
- data/test/test/region/chinese.rb +4 -4
- data/test/test/region/civil.rb +124 -0
- data/test/test/region/geologicalage.rb +5 -2
- data/test/test/region/indian.rb +2 -0
- data/test/test/region/japanese.rb +156 -1
- data/test/test/region/jewish.rb +3 -3
- data/test/test/region/m17n.rb +9 -9
- data/test/test/region/mayan.rb +122 -5
- data/test/test/region/residue.rb +1 -1
- data/test/test/tmobjects.rb +27 -64
- data/test/test/tmposition.rb +48 -1
- data/test/test/tmreference.rb +66 -4
- data/when_exe.gemspec +1 -1
- metadata +15 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
=begin
|
|
3
|
-
Copyright (C) 2011-
|
|
3
|
+
Copyright (C) 2011-2014 Takashi SUGA
|
|
4
4
|
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
6
|
=end
|
|
@@ -15,6 +15,36 @@ module When::Parts
|
|
|
15
15
|
#
|
|
16
16
|
class Timezone
|
|
17
17
|
|
|
18
|
+
#
|
|
19
|
+
# When::V::Timezone と Qhwn::Parts::Timezone の抽象基底
|
|
20
|
+
#
|
|
21
|
+
module Base
|
|
22
|
+
# 標準時間帯の時計
|
|
23
|
+
# @return [When::TM::Clock]
|
|
24
|
+
attr_reader :standard
|
|
25
|
+
|
|
26
|
+
# 夏時間帯の時計
|
|
27
|
+
# @return [When::TM::Clock]
|
|
28
|
+
attr_reader :daylight
|
|
29
|
+
|
|
30
|
+
# 夏時間帯と標準時間帯の時間差
|
|
31
|
+
# @return [When::TM:IntervalLength]
|
|
32
|
+
attr_reader :difference
|
|
33
|
+
|
|
34
|
+
# When::TM::TemporalPosition の時間帯を変更して複製する
|
|
35
|
+
#
|
|
36
|
+
# @param [When::TM::CalDate, When::TM::DateAndTime, When::TM::JulianDate] date
|
|
37
|
+
# @param [Hash] options see {When::TM::TemporalPosition._instance}
|
|
38
|
+
#
|
|
39
|
+
# @return [When::TM::DateAndTime, When::TM::JulianDate]
|
|
40
|
+
#
|
|
41
|
+
def ^(date, options={})
|
|
42
|
+
options = date._attr.merge({:clock=>self}).merge(options)
|
|
43
|
+
return When::TM::JulianDate.dynamical_time(date.dynamical_time, options) unless date.frame.kind_of?(When::TM::Calendar)
|
|
44
|
+
date.frame.jul_trans(When::TM::JulianDate.dynamical_time(date.dynamical_time), options)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
18
48
|
class << self
|
|
19
49
|
include Resource::Pool
|
|
20
50
|
|
|
@@ -64,22 +94,12 @@ module When::Parts
|
|
|
64
94
|
end
|
|
65
95
|
end
|
|
66
96
|
|
|
97
|
+
include Base
|
|
98
|
+
|
|
67
99
|
# ラップしている TZInfo::Timezone インスタンス
|
|
68
100
|
# @return [TZInfo::Timezone]
|
|
69
101
|
attr_reader :timezone
|
|
70
102
|
|
|
71
|
-
# 標準時間帯の時計
|
|
72
|
-
# @return [When::TM::Clock]
|
|
73
|
-
attr_reader :standard
|
|
74
|
-
|
|
75
|
-
# 夏時間帯の時計
|
|
76
|
-
# @return [When::TM::Clock]
|
|
77
|
-
attr_reader :daylight
|
|
78
|
-
|
|
79
|
-
# 夏時間帯と標準時間帯の時間差
|
|
80
|
-
# @return [When::TM:IntervalLength]
|
|
81
|
-
attr_reader :difference
|
|
82
|
-
|
|
83
103
|
# ユニーク識別名
|
|
84
104
|
# @return [String]
|
|
85
105
|
def label
|
|
@@ -98,6 +118,14 @@ module When::Parts
|
|
|
98
118
|
self.class.tz_info[label].latitude
|
|
99
119
|
end
|
|
100
120
|
|
|
121
|
+
# 時間帯を代表する都市の空間位置
|
|
122
|
+
# @return [When::Coordinates::Spatial]
|
|
123
|
+
def location
|
|
124
|
+
return @location if @location
|
|
125
|
+
tzinfo = self.class.tz_info[label]
|
|
126
|
+
@location = When.Resource("_l:long=#{tzinfo.longitude.to_f}&lat=#{tzinfo.latitude.to_f}&label=#{label}")
|
|
127
|
+
end
|
|
128
|
+
|
|
101
129
|
# 時分秒のインデクス
|
|
102
130
|
# @return [Array<When::Coordinates::Index>]
|
|
103
131
|
attr_reader :indices
|
|
@@ -131,8 +159,8 @@ module When::Parts
|
|
|
131
159
|
}
|
|
132
160
|
end
|
|
133
161
|
end
|
|
134
|
-
|
|
135
|
-
@standard
|
|
162
|
+
dst, std = _offsets(Time.now.to_i)
|
|
163
|
+
@standard = When::TM::Clock.new({:zone=>std, :tz_prop=>self})
|
|
136
164
|
if std == dst
|
|
137
165
|
@daylight = @standard
|
|
138
166
|
@difference = 0
|
|
@@ -144,16 +172,20 @@ module When::Parts
|
|
|
144
172
|
end
|
|
145
173
|
|
|
146
174
|
# @private
|
|
147
|
-
def _daylight(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
175
|
+
def _daylight(time)
|
|
176
|
+
frame, cal_date, clk_time = time
|
|
177
|
+
clocks = {}
|
|
178
|
+
if clk_time
|
|
179
|
+
time = frame.to_universal_time(cal_date, clk_time, @standard)
|
|
180
|
+
offsets = _offsets((time/When::TM::Duration::SECOND).floor)
|
|
181
|
+
offsets.each do |offset|
|
|
182
|
+
clocks[offset] ||= When::TM::Clock.new({:zone=>offset, :tz_prop=>self})
|
|
183
|
+
return clocks[offsets[0]] if @timezone.period_for_utc(
|
|
184
|
+
(frame.to_universal_time(cal_date, clk_time, clocks[offset])/When::TM::Duration::SECOND).floor).dst?
|
|
185
|
+
end
|
|
156
186
|
end
|
|
187
|
+
offset = @timezone.period_for_utc((time/When::TM::Duration::SECOND).floor).utc_total_offset
|
|
188
|
+
clocks[offset] || When::TM::Clock.new({:zone=>offset, :tz_prop=>self})
|
|
157
189
|
end
|
|
158
190
|
|
|
159
191
|
# @private
|
|
@@ -164,17 +196,17 @@ module When::Parts
|
|
|
164
196
|
private
|
|
165
197
|
|
|
166
198
|
def _offsets(time)
|
|
167
|
-
now
|
|
168
|
-
past
|
|
169
|
-
future
|
|
170
|
-
std
|
|
171
|
-
dst
|
|
199
|
+
now = @timezone.period_for_utc(time)
|
|
200
|
+
past = @timezone.period_for_utc(now.utc_start-1) if now.utc_start
|
|
201
|
+
future = @timezone.period_for_utc(now.utc_end) if now.utc_end
|
|
202
|
+
std = now.utc_offset
|
|
203
|
+
dst = now.utc_total_offset
|
|
172
204
|
[past, future].each do |period|
|
|
173
205
|
next unless period
|
|
174
|
-
std
|
|
175
|
-
dst
|
|
206
|
+
std = period.utc_offset if std > period.utc_offset
|
|
207
|
+
dst = period.utc_total_offset if dst < period.utc_total_offset
|
|
176
208
|
end
|
|
177
|
-
[
|
|
209
|
+
[dst, std]
|
|
178
210
|
end
|
|
179
211
|
|
|
180
212
|
# その他のメソッド
|
|
@@ -182,7 +214,12 @@ module When::Parts
|
|
|
182
214
|
# 処理を first (type: When::TM::(Temporal)Position) に委譲する
|
|
183
215
|
#
|
|
184
216
|
def method_missing(name, *args, &block)
|
|
185
|
-
|
|
217
|
+
self.class.module_eval %Q{
|
|
218
|
+
def #{name}(*args, &block)
|
|
219
|
+
timezone.send("#{name}", *args, &block)
|
|
220
|
+
end
|
|
221
|
+
} unless When::Parts::MethodCash.escape(name)
|
|
222
|
+
timezone.send(name, *args, &block)
|
|
186
223
|
end
|
|
187
224
|
end
|
|
188
225
|
end
|
|
@@ -100,8 +100,8 @@ module When
|
|
|
100
100
|
def ephemeris_equinox(date)
|
|
101
101
|
equinox_time = @engine.cn_to_time(+date[0])
|
|
102
102
|
equinox_date = (equinox_time + 0.5 + @engine.long/360.0).floor
|
|
103
|
-
|
|
104
|
-
(
|
|
103
|
+
sunset_time = @engine.sunset(equinox_date)
|
|
104
|
+
(sunset_time <= equinox_time) ? equinox_date+1 : equinox_date
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
private
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
=begin
|
|
3
|
-
Copyright (C) 2011-
|
|
3
|
+
Copyright (C) 2011-2014 Takashi SUGA
|
|
4
4
|
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
6
|
=end
|
|
@@ -71,24 +71,21 @@ module When
|
|
|
71
71
|
# ウク周期
|
|
72
72
|
#
|
|
73
73
|
class Wuku < Residue
|
|
74
|
+
|
|
75
|
+
# Urip 7
|
|
76
|
+
Urip7 = [ 5, 4, 3, 7, 8, 6, 9]
|
|
77
|
+
|
|
78
|
+
# Urip 5
|
|
79
|
+
Urip5 = [ 9, 7, 4, 8, 5]
|
|
80
|
+
|
|
74
81
|
# 2日週
|
|
75
|
-
Dwiwara = [
|
|
76
|
-
|
|
77
|
-
0, 1, 0, 1, 0, 1, 0,
|
|
78
|
-
0, 0, 1, 0, 1, 1, 1,
|
|
79
|
-
1, 1, 0, 0, 0, 0, 0]
|
|
82
|
+
Dwiwara = (0...35).to_a.map {|d| (Urip7[d % 7] + Urip5[d % 5]) % 2}
|
|
83
|
+
|
|
80
84
|
# 10日週
|
|
81
|
-
Dasawara = [
|
|
82
|
-
|
|
83
|
-
9, 4, 9, 1, 5, 1, 8,
|
|
84
|
-
7, 8, 1, 7, 2, 4, 4,
|
|
85
|
-
4, 6, 7, 0, 7, 0, 0]
|
|
85
|
+
Dasawara = (0...35).to_a.map {|d| (Urip7[d % 7] + Urip5[d % 5]) % 10}
|
|
86
|
+
|
|
86
87
|
# Watek
|
|
87
|
-
Watek = [
|
|
88
|
-
6, 7, 8, 5, 3, 9,10,
|
|
89
|
-
9, 4, 9, 1, 5, 1,11,
|
|
90
|
-
7, 8, 1, 7,10, 4, 4,
|
|
91
|
-
4, 6, 7, 0, 7, 0, 0]
|
|
88
|
+
Watek = (0...35).to_a.map {|d| Urip7[d % 7] + Urip5[d % 5] - 7 }
|
|
92
89
|
|
|
93
90
|
# 2日週
|
|
94
91
|
# @return [When::BasicTypes::M17n]
|
|
@@ -136,15 +133,15 @@ module When
|
|
|
136
133
|
#
|
|
137
134
|
# バリのサカ暦
|
|
138
135
|
#
|
|
139
|
-
|
|
136
|
+
BalineseLuniSolar = [self, [
|
|
140
137
|
"namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
|
|
141
138
|
"locale:[=en:, ja=ja:, alias]",
|
|
142
139
|
"period:[BalineseLuniSolar=, バリ・サカ暦=]",
|
|
143
|
-
["[
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
140
|
+
["[SE=, サカ暦=, alias:Balinese_Saka_Era]1887-07<13", "Calendar Epoch", "1965-07<13^BalineseLuniSolar1965",
|
|
141
|
+
"1971-07-04^BalineseLuniSolar1971",
|
|
142
|
+
"1993-07-08^BalineseLuniSolar1993",
|
|
143
|
+
"2000-06<10^BalineseLuniSolar2000",
|
|
144
|
+
"2003-07<14^BalineseLuniSolar2003", '+Infinity']
|
|
148
145
|
]]
|
|
149
146
|
end
|
|
150
147
|
|
|
@@ -204,6 +201,8 @@ module When
|
|
|
204
201
|
:trunk=>When.Resource('_m:BalineseTerms::HinduMonth::*'),
|
|
205
202
|
:shift=>+8})
|
|
206
203
|
|
|
204
|
+
@origin_of_MSC = 0
|
|
205
|
+
|
|
207
206
|
@tabular = CyclicTableBased.new({
|
|
208
207
|
'indices' => [month_index, Coordinates::Index.new],
|
|
209
208
|
'rule_table' => @rule_table
|
|
@@ -222,8 +221,6 @@ module When
|
|
|
222
221
|
@indices = [month_index, Coordinates::Index.new({:branch=>{-2=>intercalary_day[0]}})]
|
|
223
222
|
|
|
224
223
|
@note = When.CalendarNote(@note || 'BalineseNote')
|
|
225
|
-
|
|
226
|
-
@timezone ||= 0
|
|
227
224
|
super
|
|
228
225
|
end
|
|
229
226
|
end
|
|
@@ -452,16 +449,16 @@ module When
|
|
|
452
449
|
|
|
453
450
|
[When::BasicTypes::M17n,
|
|
454
451
|
"names:[Dasawara=, 10日週=]",
|
|
455
|
-
"[
|
|
452
|
+
"[Pandita]", # 0
|
|
456
453
|
"[Pati ]", # 1
|
|
457
|
-
"[
|
|
458
|
-
"[
|
|
459
|
-
"[
|
|
460
|
-
"[
|
|
461
|
-
"[
|
|
462
|
-
"[
|
|
454
|
+
"[Suka ]", # 2
|
|
455
|
+
"[Duka ]", # 3
|
|
456
|
+
"[Sri ]", # 4
|
|
457
|
+
"[Manuh ]", # 5
|
|
458
|
+
"[Manusa ]", # 6
|
|
459
|
+
"[Raja ]", # 7
|
|
463
460
|
"[Dewa ]", # 8
|
|
464
|
-
"[
|
|
461
|
+
"[Raksasa]" # 9
|
|
465
462
|
],
|
|
466
463
|
|
|
467
464
|
[When::Coordinates::Residue,
|
|
@@ -476,18 +473,18 @@ module When
|
|
|
476
473
|
|
|
477
474
|
[When::BasicTypes::M17n,
|
|
478
475
|
"names:[Watek=]",
|
|
479
|
-
"[
|
|
480
|
-
"[Gajah-Lembu= ]", # 1
|
|
481
|
-
"[Watu-Lembu= ]", # 2
|
|
482
|
-
"[Wong-Lembu= ]", # 3
|
|
483
|
-
"[Buta-Uler= ]", # 4
|
|
484
|
-
"[Gajah-Lintah=]", # 5
|
|
485
|
-
"[Suku-Uler= ]", # 6
|
|
486
|
-
"[Watu-Lintah= ]", # 7
|
|
476
|
+
"[Watu-Lembu= ]", # 7
|
|
487
477
|
"[Buta-Lintah= ]", # 8
|
|
488
|
-
"[
|
|
489
|
-
"[
|
|
490
|
-
"[
|
|
478
|
+
"[Suku-Uler= ]", # 9
|
|
479
|
+
"[Wong-Gajah= ]", # 10
|
|
480
|
+
"[Gajah-Lembu= ]", # 11
|
|
481
|
+
"[Watu-Lintah= ]", # 12
|
|
482
|
+
"[Buta-Uler= ]", # 13
|
|
483
|
+
"[Suku-Gajah= ]", # 14
|
|
484
|
+
"[Wong-Lembu= ]", # 15
|
|
485
|
+
"[Gajah-Lintah=]", # 16
|
|
486
|
+
"[Watu-Uler= ]", # 17
|
|
487
|
+
"[Buta-Gajah= ]" # 18
|
|
491
488
|
],
|
|
492
489
|
|
|
493
490
|
[When::Coordinates::Residue,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
=begin
|
|
3
|
-
Copyright (C) 2011-
|
|
3
|
+
Copyright (C) 2011-2014 Takashi SUGA
|
|
4
4
|
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
6
|
=end
|
|
@@ -130,8 +130,36 @@ module When
|
|
|
130
130
|
attr_reader :anomalistic_month_length
|
|
131
131
|
|
|
132
132
|
# 元期の近点離隔
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
# @return [Numeric]
|
|
134
|
+
attr_reader :anomalistic_month_shift
|
|
135
|
+
|
|
136
|
+
# 当該日付のthiti の変化範囲(唐代の定朔の暦法用 cn_to_time(1L) を使用する)
|
|
137
|
+
#
|
|
138
|
+
# @param [When::TM::TemporalPosition] date 日付
|
|
139
|
+
#
|
|
140
|
+
# @return [Range] 当該日付のthiti の変化範囲(朔を含む場合 nil)
|
|
141
|
+
#
|
|
142
|
+
def thiti_range(date)
|
|
143
|
+
date = date.floor
|
|
144
|
+
p0, p1 = [date, date.succ].map {|d|
|
|
145
|
+
t = d.to_f
|
|
146
|
+
c = (30.0 * ((t - CYCLE_0M) * @cycle_number_1m + @cycle_number_0m)).floor
|
|
147
|
+
t0 = t1 = nil
|
|
148
|
+
loop do
|
|
149
|
+
t0 = cn_to_time( c / 30.0)
|
|
150
|
+
t1 = cn_to_time((c+1)/ 30.0)
|
|
151
|
+
if t0 > t
|
|
152
|
+
c -= 1
|
|
153
|
+
elsif t1 <= t
|
|
154
|
+
c += 1
|
|
155
|
+
else
|
|
156
|
+
break
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
(c + (t-t0) / (t1-t0)) % 30.0
|
|
160
|
+
}
|
|
161
|
+
p0 >= p1 ? nil : p0...p1
|
|
162
|
+
end
|
|
135
163
|
|
|
136
164
|
private
|
|
137
165
|
|
|
@@ -157,8 +185,6 @@ module When
|
|
|
157
185
|
#
|
|
158
186
|
def delta_s(t)
|
|
159
187
|
|
|
160
|
-
tt = t
|
|
161
|
-
|
|
162
188
|
t0, a, b, c = nil
|
|
163
189
|
@s.each do |v|
|
|
164
190
|
t0, a, b, c = v
|
|
@@ -189,8 +215,6 @@ module When
|
|
|
189
215
|
#
|
|
190
216
|
def delta_m(t)
|
|
191
217
|
|
|
192
|
-
tt = t
|
|
193
|
-
|
|
194
218
|
t *= @denominator
|
|
195
219
|
a0 = b0 = t0 = 0
|
|
196
220
|
@m.each do |v|
|
|
@@ -210,6 +234,7 @@ module When
|
|
|
210
234
|
if @formula == '1L'
|
|
211
235
|
@anomalistic_month_length = @anomalistic_month_length.to_r
|
|
212
236
|
@anomalistic_month_shift = (@anomalistic_month_shift||0).to_r
|
|
237
|
+
@s = @s.map {|item| item.dup}
|
|
213
238
|
(0...@s.size).each do |i|
|
|
214
239
|
@s[i-1][1,0] = @year_length / @s.size + (@s[i][0]-@s[i-1][0]) / @denominator
|
|
215
240
|
end
|
|
@@ -228,6 +253,14 @@ module When
|
|
|
228
253
|
#
|
|
229
254
|
class ChineseSolar < EphemerisBasedSolar
|
|
230
255
|
|
|
256
|
+
#
|
|
257
|
+
# @return [When::CalendarTypes::ChineseLuniSolar] 対で用いる太陰太陽暦の名前
|
|
258
|
+
#
|
|
259
|
+
attr_reader :twin
|
|
260
|
+
|
|
261
|
+
# @private
|
|
262
|
+
attr_reader :doyo
|
|
263
|
+
|
|
231
264
|
private
|
|
232
265
|
|
|
233
266
|
# オブジェクトの正規化
|
|
@@ -241,7 +274,6 @@ module When
|
|
|
241
274
|
@formula *= 2 if @formula.length == 1
|
|
242
275
|
@formula[0] += (@formula[0] =~ /\?/ ? '&' : '?') + 'formula=12S' if @formula[0].kind_of?(String)
|
|
243
276
|
@formula[1] += (@formula[1] =~ /\?/ ? '&' : '?') + 'formula=1L' if @formula[1].kind_of?(String)
|
|
244
|
-
@timezone ||= 0
|
|
245
277
|
@note ||= When.CalendarNote('ChineseNotes')
|
|
246
278
|
@indices ||= [
|
|
247
279
|
When::Coordinates::Index.new({:trunk=>When.Resource('_m:ChineseTerms::Month::*')}),
|
|
@@ -256,13 +288,29 @@ module When
|
|
|
256
288
|
#
|
|
257
289
|
class ChineseLuniSolar < EphemerisBasedLuniSolar
|
|
258
290
|
|
|
291
|
+
#
|
|
292
|
+
# @return [When::CalendarTypes::ChineseSolar] 対で用いる太陽暦の名前
|
|
293
|
+
#
|
|
294
|
+
attr_reader :twin
|
|
295
|
+
|
|
296
|
+
# 指定の年の天正冬至を含む月以降1年分の閏月のパターン
|
|
297
|
+
#
|
|
298
|
+
# @param [Numeric] y 年
|
|
299
|
+
#
|
|
300
|
+
# @return [Array<Numeric:月番号>, Array<Numeric:中気のない月の月番号>]
|
|
301
|
+
#
|
|
302
|
+
def intercalary_pattern(y)
|
|
303
|
+
m = _base_month(y)
|
|
304
|
+
l = _base_ids(y)
|
|
305
|
+
[l, (0...l.size).to_a.map {|i| _intercalary?(m+i) ? l[i] : nil}.compact]
|
|
306
|
+
end
|
|
307
|
+
|
|
259
308
|
private
|
|
260
309
|
|
|
261
310
|
# オブジェクトの正規化
|
|
262
311
|
#
|
|
263
312
|
# @cycle_offset = 雨水の場合 -1
|
|
264
313
|
# @formula = 太陽黄経および月の位相の計算に用いるEphemeris
|
|
265
|
-
# @timezone[1] = 進朔量
|
|
266
314
|
#
|
|
267
315
|
def _normalize(args=[], options={})
|
|
268
316
|
@label ||= When.Resource('_m:ChineseTerms::ChineseLuniSolar')
|
|
@@ -277,7 +325,6 @@ module When
|
|
|
277
325
|
@intercalary_span ||= 12
|
|
278
326
|
@intercalary_span = @intercalary_span.to_i
|
|
279
327
|
@intercalary_month = (@intercalary_month.to_i - @base_month) % 12 + 1 if @intercalary_month
|
|
280
|
-
@timezone ||= 0
|
|
281
328
|
@note ||= When.CalendarNote('ChineseNotes')
|
|
282
329
|
@indices ||= [
|
|
283
330
|
When::Coordinates::Index.new({:branch=>{1=>When.Resource('_m:CalendarTerms::閏')},
|
|
@@ -312,10 +359,7 @@ module When
|
|
|
312
359
|
# @return [Numeric] 天正冬至月の通月
|
|
313
360
|
#
|
|
314
361
|
def _base_month_(y)
|
|
315
|
-
(Residue.mod((@formula[0].cn_to_time(12*(y-1) + @base_month - @vernal_month)
|
|
316
|
-
0.5 + @timezone[0]).floor) {|m|
|
|
317
|
-
_new_month(m)
|
|
318
|
-
})[0]
|
|
362
|
+
(Residue.mod(solar_sdn(@formula[0].cn_to_time(12*(y-1) + @base_month - @vernal_month))) {|m| _new_month(m)})[0]
|
|
319
363
|
end
|
|
320
364
|
|
|
321
365
|
# 暦年の翻訳表の取得
|
|
@@ -383,7 +427,7 @@ module When
|
|
|
383
427
|
end
|
|
384
428
|
end
|
|
385
429
|
|
|
386
|
-
Chinese = [When::BasicTypes::M17n, [
|
|
430
|
+
Chinese = [{}, When::BasicTypes::M17n, [
|
|
387
431
|
"namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
|
|
388
432
|
"locale:[=ja:, en=en:, alias]",
|
|
389
433
|
"area:[中国,China]",
|
|
@@ -397,7 +441,7 @@ module When
|
|
|
397
441
|
[ChineseLuniSolar,
|
|
398
442
|
'name:[顓頊暦]',
|
|
399
443
|
'formula:MeanLunation?year_length=1461/4&lunation_length=27759/940&day_epoch=1171396&longitude_shift=-1/8',
|
|
400
|
-
'
|
|
444
|
+
'time_basis:+00,+#{P:12}',
|
|
401
445
|
'intercalary_month:9'
|
|
402
446
|
],
|
|
403
447
|
|
|
@@ -501,12 +545,13 @@ module When
|
|
|
501
545
|
],
|
|
502
546
|
|
|
503
547
|
[ChineseLuniSolar,
|
|
504
|
-
'name:[
|
|
548
|
+
'name:[平朔儀鳳暦]',
|
|
505
549
|
'formula:MeanLunation?year_length=122357/335&lunation_length=39571/1340&day_epoch=-96608689'
|
|
506
550
|
],
|
|
507
551
|
|
|
508
552
|
[ChineseLuniSolar,
|
|
509
553
|
'name:[麟徳暦]',
|
|
554
|
+
'time_basis:+00,+#{P:00}',
|
|
510
555
|
{'formula'=>['12S', '1L'].map {|f|
|
|
511
556
|
Ephemeris::ChineseTrueLunation.new({
|
|
512
557
|
'formula' => f,
|
|
@@ -573,13 +618,15 @@ module When
|
|
|
573
618
|
[1340.0, -125], # 27日
|
|
574
619
|
[ 743.0+1.0/12, -71] # 28日
|
|
575
620
|
]
|
|
576
|
-
|
|
577
|
-
}
|
|
621
|
+
})
|
|
622
|
+
},
|
|
623
|
+
'doyo' => (Rational( 4,15) + 244) / 1340
|
|
624
|
+
}
|
|
578
625
|
],
|
|
579
626
|
|
|
580
627
|
[ChineseLuniSolar,
|
|
581
628
|
'name:[大衍暦]',
|
|
582
|
-
'
|
|
629
|
+
'time_basis:+00,+#{P:03}',
|
|
583
630
|
{'formula'=>['12S', '1L'].map {|f|
|
|
584
631
|
Ephemeris::ChineseTrueLunation.new({
|
|
585
632
|
'formula' => f,
|
|
@@ -647,13 +694,15 @@ module When
|
|
|
647
694
|
[3040.0, +276], # 27日
|
|
648
695
|
[1686.0, +165] # 28日
|
|
649
696
|
]
|
|
650
|
-
|
|
651
|
-
}
|
|
697
|
+
})
|
|
698
|
+
},
|
|
699
|
+
'doyo' => (Rational(13,30) + 531) / 3040
|
|
700
|
+
}
|
|
652
701
|
],
|
|
653
702
|
|
|
654
703
|
[ChineseLuniSolar,
|
|
655
704
|
'name:[五紀暦]',
|
|
656
|
-
'
|
|
705
|
+
'time_basis:+00,+#{P:06}',
|
|
657
706
|
{'formula'=>['12S', '1L'].map {|f|
|
|
658
707
|
Ephemeris::ChineseTrueLunation.new({
|
|
659
708
|
'formula' => f,
|
|
@@ -720,13 +769,20 @@ module When
|
|
|
720
769
|
[1340.0, -125], # 27日
|
|
721
770
|
[ 743.0+5.0/37, -75] # 28日
|
|
722
771
|
]
|
|
723
|
-
|
|
724
|
-
}
|
|
772
|
+
})
|
|
773
|
+
},
|
|
774
|
+
'doyo' => (Rational( 4,15) + 244) / 1340
|
|
775
|
+
}
|
|
776
|
+
],
|
|
777
|
+
|
|
778
|
+
[ChineseSolar,
|
|
779
|
+
'name:[正元暦(節月)]',
|
|
780
|
+
'formula:MeanLunation?year_length=399943/1095&lunation_length=32336/1095&day_epoch=-145149709'
|
|
725
781
|
],
|
|
726
782
|
|
|
727
783
|
[ChineseLuniSolar,
|
|
728
784
|
'name:[宣明暦]',
|
|
729
|
-
'
|
|
785
|
+
'time_basis:+00,+#{P:06}',
|
|
730
786
|
{'formula'=>['12S', '1L'].map {|f|
|
|
731
787
|
Ephemeris::ChineseTrueLunation.new({
|
|
732
788
|
'formula' => f,
|
|
@@ -793,8 +849,10 @@ module When
|
|
|
793
849
|
[ 8400.0, +740], # 13日
|
|
794
850
|
[ 6529.095, +646] # 14日
|
|
795
851
|
]
|
|
796
|
-
|
|
797
|
-
}
|
|
852
|
+
})
|
|
853
|
+
},
|
|
854
|
+
'doyo' => (Rational( 1, 2) + 1468) / 8400
|
|
855
|
+
}
|
|
798
856
|
],
|
|
799
857
|
|
|
800
858
|
[ChineseSolar,
|
|
@@ -808,12 +866,12 @@ module When
|
|
|
808
866
|
],
|
|
809
867
|
|
|
810
868
|
[ChineseSolar,
|
|
811
|
-
'name:[
|
|
869
|
+
'name:[貞享補暦A(節月)]',
|
|
812
870
|
'formula:VariableYearLengthMethod?day_epoch=2336118.903800&year_epoch=1684&year_length=365.241696&year_delta=1'
|
|
813
871
|
],
|
|
814
872
|
|
|
815
873
|
[ChineseSolar,
|
|
816
|
-
'name:[
|
|
874
|
+
'name:[貞享補暦B(節月)]',
|
|
817
875
|
'formula:VariableYearLengthMethod?day_epoch=2336118.622300&year_epoch=1684&year_length=365.241696&year_delta=1'
|
|
818
876
|
],
|
|
819
877
|
|
|
@@ -833,9 +891,11 @@ module When
|
|
|
833
891
|
]
|
|
834
892
|
].inject([]) {|list, cal|
|
|
835
893
|
if cal.kind_of?(Array) && cal[0] == ChineseLuniSolar
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
894
|
+
solar_name = cal[1].sub(/\]/, '(節月)]')
|
|
895
|
+
lunisolar = cal.dup << 'twin:Chinese::' + solar_name.gsub(/(name:\[|\])/,'')
|
|
896
|
+
solar = cal.dup << 'twin:Chinese::' + cal[1].gsub(/(name:\[|\])/,'')
|
|
897
|
+
solar[0..1] = [ChineseSolar, solar_name]
|
|
898
|
+
list << lunisolar << solar
|
|
839
899
|
else
|
|
840
900
|
list << cal
|
|
841
901
|
end
|