when_exe 0.3.5 → 0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/irb.rc +1 -0
- data/bin/locales.rb +8 -6
- data/bin/when.rb +1 -1
- data/lib/when_exe.rb +231 -146
- data/lib/when_exe/basictypes.rb +108 -18
- data/lib/when_exe/calendarnote.rb +263 -116
- data/lib/when_exe/calendartypes.rb +413 -22
- data/lib/when_exe/coordinates.rb +58 -36
- data/lib/when_exe/core/compatibility.rb +8 -6
- data/lib/when_exe/core/extension.rb +40 -15
- data/lib/when_exe/ephemeris.rb +20 -19
- data/lib/when_exe/{region → ephemeris}/moon.rb +4 -4
- data/lib/when_exe/{region/ephemeric_notes.rb → ephemeris/notes.rb} +25 -6
- data/lib/when_exe/{region → ephemeris}/planets.rb +0 -0
- data/lib/when_exe/{region → ephemeris}/sun.rb +7 -3
- data/lib/when_exe/{region → ephemeris}/v50.rb +0 -0
- data/lib/when_exe/googlecalendar.rb +2 -2
- data/lib/when_exe/icalendar.rb +3 -3
- data/lib/when_exe/inspect.rb +130 -70
- data/lib/when_exe/locales/af.rb +2 -2
- data/lib/when_exe/locales/akt.rb +176 -0
- data/lib/when_exe/locales/ar.rb +2 -2
- data/lib/when_exe/locales/{locales.rb → autoload.rb} +6 -2
- data/lib/when_exe/locales/az.rb +2 -2
- data/lib/when_exe/locales/bg.rb +2 -2
- data/lib/when_exe/locales/bn.rb +2 -2
- data/lib/when_exe/locales/bs.rb +2 -2
- data/lib/when_exe/locales/ca.rb +2 -2
- data/lib/when_exe/locales/cs.rb +2 -2
- data/lib/when_exe/locales/cy.rb +2 -2
- data/lib/when_exe/locales/da.rb +2 -2
- data/lib/when_exe/locales/de.rb +2 -2
- data/lib/when_exe/locales/de_AT.rb +2 -2
- data/lib/when_exe/locales/de_CH.rb +2 -2
- data/lib/when_exe/locales/el.rb +2 -2
- data/lib/when_exe/locales/en.rb +2 -2
- data/lib/when_exe/locales/en_AU.rb +2 -2
- data/lib/when_exe/locales/en_CA.rb +2 -2
- data/lib/when_exe/locales/en_GB.rb +2 -2
- data/lib/when_exe/locales/en_IE.rb +2 -2
- data/lib/when_exe/locales/en_IN.rb +3 -3
- data/lib/when_exe/locales/en_NZ.rb +2 -2
- data/lib/when_exe/locales/en_US.rb +2 -2
- data/lib/when_exe/locales/en_ZA.rb +88 -0
- data/lib/when_exe/locales/encoding_conversion.rb +126 -0
- data/lib/when_exe/locales/eo.rb +2 -2
- data/lib/when_exe/locales/es.rb +2 -2
- data/lib/when_exe/locales/es_419.rb +2 -2
- data/lib/when_exe/locales/es_AR.rb +2 -2
- data/lib/when_exe/locales/es_CL.rb +2 -2
- data/lib/when_exe/locales/es_CO.rb +2 -2
- data/lib/when_exe/locales/es_CR.rb +2 -2
- data/lib/when_exe/locales/es_EC.rb +2 -2
- data/lib/when_exe/locales/es_MX.rb +2 -2
- data/lib/when_exe/locales/es_PA.rb +2 -2
- data/lib/when_exe/locales/es_PE.rb +2 -2
- data/lib/when_exe/locales/es_US.rb +84 -0
- data/lib/when_exe/locales/es_VE.rb +2 -2
- data/lib/when_exe/locales/et.rb +2 -2
- data/lib/when_exe/locales/eu.rb +2 -2
- data/lib/when_exe/locales/fa.rb +2 -2
- data/lib/when_exe/locales/fi.rb +3 -3
- data/lib/when_exe/locales/fr.rb +2 -2
- data/lib/when_exe/locales/fr_CA.rb +2 -2
- data/lib/when_exe/locales/fr_CH.rb +2 -2
- data/lib/when_exe/locales/gl.rb +2 -2
- data/lib/when_exe/locales/he.rb +3 -3
- data/lib/when_exe/locales/hi.rb +2 -2
- data/lib/when_exe/locales/hi_IN.rb +2 -2
- data/lib/when_exe/locales/hr.rb +2 -2
- data/lib/when_exe/locales/hu.rb +6 -5
- data/lib/when_exe/locales/iast.rb +90 -0
- data/lib/when_exe/locales/id.rb +2 -2
- data/lib/when_exe/locales/is.rb +2 -2
- data/lib/when_exe/locales/it.rb +2 -2
- data/lib/when_exe/locales/it_CH.rb +2 -2
- data/lib/when_exe/locales/ja.rb +2 -2
- data/lib/when_exe/locales/kn.rb +2 -2
- data/lib/when_exe/locales/ko.rb +2 -2
- data/lib/when_exe/locales/links.rb +3 -3
- data/lib/when_exe/locales/lo.rb +2 -2
- data/lib/when_exe/{parts → locales}/locale.rb +77 -49
- data/lib/when_exe/locales/lt.rb +6 -2
- data/lib/when_exe/locales/lv.rb +2 -2
- data/lib/when_exe/locales/mk.rb +2 -2
- data/lib/when_exe/locales/mn.rb +2 -2
- data/lib/when_exe/locales/ms.rb +2 -2
- data/lib/when_exe/locales/nb.rb +2 -2
- data/lib/when_exe/locales/ne.rb +2 -2
- data/lib/when_exe/locales/nl.rb +2 -2
- data/lib/when_exe/locales/nn.rb +2 -2
- data/lib/when_exe/locales/or.rb +2 -2
- data/lib/when_exe/locales/pl.rb +2 -2
- data/lib/when_exe/locales/pt.rb +2 -2
- data/lib/when_exe/locales/pt_BR.rb +2 -2
- data/lib/when_exe/locales/rm.rb +2 -2
- data/lib/when_exe/locales/ro.rb +2 -2
- data/lib/when_exe/locales/ru.rb +2 -2
- data/lib/when_exe/locales/sk.rb +2 -2
- data/lib/when_exe/locales/sl.rb +2 -2
- data/lib/when_exe/locales/sr.rb +2 -2
- data/lib/when_exe/locales/sv.rb +2 -2
- data/lib/when_exe/locales/sw.rb +2 -2
- data/lib/when_exe/locales/ta.rb +95 -0
- data/lib/when_exe/locales/th.rb +2 -2
- data/lib/when_exe/locales/tl.rb +3 -3
- data/lib/when_exe/locales/tr.rb +2 -2
- data/lib/when_exe/locales/transliteration_table.rb +62 -0
- data/lib/when_exe/locales/uk.rb +15 -15
- data/lib/when_exe/locales/ur.rb +2 -2
- data/lib/when_exe/locales/uz.rb +2 -2
- data/lib/when_exe/locales/vi.rb +2 -2
- data/lib/when_exe/locales/wo.rb +2 -2
- data/lib/when_exe/locales/zh_CN.rb +2 -2
- data/lib/when_exe/locales/zh_HK.rb +15 -15
- data/lib/when_exe/locales/zh_TW.rb +2 -2
- data/lib/when_exe/locales/zh_YUE.rb +77 -0
- data/lib/when_exe/mini_application.rb +22 -12
- data/lib/when_exe/parts/geometric_complex.rb +16 -1
- data/lib/when_exe/parts/method_cash.rb +184 -238
- data/lib/when_exe/parts/resource.rb +65 -16
- data/lib/when_exe/region/armenian.rb +56 -0
- data/lib/when_exe/region/bahai.rb +13 -13
- data/lib/when_exe/region/balinese.rb +33 -35
- data/lib/when_exe/region/chinese.rb +82 -78
- data/lib/when_exe/region/{chinese_calendar.rb → chinese/calendars.rb} +59 -40
- data/lib/when_exe/region/{chinese_epoch.rb → chinese/epochs.rb} +3 -4
- data/lib/when_exe/region/{chinese_twin.rb → chinese/twins.rb} +48 -51
- data/lib/when_exe/region/christian.rb +236 -127
- data/lib/when_exe/region/coptic.rb +9 -10
- data/lib/when_exe/region/dee.rb +48 -0
- data/lib/when_exe/region/discordian.rb +225 -0
- data/lib/when_exe/region/far_east.rb +2 -6
- data/lib/when_exe/region/french.rb +7 -17
- data/lib/when_exe/region/geologicalage.rb +0 -1
- data/lib/when_exe/region/goddess.rb +58 -0
- data/lib/when_exe/region/indian.rb +323 -231
- data/lib/when_exe/region/iranian.rb +159 -22
- data/lib/when_exe/region/islamic.rb +7 -9
- data/lib/when_exe/region/japanese.rb +14 -803
- data/lib/when_exe/region/japanese/calendars.rb +397 -0
- data/lib/when_exe/region/japanese/epochs.rb +426 -0
- data/lib/when_exe/region/{nihon_shoki.rb → japanese/nihon_shoki.rb} +0 -2
- data/lib/when_exe/region/{japanese_notes.rb → japanese/notes.rb} +179 -150
- data/lib/when_exe/region/japanese/residues.rb +1306 -0
- data/lib/when_exe/region/{japanese_twin.rb → japanese/twins.rb} +12 -15
- data/lib/when_exe/region/javanese.rb +16 -14
- data/lib/when_exe/region/jewish.rb +8 -9
- data/lib/when_exe/region/korean.rb +146 -35
- data/lib/when_exe/region/m17n.rb +8 -10
- data/lib/when_exe/region/martian.rb +44 -16
- data/lib/when_exe/region/mayan.rb +12 -10
- data/lib/when_exe/region/pope.rb +0 -1
- data/lib/when_exe/region/residue.rb +4 -5
- data/lib/when_exe/region/roman.rb +20 -24
- data/lib/when_exe/region/ryukyu.rb +3 -4
- data/lib/when_exe/region/shire.rb +97 -94
- data/lib/when_exe/region/symmetry.rb +50 -0
- data/lib/when_exe/region/thai.rb +164 -56
- data/lib/when_exe/region/tibetan.rb +86 -86
- data/lib/when_exe/region/vietnamese.rb +9 -12
- data/lib/when_exe/region/weekdate.rb +80 -0
- data/lib/when_exe/region/world.rb +65 -70
- data/lib/when_exe/region/yerm.rb +98 -0
- data/lib/when_exe/region/zoroastrian.rb +203 -0
- data/lib/when_exe/timestandard.rb +4 -4
- data/lib/when_exe/tmobjects.rb +1 -3
- data/lib/when_exe/tmposition.rb +13 -12
- data/lib/when_exe/tmreference.rb +11 -10
- data/lib/when_exe/version.rb +1 -1
- data/link_to_online_documents +3 -3
- data/test/examples/Residue.m17n +1 -1
- data/test/examples/Terms.m17n +1 -1
- data/test/test.rb +2 -1
- data/test/test/basictypes.rb +18 -2
- data/test/test/calendarnote.rb +1 -1
- data/test/test/calendartypes.rb +1 -1
- data/test/test/coordinates.rb +7 -7
- data/test/test/{region → ephemeris}/moon.rb +0 -0
- data/test/test/{region → ephemeris}/planets.rb +0 -0
- data/test/test/{region → ephemeris}/sun.rb +0 -0
- data/test/test/parts.rb +8 -13
- data/test/test/region/christian.rb +245 -0
- data/test/test/region/french.rb +16 -16
- data/test/test/region/iran.rb +34 -34
- data/test/test/region/japanese.rb +6 -4
- data/test/test/region/m17n.rb +8 -7
- data/test/test/region/mayan.rb +12 -12
- data/test/test/region/residue.rb +20 -4
- data/test/test/region/thai.rb +25 -3
- data/test/test/region/yerm.rb +146 -0
- metadata +39 -20
- data/lib/when_exe/region/japanese_residues.rb +0 -1212
- data/test/test/region/civil.rb +0 -124
@@ -58,7 +58,7 @@ module When::CalendarTypes
|
|
58
58
|
def _normalize(args=[], options={})
|
59
59
|
@label ||= m17n('Z')
|
60
60
|
@indices ||= When::Coordinates::DefaultTimeIndices
|
61
|
-
@note ||= '
|
61
|
+
@note ||= 'JulianDay'
|
62
62
|
_normalize_spatial
|
63
63
|
_normalize_temporal
|
64
64
|
@second = (@second||1/When::TM::Duration::SECOND).to_f
|
@@ -144,6 +144,197 @@ module When::CalendarTypes
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
+
#
|
148
|
+
# 太陰(太陽)暦の朔閏パターンを扱うモジュール
|
149
|
+
#
|
150
|
+
module Lunar
|
151
|
+
|
152
|
+
# @private
|
153
|
+
Pattern = ' ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
154
|
+
|
155
|
+
# 朔閏表を生成する
|
156
|
+
#
|
157
|
+
# @param [Range] range 生成範囲(西暦年)
|
158
|
+
# @param [Integer] length 大の月の日数
|
159
|
+
# @param [When::TM::Duration] duration チェックする月の間隔
|
160
|
+
#
|
161
|
+
# @return [Hash] 朔閏表
|
162
|
+
#
|
163
|
+
def lunar_table(range, length=30, duration=When::P1M)
|
164
|
+
date = When.TemporalPosition(range.first, {:frame=>self}).floor
|
165
|
+
table = []
|
166
|
+
hash = {
|
167
|
+
'origin_of_MSC' => range.first,
|
168
|
+
'origin_of_LSC' => date.to_i,
|
169
|
+
'rule_table' => table
|
170
|
+
}
|
171
|
+
list = ''
|
172
|
+
while range.include?(date[YEAR])
|
173
|
+
month = date[MONTH] * 1
|
174
|
+
char = Pattern[month..month]
|
175
|
+
char = char.downcase unless date.length(MONTH) == length
|
176
|
+
list += char
|
177
|
+
succ = date + duration
|
178
|
+
unless date[YEAR] == succ[YEAR]
|
179
|
+
table << list
|
180
|
+
list = ''
|
181
|
+
end
|
182
|
+
date = succ
|
183
|
+
end
|
184
|
+
hash
|
185
|
+
end
|
186
|
+
|
187
|
+
# 朔閏表を比較する
|
188
|
+
#
|
189
|
+
# @param [When::TM::Calendar] base 基準とする暦法
|
190
|
+
# @param [Range] range 比較範囲(西暦年)
|
191
|
+
# @param [Integer] length 大の月の日数
|
192
|
+
# @param [When::TM::Duration] duration チェックする月の間隔
|
193
|
+
#
|
194
|
+
# @return [Hash] 朔閏表の差分
|
195
|
+
#
|
196
|
+
def verify(base, range=base.range, length=30, duration=When::P1M)
|
197
|
+
range = When::Parts::GeometricComplex.new(range) & When::Parts::GeometricComplex.new(self.range) if respond_to?(:range)
|
198
|
+
base_table = base.lunar_table(range, length, duration)
|
199
|
+
self_table = self.lunar_table(range, length, duration)
|
200
|
+
hash = {}
|
201
|
+
range.each do |year|
|
202
|
+
difference = _verify(base_table['rule_table'][year-range.first],
|
203
|
+
self_table['rule_table'][year-range.first])
|
204
|
+
hash[year] = difference if difference
|
205
|
+
end
|
206
|
+
hash
|
207
|
+
end
|
208
|
+
|
209
|
+
# @private
|
210
|
+
def _verify(source, target)
|
211
|
+
return nil if source == target
|
212
|
+
return {source => target} unless source.length == target.length
|
213
|
+
indices = []
|
214
|
+
index = []
|
215
|
+
source.length.times do |i|
|
216
|
+
if source[i..i] == target[i..i]
|
217
|
+
unless index.empty?
|
218
|
+
indices << index
|
219
|
+
index = []
|
220
|
+
end
|
221
|
+
else
|
222
|
+
index << i
|
223
|
+
end
|
224
|
+
end
|
225
|
+
indices << index unless index.empty?
|
226
|
+
ranges = []
|
227
|
+
indices.each do |index|
|
228
|
+
if ranges.empty? || index.first > ranges.last.last + 2
|
229
|
+
ranges << index
|
230
|
+
else
|
231
|
+
ranges[-1] = [ranges.last.first,index.last]
|
232
|
+
end
|
233
|
+
end
|
234
|
+
hash = {}
|
235
|
+
ranges.each do |index|
|
236
|
+
range = index.first..index.last
|
237
|
+
hash[source[range]] = target[range]
|
238
|
+
end
|
239
|
+
test = source.dup
|
240
|
+
hash.each_pair do |key, value|
|
241
|
+
test.sub!(key, value)
|
242
|
+
end
|
243
|
+
# raise ArgumentError, "can't replace '#{source}'=>'#{target}' by #{hash}." unless test == target
|
244
|
+
return hash if test == target
|
245
|
+
{source => target}
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
#
|
250
|
+
# 朔閏パターンの表の拡張
|
251
|
+
#
|
252
|
+
module TableExtend
|
253
|
+
|
254
|
+
# 年月日 -> 通日
|
255
|
+
#
|
256
|
+
# @param [Numeric] y 年
|
257
|
+
# @param [Integer] m 月 (0 始まり)
|
258
|
+
# @param [Integer] d 日 (0 始まり)
|
259
|
+
#
|
260
|
+
# @return [Integer] 通日
|
261
|
+
#
|
262
|
+
def _coordinates_to_number(y, m, d)
|
263
|
+
if @after && y >= @rule_table[@entry_key]['Years']
|
264
|
+
_normalize_after
|
265
|
+
return @after._coordinates_to_number(y + @_after_offset, m, d)
|
266
|
+
end
|
267
|
+
if @before && y < 0
|
268
|
+
_normalize_before
|
269
|
+
return @before._coordinates_to_number(y + @_before_offset, m, d)
|
270
|
+
end
|
271
|
+
super
|
272
|
+
end
|
273
|
+
|
274
|
+
# 通日 - > 年月日
|
275
|
+
#
|
276
|
+
# @param [Integer] sdn 通日
|
277
|
+
#
|
278
|
+
# @return [Array<Integer>] [ y, m, d ]
|
279
|
+
# y 年
|
280
|
+
# m 月 (0 始まり)
|
281
|
+
# d 日 (0 始まり)
|
282
|
+
#
|
283
|
+
def _number_to_coordinates(sdn)
|
284
|
+
if @after && sdn >= @origin_of_LSC + @rule_table[@entry_key]['Days']
|
285
|
+
_normalize_after
|
286
|
+
y, m, d = @after._number_to_coordinates(sdn)
|
287
|
+
return [y - @_after_offset, m, d]
|
288
|
+
end
|
289
|
+
if @before && sdn < @origin_of_LSC
|
290
|
+
_normalize_before
|
291
|
+
y, m, d = @before._number_to_coordinates(sdn)
|
292
|
+
return [y - @_before_offset, m, d]
|
293
|
+
end
|
294
|
+
super
|
295
|
+
end
|
296
|
+
|
297
|
+
#
|
298
|
+
# その他のテーブル参照
|
299
|
+
#
|
300
|
+
%w(ids_ length).each do |method|
|
301
|
+
module_eval %Q{
|
302
|
+
def _#{method}(date)
|
303
|
+
if @after && +date[0] >= @rule_table[@entry_key]['Years']
|
304
|
+
_normalize_after
|
305
|
+
date[0] += @_after_offset
|
306
|
+
return @after.send(:_#{method}, date)
|
307
|
+
end
|
308
|
+
if @before && +date[0] < 0
|
309
|
+
_normalize_before
|
310
|
+
date[0] += @_before_offset
|
311
|
+
return @before.send(:_#{method}, date)
|
312
|
+
end
|
313
|
+
super
|
314
|
+
end
|
315
|
+
}
|
316
|
+
end
|
317
|
+
|
318
|
+
private
|
319
|
+
|
320
|
+
def _normalize_after
|
321
|
+
raise RangeError, "Out of range: #{iri}" if @after.kind_of?(Symbol)
|
322
|
+
@after = When.Calendar(@after)
|
323
|
+
@_after_offset = @origin_of_MSC - @after.origin_of_MSC
|
324
|
+
class << self; alias :_normalize_after :_normalize_non end
|
325
|
+
end
|
326
|
+
|
327
|
+
def _normalize_before
|
328
|
+
raise RangeError, "Out of range: #{iri}" if @before.kind_of?(Symbol)
|
329
|
+
@before = When.Calendar(@before)
|
330
|
+
@_before_offset = @origin_of_MSC - @before.origin_of_MSC
|
331
|
+
class << self; alias :_normalize_before :_normalize_non end
|
332
|
+
end
|
333
|
+
|
334
|
+
def _normalize_non
|
335
|
+
end
|
336
|
+
end
|
337
|
+
|
147
338
|
# 月日の配当パターンの種類が限定されている暦の抽象基底クラス
|
148
339
|
#
|
149
340
|
# Calendar which has some fixed arrangement rules for under year
|
@@ -245,6 +436,9 @@ module When::CalendarTypes
|
|
245
436
|
@mean_month = Rational(@rule_table[@entry_key]['Days'], @rule_table[@entry_key]['Months'])
|
246
437
|
@mean_year = Rational(@rule_table[@entry_key]['Days'], @rule_table[@entry_key]['Years' ])
|
247
438
|
end
|
439
|
+
|
440
|
+
# range extension
|
441
|
+
extend(TableExtend) if @before || @after
|
248
442
|
end
|
249
443
|
|
250
444
|
# rule の正規化
|
@@ -349,20 +543,16 @@ module When::CalendarTypes
|
|
349
543
|
rule = {
|
350
544
|
'Years' => 1,
|
351
545
|
'Months' => key.length,
|
352
|
-
'Days' => key
|
546
|
+
'Days' => _year_length(key),
|
353
547
|
'IDs' => [],
|
354
548
|
'Length' => [],
|
355
549
|
'Offset' => []
|
356
550
|
}
|
357
551
|
|
358
|
-
key.length.times do |
|
359
|
-
rule['Length'] << (key
|
360
|
-
rule['Offset'] << (
|
361
|
-
|
362
|
-
branch = (trunk == key.upcase[k-1]) ? 1 : 0
|
363
|
-
trunk = trunk.ord if trunk.kind_of?(String)
|
364
|
-
trunk -= 64
|
365
|
-
rule['IDs'] << ((branch==0) ? trunk : When::Coordinates::Pair.new(trunk, branch))
|
552
|
+
key.length.times do |m|
|
553
|
+
rule['Length'] << _month_length(key, m)
|
554
|
+
rule['Offset'] << (m == 0 ? 0 : rule['Offset'][m-1]+rule['Length'][m-1])
|
555
|
+
rule['IDs'] << _month_id(key, m)
|
366
556
|
end
|
367
557
|
return rule
|
368
558
|
end
|
@@ -374,6 +564,115 @@ module When::CalendarTypes
|
|
374
564
|
#
|
375
565
|
class PatternTableBasedLuniSolar < TableBased
|
376
566
|
|
567
|
+
include Lunar
|
568
|
+
|
569
|
+
class << self
|
570
|
+
#
|
571
|
+
# ひとつのひな型朔閏表からの差分で朔閏表を生成する
|
572
|
+
#
|
573
|
+
# @param [Array] definition ひな型朔閏表
|
574
|
+
# @param [Range] range 生成する朔閏表の年代範囲
|
575
|
+
# @param [Hash{Integer=>(String or Hash{String or Regexp=>String})}] difference 差分情報
|
576
|
+
#
|
577
|
+
# @return [Array] 生成された朔閏表定義
|
578
|
+
#
|
579
|
+
def patch(definition, range=nil, difference={})
|
580
|
+
When.Calendar(definition)
|
581
|
+
base = When::CalendarTypes.const_get(definition)
|
582
|
+
hash = base[-1].dup
|
583
|
+
range ||= hash['origin_of_MSC']...(hash['origin_of_MSC']+hash['rule_table'].size)
|
584
|
+
range = range.to_a
|
585
|
+
hash['origin_of_LSC'] += hash['rule_table'][range[0]-hash['origin_of_MSC']][1]
|
586
|
+
hash['rule_table'] = range.map {|year|
|
587
|
+
original = hash['rule_table'][year-hash['origin_of_MSC']][0]
|
588
|
+
case difference[year]
|
589
|
+
when String ; next difference[year]
|
590
|
+
when nil ; next original
|
591
|
+
end
|
592
|
+
original = original.dup
|
593
|
+
difference[year].each_pair {|key,value|
|
594
|
+
raise ArgumentError, "Can't patch \"#{original}\" by {#{key}=>#{value}} at #{year}" unless original.sub!(key,value)
|
595
|
+
}
|
596
|
+
original
|
597
|
+
}
|
598
|
+
hash['origin_of_MSC'] = range[0]
|
599
|
+
base[0..-2] + [hash]
|
600
|
+
end
|
601
|
+
|
602
|
+
#
|
603
|
+
# 複数のひな型朔閏表からの差分で朔閏表を生成する
|
604
|
+
#
|
605
|
+
# @param [[Array<Array<String, Range>>]] definitions ひな型朔閏表
|
606
|
+
# - String - もとにする太陰太陽暦のIRI文字列
|
607
|
+
# - Range - 朔閏表の年代範囲(デフォルトはもとにする太陰太陽暦の年代範囲)
|
608
|
+
# @param [Hash{Integer=>(String or Hash{String or Regexp=>String})}] difference 差分情報
|
609
|
+
#
|
610
|
+
# @return [Array] 生成された朔閏表定義
|
611
|
+
#
|
612
|
+
def join(definitions, difference={})
|
613
|
+
if definitions.first.kind_of?(Array)
|
614
|
+
base = When::CalendarTypes.const_get(definitions.first[0]).dup
|
615
|
+
else
|
616
|
+
base = []
|
617
|
+
base << definitions.shift until definitions.first.kind_of?(Array)
|
618
|
+
end
|
619
|
+
tables = definitions.map {|definition|
|
620
|
+
When.Calendar(definition[0]).lunar_table(definition[1])
|
621
|
+
}
|
622
|
+
hash = base.pop.merge({
|
623
|
+
'origin_of_MSC' => tables.first['origin_of_MSC'],
|
624
|
+
'origin_of_LSC' => tables.first['origin_of_LSC'],
|
625
|
+
'rule_table' => tables.inject([]) {|rules, table| rules += table['rule_table']}
|
626
|
+
})
|
627
|
+
difference.each_pair do |year, pattern|
|
628
|
+
offset = year - hash['origin_of_MSC']
|
629
|
+
hash['rule_table'][offset] =
|
630
|
+
if pattern.kind_of?(Hash)
|
631
|
+
rule = hash['rule_table'][offset].dup
|
632
|
+
pattern.each_pair do |key,value|
|
633
|
+
raise ArgumentError, "Can't patch \"#{rule}\" by {#{key}=>#{value}} at #{year}" unless rule.sub!(key,value)
|
634
|
+
end
|
635
|
+
rule
|
636
|
+
else
|
637
|
+
pattern
|
638
|
+
end
|
639
|
+
end
|
640
|
+
base << hash
|
641
|
+
end
|
642
|
+
end
|
643
|
+
|
644
|
+
# 朔閏表を生成する
|
645
|
+
#
|
646
|
+
# @param [Range] sub_range 生成範囲(西暦年) デフォルトは self.range
|
647
|
+
# @param [Integer] length 大の月の日数(ダミー)
|
648
|
+
# @param [When::TM::Duration] duration チェックする月の間隔(ダミー)
|
649
|
+
#
|
650
|
+
# @return [Hash] 朔閏表
|
651
|
+
#
|
652
|
+
def lunar_table(sub_range=nil, length=nil, duration=nil)
|
653
|
+
sub_range ||= range
|
654
|
+
last = sub_range.last
|
655
|
+
last -= 1 if sub_range.exclude_end?
|
656
|
+
[sub_range.first, last].each do |edge|
|
657
|
+
raise RangeError, 'Range exceeded: ' + sub_range.to_s unless range.include?(edge)
|
658
|
+
end
|
659
|
+
{
|
660
|
+
'origin_of_MSC' => sub_range.first,
|
661
|
+
'origin_of_LSC' => @origin_of_LSC + @rule_table['T']['Rule'][sub_range.first-@origin_of_MSC][1],
|
662
|
+
'rule_table' => sub_range.to_a.map {|year|
|
663
|
+
@rule_table['T']['Rule'][year-@origin_of_MSC][0]
|
664
|
+
}
|
665
|
+
}
|
666
|
+
end
|
667
|
+
|
668
|
+
# 朔閏表の有効範囲
|
669
|
+
#
|
670
|
+
# @return [Range] 有効範囲(西暦年)
|
671
|
+
#
|
672
|
+
def range
|
673
|
+
@origin_of_MSC...(@origin_of_MSC+@rule_table['T']['Rule'].length)
|
674
|
+
end
|
675
|
+
|
377
676
|
private
|
378
677
|
|
379
678
|
# new で指定された月日配当規則をプログラムで利用可能にします。
|
@@ -408,8 +707,8 @@ module When::CalendarTypes
|
|
408
707
|
|
409
708
|
# オフセットの更新
|
410
709
|
def _increment_offsets(offsets, subkey)
|
411
|
-
offsets[1] += subkey.length
|
412
|
-
offsets[0] += subkey
|
710
|
+
offsets[1] += subkey.length # 月のオフセットを月数分進める
|
711
|
+
offsets[0] += _year_length(subkey) # 日のオフセットを日数分進める
|
413
712
|
end
|
414
713
|
|
415
714
|
# 年初の通日によるセットアップ
|
@@ -453,12 +752,48 @@ module When::CalendarTypes
|
|
453
752
|
return rule['Rule'][year][0]
|
454
753
|
end
|
455
754
|
|
755
|
+
# 朔閏パターン -> 日数/年
|
756
|
+
#
|
757
|
+
# @param [String] key 朔閏パターン
|
758
|
+
#
|
759
|
+
# @return [Integer] 日数/年
|
760
|
+
#
|
761
|
+
def _year_length(key)
|
762
|
+
key.length * 29 + key.gsub(/[a-z]/,'').length
|
763
|
+
end
|
764
|
+
|
765
|
+
# 朔閏パターン -> 日数/年
|
766
|
+
#
|
767
|
+
# @param [String] key 朔閏パターン
|
768
|
+
# @param [Integer] m 月番号(0始まり)
|
769
|
+
#
|
770
|
+
# @return [Integer] 日数/月
|
771
|
+
#
|
772
|
+
def _month_length(key, m)
|
773
|
+
key[m,1] =~ /[a-z]/ ? 29 : 30
|
774
|
+
end
|
775
|
+
|
776
|
+
# 朔閏パターン -> 月のID
|
777
|
+
#
|
778
|
+
# @param [String] key 朔閏パターン
|
779
|
+
# @param [Integer] m 月番号(0始まり)
|
780
|
+
#
|
781
|
+
# @return [Integer] 月のID
|
782
|
+
#
|
783
|
+
def _month_id(key, m)
|
784
|
+
trunk = key.upcase[m]
|
785
|
+
branch = trunk == key.upcase[m-1] ? 1 : 0
|
786
|
+
trunk = trunk.ord if trunk.kind_of?(String)
|
787
|
+
trunk -= 64
|
788
|
+
branch == 0 ? trunk : When::Coordinates::Pair.new(trunk, branch)
|
789
|
+
end
|
790
|
+
|
456
791
|
# オブジェクトの正規化
|
457
792
|
#
|
458
793
|
# @note インスタンス変数 @note は to_a でデフォルトとして用いる暦注
|
459
794
|
#
|
460
795
|
def _normalize(args=[], options={})
|
461
|
-
@note ||= When.CalendarNote('
|
796
|
+
@note ||= When.CalendarNote('Chinese') # See when.rb
|
462
797
|
super
|
463
798
|
end
|
464
799
|
end
|
@@ -484,6 +819,58 @@ module When::CalendarTypes
|
|
484
819
|
end
|
485
820
|
end
|
486
821
|
|
822
|
+
# 表引きにより実現する太陽暦(閏月なし, 5,6,27~34日の月に対応)
|
823
|
+
#
|
824
|
+
# Solar calendar which uses year / month /day table
|
825
|
+
#
|
826
|
+
class PatternTableBasedSolar < PatternTableBasedLuniSolar
|
827
|
+
|
828
|
+
private
|
829
|
+
|
830
|
+
# 朔閏パターン -> 日数/年
|
831
|
+
#
|
832
|
+
# @param [String] key 朔閏パターン
|
833
|
+
#
|
834
|
+
# @return [Integer] 日数/年
|
835
|
+
#
|
836
|
+
def _year_length(key)
|
837
|
+
length = 0
|
838
|
+
key.length.times do |m|
|
839
|
+
length += _month_length(key, m)
|
840
|
+
end
|
841
|
+
length
|
842
|
+
end
|
843
|
+
|
844
|
+
# 朔閏パターン -> 日数/年
|
845
|
+
#
|
846
|
+
# @param [String] key 朔閏パターン
|
847
|
+
# @param [Integer] m 月番号(0始まり)
|
848
|
+
#
|
849
|
+
# @return [Integer] 日数/月
|
850
|
+
#
|
851
|
+
def _month_length(key, m)
|
852
|
+
trunk = key.upcase[m]
|
853
|
+
trunk = trunk.ord if trunk.kind_of?(String)
|
854
|
+
trunk -= 48
|
855
|
+
case trunk
|
856
|
+
when 5, 6 ; trunk
|
857
|
+
when 7..9 ; trunk + 20
|
858
|
+
else ; trunk + 30
|
859
|
+
end
|
860
|
+
end
|
861
|
+
|
862
|
+
# 朔閏パターン -> 月のID
|
863
|
+
#
|
864
|
+
# @param [String] key 朔閏パターン
|
865
|
+
# @param [Integer] m 月番号(0始まり)
|
866
|
+
#
|
867
|
+
# @return [Integer] 月のID
|
868
|
+
#
|
869
|
+
def _month_id(key, m)
|
870
|
+
m + 1
|
871
|
+
end
|
872
|
+
end
|
873
|
+
|
487
874
|
# 年の配当パターンが限定されている暦
|
488
875
|
#
|
489
876
|
# Calendar which has some fixed arrangement rules of year pattern
|
@@ -788,8 +1175,8 @@ module When::CalendarTypes
|
|
788
1175
|
private
|
789
1176
|
|
790
1177
|
# オブジェクトの正規化
|
791
|
-
#
|
792
|
-
#
|
1178
|
+
# cycle_offset = 位相のオフセット / 1か月分の角度
|
1179
|
+
# formula = 位相の計算に用いる太陽の Formula
|
793
1180
|
#
|
794
1181
|
def _normalize(args=[], options={})
|
795
1182
|
@cycle_offset ||= -1.5
|
@@ -804,6 +1191,8 @@ module When::CalendarTypes
|
|
804
1191
|
#
|
805
1192
|
class EphemerisBasedLunar < EphemerisBased
|
806
1193
|
|
1194
|
+
include Lunar
|
1195
|
+
|
807
1196
|
#protected
|
808
1197
|
|
809
1198
|
# 月初の通日
|
@@ -819,13 +1208,13 @@ module When::CalendarTypes
|
|
819
1208
|
private
|
820
1209
|
|
821
1210
|
# オブジェクトの正規化
|
822
|
-
#
|
1211
|
+
# cycle_offset = Goldstein Number に対する暦元の補正
|
823
1212
|
#
|
824
1213
|
def _normalize(args=[], options={})
|
825
1214
|
@cycle_offset ||= 1671 * 12 + 4
|
826
1215
|
super
|
827
1216
|
end
|
828
|
-
|
1217
|
+
end
|
829
1218
|
|
830
1219
|
# 月日の配当が太陽および月の位置によって決定される太陰太陽暦
|
831
1220
|
#
|
@@ -833,6 +1222,8 @@ module When::CalendarTypes
|
|
833
1222
|
#
|
834
1223
|
class EphemerisBasedLuniSolar < EphemerisBasedSolar
|
835
1224
|
|
1225
|
+
include Lunar
|
1226
|
+
|
836
1227
|
# 計算方法
|
837
1228
|
# @return [Array<When::Ephemeris::Formula>]
|
838
1229
|
attr_reader :formula
|
@@ -847,7 +1238,7 @@ module When::CalendarTypes
|
|
847
1238
|
#
|
848
1239
|
# @return [Integer] 通日
|
849
1240
|
#
|
850
|
-
def _coordinates_to_number(yy, mm
|
1241
|
+
def _coordinates_to_number(yy, mm, dd)
|
851
1242
|
_new_month(_new_year_month(+yy) + mm) + dd
|
852
1243
|
end
|
853
1244
|
|
@@ -931,9 +1322,9 @@ module When::CalendarTypes
|
|
931
1322
|
|
932
1323
|
# オブジェクトの正規化
|
933
1324
|
#
|
934
|
-
#
|
935
|
-
#
|
936
|
-
#
|
1325
|
+
# cycle_offset = 雨水の場合 -1
|
1326
|
+
# formula = 位相の計算に用いる太陽と月の Formula
|
1327
|
+
# notes = to_a でデフォルトとして用いる暦注
|
937
1328
|
#
|
938
1329
|
def _normalize(args=[], options={})
|
939
1330
|
@formula ||= ['Formula?formula=12S', 'Formula?formula=1L']
|
@@ -1095,7 +1486,7 @@ module When::CalendarTypes
|
|
1095
1486
|
#
|
1096
1487
|
# @note 属性 @event によって境界を計算する (see {When::Ephemeris::Formula#day_event})
|
1097
1488
|
#
|
1098
|
-
def border(date=[], clock=When
|
1489
|
+
def border(date=[], clock=When::UTC)
|
1099
1490
|
return @border unless date[0] && clock.formula
|
1100
1491
|
|
1101
1492
|
clock._encode(
|