when_exe 0.3.4 → 0.3.5
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/bin/locales.rb +2 -2
- data/bin/when.rb +2 -2
- data/lib/when_exe.rb +161 -55
- data/lib/when_exe/basictypes.rb +34 -26
- data/lib/when_exe/calendarnote.rb +654 -0
- data/lib/when_exe/calendartypes.rb +49 -474
- data/lib/when_exe/coordinates.rb +141 -34
- data/lib/when_exe/core/compatibility.rb +22 -2
- data/lib/when_exe/core/extension.rb +47 -3
- data/lib/when_exe/ephemeris.rb +82 -109
- data/lib/when_exe/googlecalendar.rb +1 -1
- data/lib/when_exe/icalendar.rb +26 -14
- data/lib/when_exe/inspect.rb +82 -68
- data/lib/when_exe/locales/af.rb +1 -1
- data/lib/when_exe/locales/ar.rb +1 -1
- data/lib/when_exe/locales/az.rb +1 -1
- data/lib/when_exe/locales/bg.rb +1 -1
- data/lib/when_exe/locales/bn.rb +1 -1
- data/lib/when_exe/locales/bs.rb +1 -1
- data/lib/when_exe/locales/ca.rb +1 -1
- data/lib/when_exe/locales/cs.rb +1 -1
- data/lib/when_exe/locales/cy.rb +1 -1
- data/lib/when_exe/locales/da.rb +1 -1
- data/lib/when_exe/locales/de.rb +1 -1
- data/lib/when_exe/locales/de_AT.rb +1 -1
- data/lib/when_exe/locales/de_CH.rb +1 -1
- data/lib/when_exe/locales/el.rb +1 -1
- data/lib/when_exe/locales/en.rb +1 -1
- data/lib/when_exe/locales/en_AU.rb +1 -1
- data/lib/when_exe/locales/en_CA.rb +1 -1
- data/lib/when_exe/locales/en_GB.rb +1 -1
- data/lib/when_exe/locales/en_IE.rb +1 -1
- data/lib/when_exe/locales/en_IN.rb +1 -1
- data/lib/when_exe/locales/en_NZ.rb +1 -1
- data/lib/when_exe/locales/en_US.rb +1 -1
- data/lib/when_exe/locales/eo.rb +1 -1
- data/lib/when_exe/locales/es.rb +1 -1
- data/lib/when_exe/locales/es_419.rb +1 -1
- data/lib/when_exe/locales/es_AR.rb +1 -1
- data/lib/when_exe/locales/es_CL.rb +1 -1
- data/lib/when_exe/locales/es_CO.rb +1 -1
- data/lib/when_exe/locales/es_CR.rb +1 -1
- data/lib/when_exe/locales/es_EC.rb +1 -1
- data/lib/when_exe/locales/es_MX.rb +1 -1
- data/lib/when_exe/locales/es_PA.rb +1 -1
- data/lib/when_exe/locales/es_PE.rb +1 -1
- data/lib/when_exe/locales/es_VE.rb +1 -1
- data/lib/when_exe/locales/et.rb +1 -1
- data/lib/when_exe/locales/eu.rb +1 -1
- data/lib/when_exe/locales/fa.rb +1 -1
- data/lib/when_exe/locales/fi.rb +1 -1
- data/lib/when_exe/locales/fr.rb +1 -1
- data/lib/when_exe/locales/fr_CA.rb +1 -1
- data/lib/when_exe/locales/fr_CH.rb +1 -1
- data/lib/when_exe/locales/gl.rb +1 -1
- data/lib/when_exe/locales/he.rb +1 -1
- data/lib/when_exe/locales/hi.rb +1 -1
- data/lib/when_exe/locales/hi_IN.rb +1 -1
- data/lib/when_exe/locales/hr.rb +1 -1
- data/lib/when_exe/locales/hu.rb +1 -1
- data/lib/when_exe/locales/id.rb +1 -1
- data/lib/when_exe/locales/is.rb +1 -1
- data/lib/when_exe/locales/it.rb +1 -1
- data/lib/when_exe/locales/it_CH.rb +1 -1
- data/lib/when_exe/locales/ja.rb +1 -1
- data/lib/when_exe/locales/kn.rb +1 -1
- data/lib/when_exe/locales/ko.rb +1 -1
- data/lib/when_exe/locales/lo.rb +1 -1
- data/lib/when_exe/locales/locales.rb +1 -1
- data/lib/when_exe/locales/lt.rb +1 -1
- data/lib/when_exe/locales/lv.rb +1 -1
- data/lib/when_exe/locales/mk.rb +1 -1
- data/lib/when_exe/locales/mn.rb +1 -1
- data/lib/when_exe/locales/ms.rb +1 -1
- data/lib/when_exe/locales/nb.rb +1 -1
- data/lib/when_exe/locales/ne.rb +1 -1
- data/lib/when_exe/locales/nl.rb +1 -1
- data/lib/when_exe/locales/nn.rb +1 -1
- data/lib/when_exe/locales/or.rb +1 -1
- data/lib/when_exe/locales/pl.rb +1 -1
- data/lib/when_exe/locales/pt.rb +1 -1
- data/lib/when_exe/locales/pt_BR.rb +1 -1
- data/lib/when_exe/locales/rm.rb +1 -1
- data/lib/when_exe/locales/ro.rb +1 -1
- data/lib/when_exe/locales/ru.rb +1 -1
- data/lib/when_exe/locales/sk.rb +1 -1
- data/lib/when_exe/locales/sl.rb +1 -1
- data/lib/when_exe/locales/sr.rb +1 -1
- data/lib/when_exe/locales/sv.rb +1 -1
- data/lib/when_exe/locales/sw.rb +1 -1
- data/lib/when_exe/locales/th.rb +1 -1
- data/lib/when_exe/locales/tl.rb +1 -1
- data/lib/when_exe/locales/tr.rb +1 -1
- data/lib/when_exe/locales/uk.rb +1 -1
- data/lib/when_exe/locales/ur.rb +1 -1
- data/lib/when_exe/locales/uz.rb +1 -1
- data/lib/when_exe/locales/vi.rb +1 -1
- data/lib/when_exe/locales/wo.rb +1 -1
- data/lib/when_exe/locales/zh_CN.rb +1 -1
- data/lib/when_exe/locales/zh_HK.rb +1 -1
- data/lib/when_exe/locales/zh_TW.rb +1 -1
- data/lib/when_exe/mini_application.rb +6 -2
- data/lib/when_exe/parts/enumerator.rb +13 -8
- data/lib/when_exe/parts/geometric_complex.rb +3 -5
- data/lib/when_exe/parts/locale.rb +185 -28
- data/lib/when_exe/parts/method_cash.rb +20 -10
- data/lib/when_exe/parts/resource.rb +154 -76
- data/lib/when_exe/parts/timezone.rb +11 -6
- data/lib/when_exe/region/bahai.rb +2 -2
- data/lib/when_exe/region/balinese.rb +296 -296
- data/lib/when_exe/region/chinese.rb +564 -564
- data/lib/when_exe/region/chinese_calendar.rb +5 -1
- data/lib/when_exe/region/chinese_epoch.rb +47 -102
- data/lib/when_exe/region/chinese_twin.rb +798 -0
- data/lib/when_exe/region/christian.rb +314 -338
- data/lib/when_exe/region/coptic.rb +88 -0
- data/lib/when_exe/region/ephemeric_notes.rb +322 -307
- data/lib/when_exe/region/french.rb +2 -2
- data/lib/when_exe/region/indian.rb +361 -272
- data/lib/when_exe/region/iranian.rb +2 -2
- data/lib/when_exe/region/islamic.rb +3 -3
- data/lib/when_exe/region/japanese.rb +1 -1
- data/lib/when_exe/region/japanese_notes.rb +165 -103
- data/lib/when_exe/region/japanese_residues.rb +56 -55
- data/lib/when_exe/region/japanese_twin.rb +228 -0
- data/lib/when_exe/region/javanese.rb +2 -2
- data/lib/when_exe/region/jewish.rb +2 -2
- data/lib/when_exe/region/korean.rb +4 -4
- data/lib/when_exe/region/m17n.rb +19 -19
- data/lib/when_exe/region/martian.rb +21 -9
- data/lib/when_exe/region/mayan.rb +19 -11
- data/lib/when_exe/region/moon.rb +7 -7
- data/lib/when_exe/region/nihon_shoki.rb +7 -7
- data/lib/when_exe/region/roman.rb +100 -100
- data/lib/when_exe/region/shire.rb +130 -147
- data/lib/when_exe/region/thai.rb +2 -2
- data/lib/when_exe/region/tibetan.rb +2 -2
- data/lib/when_exe/region/vietnamese.rb +383 -114
- data/lib/when_exe/region/world.rb +112 -129
- data/lib/when_exe/timestandard.rb +12 -1
- data/lib/when_exe/tmposition.rb +28 -14
- data/lib/when_exe/tmreference.rb +96 -93
- data/lib/when_exe/version.rb +1 -1
- data/test/examples/Terms.m17n +2 -2
- data/test/examples/sample.json +16 -0
- data/test/examples/sample.xml +1 -1
- data/test/test.rb +4 -0
- data/test/test/basictypes.rb +2 -2
- data/test/test/calendarnote.rb +69 -0
- data/test/test/calendartypes.rb +41 -1
- data/test/test/coordinates.rb +12 -1
- data/test/test/ephemeris.rb +13 -66
- data/test/test/icalendar.rb +3 -3
- data/test/test/inspect.rb +1 -1
- data/test/test/parts.rb +7 -4
- data/test/test/region/chinese.rb +45 -0
- data/test/test/region/coptic.rb +27 -0
- data/test/test/region/indian.rb +1 -1
- data/test/test/region/japanese.rb +4 -4
- data/test/test/region/jewish.rb +1 -1
- data/test/test/region/m17n.rb +7 -5
- data/test/test/region/residue.rb +2 -2
- data/test/test/region/vietnamese.rb +102 -0
- data/test/test/timestandard.rb +81 -0
- data/test/test/tmposition.rb +1 -1
- data/test/test/tmreference.rb +1 -1
- data/when_exe.gemspec +2 -2
- metadata +16 -7
|
@@ -88,6 +88,15 @@ module When::CalendarTypes
|
|
|
88
88
|
time = When::TM::JulianDate._d_to_t(sdn-0.5)
|
|
89
89
|
@time_standard.to_dynamical_time(time) - When::TimeStandard.to_dynamical_time(time)
|
|
90
90
|
end
|
|
91
|
+
|
|
92
|
+
#
|
|
93
|
+
# Zone 名
|
|
94
|
+
#
|
|
95
|
+
# @return [String]
|
|
96
|
+
#
|
|
97
|
+
def zone
|
|
98
|
+
iri.split('/')[-1]
|
|
99
|
+
end
|
|
91
100
|
end
|
|
92
101
|
|
|
93
102
|
#
|
|
@@ -351,7 +360,7 @@ module When::CalendarTypes
|
|
|
351
360
|
rule['Offset'] << (k == 0 ? 0 : rule['Offset'][k-1]+rule['Length'][k-1])
|
|
352
361
|
trunk = key.upcase[k]
|
|
353
362
|
branch = (trunk == key.upcase[k-1]) ? 1 : 0
|
|
354
|
-
trunk = trunk.ord if
|
|
363
|
+
trunk = trunk.ord if trunk.kind_of?(String)
|
|
355
364
|
trunk -= 64
|
|
356
365
|
rule['IDs'] << ((branch==0) ? trunk : When::Coordinates::Pair.new(trunk, branch))
|
|
357
366
|
end
|
|
@@ -379,23 +388,28 @@ module When::CalendarTypes
|
|
|
379
388
|
# Rule => Array of sub rules' key and offset
|
|
380
389
|
def _make_rule(key, rule, unit=nil)
|
|
381
390
|
|
|
382
|
-
|
|
391
|
+
offsets = [0, 0]
|
|
383
392
|
rule['Rule'].each_index do |k|
|
|
384
393
|
subkey = rule['Rule'][k]
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
394
|
+
if subkey.kind_of?(Array)
|
|
395
|
+
subkey, *offsets = rule['Rule'][k]
|
|
396
|
+
else
|
|
397
|
+
rule['Rule'][k] = [subkey] + offsets
|
|
389
398
|
end
|
|
390
|
-
|
|
391
|
-
dd += subkey.length * 29 + subkey.gsub(/[a-z]/,'').length
|
|
399
|
+
_increment_offsets(offsets, subkey)
|
|
392
400
|
end
|
|
393
401
|
|
|
394
|
-
rule['Years'] ||= rule['Rule'].length
|
|
395
|
-
rule['Months'] ||=
|
|
396
|
-
rule['Days'] ||=
|
|
402
|
+
rule['Years'] ||= rule['Rule'].length # 年数
|
|
403
|
+
rule['Months'] ||= offsets[1] # 月数
|
|
404
|
+
rule['Days'] ||= offsets[0] # 日数
|
|
405
|
+
|
|
406
|
+
@entry_key ||= key
|
|
407
|
+
end
|
|
397
408
|
|
|
398
|
-
|
|
409
|
+
# オフセットの更新
|
|
410
|
+
def _increment_offsets(offsets, subkey)
|
|
411
|
+
offsets[1] += subkey.length # 月のオフセットを月数分進める
|
|
412
|
+
offsets[0] += subkey.length * 29 + subkey.gsub(/[a-z]/,'').length # 日のオフセットを日数分進める
|
|
399
413
|
end
|
|
400
414
|
|
|
401
415
|
# 年初の通日によるセットアップ
|
|
@@ -449,6 +463,27 @@ module When::CalendarTypes
|
|
|
449
463
|
end
|
|
450
464
|
end
|
|
451
465
|
|
|
466
|
+
# 表引きにより実現する太陰太陽暦(29,30日以外の月がある場合)
|
|
467
|
+
#
|
|
468
|
+
# Luni-Solar calendar which uses year / month /day table
|
|
469
|
+
#
|
|
470
|
+
class PatternTableBasedLuniSolarExtended < PatternTableBasedLuniSolar
|
|
471
|
+
|
|
472
|
+
private
|
|
473
|
+
|
|
474
|
+
# rule の遅延生成
|
|
475
|
+
def _rule_(key)
|
|
476
|
+
key.kind_of?(Hash) ? key : super
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
# オフセットの更新
|
|
480
|
+
def _increment_offsets(offsets, subkey)
|
|
481
|
+
return super unless subkey.kind_of?(Hash)
|
|
482
|
+
offsets[1] += subkey['Months'] # 月のオフセットを月数分進める
|
|
483
|
+
offsets[0] += subkey['Days'] # 日のオフセットを日数分進める
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
452
487
|
# 年の配当パターンが限定されている暦
|
|
453
488
|
#
|
|
454
489
|
# Calendar which has some fixed arrangement rules of year pattern
|
|
@@ -727,9 +762,10 @@ module When::CalendarTypes
|
|
|
727
762
|
#
|
|
728
763
|
def _normalize(args=[], options={})
|
|
729
764
|
@months_in_year ||= 12
|
|
765
|
+
@formula = When::Parts::Resource._instantiate(@formula)
|
|
730
766
|
super
|
|
731
767
|
end
|
|
732
|
-
|
|
768
|
+
end
|
|
733
769
|
|
|
734
770
|
# 月日の配当が太陽の位置によって決定される太陽暦
|
|
735
771
|
#
|
|
@@ -1101,465 +1137,4 @@ module When::CalendarTypes
|
|
|
1101
1137
|
@height ||= '0'
|
|
1102
1138
|
end
|
|
1103
1139
|
end
|
|
1104
|
-
|
|
1105
|
-
#
|
|
1106
|
-
# 暦注 - Calendar Note
|
|
1107
|
-
#
|
|
1108
|
-
class CalendarNote < When::TM::ReferenceSystem
|
|
1109
|
-
|
|
1110
|
-
#
|
|
1111
|
-
# 暦注要素への名前アクセス機能提供
|
|
1112
|
-
#
|
|
1113
|
-
module LabelAccess
|
|
1114
|
-
attr_reader :_pool
|
|
1115
|
-
|
|
1116
|
-
#
|
|
1117
|
-
# 暦注要素への名前(label)によるアクセス
|
|
1118
|
-
#
|
|
1119
|
-
# @param [Numeric] key 配列インデックスと見なしてアクセス
|
|
1120
|
-
# @param [String] key 名前(label)と見なしてアクセス
|
|
1121
|
-
#
|
|
1122
|
-
# @return [Object] 暦注要素
|
|
1123
|
-
#
|
|
1124
|
-
def [](key)
|
|
1125
|
-
return super if key.kind_of?(Numeric)
|
|
1126
|
-
@_pool ||= Hash[*(inject([]) {|pair, v| pair << v.label.to_s << v})]
|
|
1127
|
-
@_pool[key]
|
|
1128
|
-
end
|
|
1129
|
-
end
|
|
1130
|
-
|
|
1131
|
-
#
|
|
1132
|
-
# 暦注要素のひな形クラス
|
|
1133
|
-
#
|
|
1134
|
-
class NoteElement < When::BasicTypes::Object
|
|
1135
|
-
#
|
|
1136
|
-
# _m17n_form のための要素生成
|
|
1137
|
-
#
|
|
1138
|
-
# @param [Hash] options 未使用
|
|
1139
|
-
#
|
|
1140
|
-
def _to_hash_value(options={})
|
|
1141
|
-
label
|
|
1142
|
-
end
|
|
1143
|
-
end
|
|
1144
|
-
|
|
1145
|
-
# デフォルトイベント名
|
|
1146
|
-
#
|
|
1147
|
-
# @return [String]
|
|
1148
|
-
#
|
|
1149
|
-
# @note イベント名の後ろに数字が使われている場合、数字部分以降はイベントメソッドの引数になります。
|
|
1150
|
-
# SolarTermsクラスで 'term180' は、太陽黄経180度のイベントすなわち秋分を意味します。
|
|
1151
|
-
#
|
|
1152
|
-
attr_accessor :event
|
|
1153
|
-
protected :event=
|
|
1154
|
-
|
|
1155
|
-
# デフォルトイベントの指定
|
|
1156
|
-
#
|
|
1157
|
-
# @param [String] event 指定値を@eventとした新しいオブジェクトを作る
|
|
1158
|
-
#
|
|
1159
|
-
# @return [When::CalendarTypes::CalendarNote]
|
|
1160
|
-
#
|
|
1161
|
-
def copy(event)
|
|
1162
|
-
c = self.clone
|
|
1163
|
-
c.event = event
|
|
1164
|
-
c
|
|
1165
|
-
end
|
|
1166
|
-
|
|
1167
|
-
# 典型的なイベントの発生間隔
|
|
1168
|
-
#
|
|
1169
|
-
# @param [String] event
|
|
1170
|
-
#
|
|
1171
|
-
# @return [When::TM::PeriodDuration]
|
|
1172
|
-
#
|
|
1173
|
-
def duration(event=@event)
|
|
1174
|
-
void, event, parameter = event.split(/^([^\d]+)/)
|
|
1175
|
-
send((event+'_delta').downcase.to_sym, parameter)
|
|
1176
|
-
end
|
|
1177
|
-
|
|
1178
|
-
# 指定の日時が指定イベントに該当するか?
|
|
1179
|
-
#
|
|
1180
|
-
# @param [When::TM::TemporalPosition] date チェックされる日時
|
|
1181
|
-
# @param [String] event チェックするイベント名
|
|
1182
|
-
#
|
|
1183
|
-
# @return [Boolean]
|
|
1184
|
-
# [ true - 該当する ]
|
|
1185
|
-
# [ false - 該当しない ]
|
|
1186
|
-
#
|
|
1187
|
-
def include?(date, event=@event)
|
|
1188
|
-
enum_for(date, :forward, event.downcase).next.include?(date)
|
|
1189
|
-
end
|
|
1190
|
-
|
|
1191
|
-
# Enumeratorの生成
|
|
1192
|
-
#
|
|
1193
|
-
# @param [When::TM::TemporalPosition] first 始点
|
|
1194
|
-
# @param [Symbol] direction
|
|
1195
|
-
# [:forward] 昇順
|
|
1196
|
-
# [:reverse] 降順
|
|
1197
|
-
# @param [String] event イベント名
|
|
1198
|
-
# @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
|
|
1199
|
-
#
|
|
1200
|
-
# @return [Enumerator]
|
|
1201
|
-
#
|
|
1202
|
-
def enum_for(first, direction=:forward, event=@event, count_limit=nil)
|
|
1203
|
-
Enumerator.new(self, first, direction, event, count_limit)
|
|
1204
|
-
end
|
|
1205
|
-
alias :to_enum :enum_for
|
|
1206
|
-
|
|
1207
|
-
# 暦注の計算
|
|
1208
|
-
#
|
|
1209
|
-
# @param [When::TM::TemporalPosition] date 暦注を計算する日時
|
|
1210
|
-
# @param [When::TM::TemporalPosition 以外] date When::TM::TemporalPosition に変換して使用する
|
|
1211
|
-
# @param [String] options { :notes => String } という Hash の指定と等価
|
|
1212
|
-
# @param [Integer] options { :indices => Integer} という Hash の指定と等価
|
|
1213
|
-
# @param [Hash] options 下記のとおり
|
|
1214
|
-
# @option options [Integer] :indices Integerで指定した暦座標の暦注を計算
|
|
1215
|
-
# [ When::DAY ( 0) - 日 ]
|
|
1216
|
-
# [ When::MONTH(-1) - 月 ]
|
|
1217
|
-
# [ When::YEAR (-2) - 年 ]
|
|
1218
|
-
#
|
|
1219
|
-
# @option options [Array<Integer>] :indices Integerで指定したすべて暦座標の暦注を計算
|
|
1220
|
-
# @option options [nil] :indices すべての暦座標の暦注を計算(デフォルト)
|
|
1221
|
-
# @option options [String] :notes 計算する暦注名(日の暦注)
|
|
1222
|
-
# @option options [Integer] :notes 計算する暦注のビット配列(日の暦注)
|
|
1223
|
-
# @option options [Array<Array<String>>] :notes 計算する暦注名の Array の Array
|
|
1224
|
-
# @option options [Array<Integer>] :notes 計算する暦注のビット配列の Array
|
|
1225
|
-
# @option options [:all] :notes すべての暦注を計算
|
|
1226
|
-
# @option options [:prime, nil] :notes @prime に登録した暦注を計算、@prime未登録なら :all と同じ(デフォルト)
|
|
1227
|
-
# @option options [Hash] :conditions 暦注計算の条件
|
|
1228
|
-
# [ :location => 暦注計算の基準となる場所(String or When::Coordinates::Spatial) ]
|
|
1229
|
-
# [ その他のキー => 個々の暦注クラスごとにその他のキーを使用できる ]
|
|
1230
|
-
#
|
|
1231
|
-
# @option options [Hash] その他のキー date を When::TM::TemporalPosition に変換するために使用する
|
|
1232
|
-
# see {When::TM::TemporalPosition._instance}
|
|
1233
|
-
#
|
|
1234
|
-
# @note CalendarNoteオブジェクト生成時に _normalize メソッド内で @prime 変数を設定しておけば、
|
|
1235
|
-
# 本メソッドの :prime オプションで参照される。(BalineseNote#_normalize等参照)
|
|
1236
|
-
#
|
|
1237
|
-
# @note 暦注のビットアドレスは、暦注サブクラスのNoteObjects定数の中の定義順序による。
|
|
1238
|
-
# When::CalendarTypes::CalendarNote クラスの場合 new の引数とした暦注要素リストの定義順序による。
|
|
1239
|
-
# ビットアドレスの値が 1 の暦注が計算対象となる。
|
|
1240
|
-
#
|
|
1241
|
-
# @return [Hash] :notes が String の場合、指定の暦注の計算結果を返す。
|
|
1242
|
-
# @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合、指定の暦座標の暦注計算結果を返す。
|
|
1243
|
-
# @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合、暦注計算結果を返す。
|
|
1244
|
-
# [ :note => 暦注要素 (When::Coordinates::Residue, String, When::BasicTypes::M17n) ]
|
|
1245
|
-
# [ :value => 暦注の値 (When::Coordinates::Residue, String, When::BasicTypes::M17n, When::TM::TemporalPosition) ]
|
|
1246
|
-
#
|
|
1247
|
-
# @note
|
|
1248
|
-
# 戻り値の :value が When::TM::TemporalPosition の場合、その日時オブジェクトの events[0] に暦注名の入った
|
|
1249
|
-
# 暦注に該当する日付である。(例) Christian クラス で easter を計算した場合、当該年の復活祭の日付オブジェクトが返る。
|
|
1250
|
-
# @note
|
|
1251
|
-
# 暦注サブクラスの場合、暦注要素が増えたり、:note の暦注要素の型が変わったりすることがある。
|
|
1252
|
-
#
|
|
1253
|
-
def notes(date, options={})
|
|
1254
|
-
dates, indices, notes, conditions, options = _parse_note(date, options)
|
|
1255
|
-
_result(indices.map {|i|
|
|
1256
|
-
next [] unless i <= date.precision
|
|
1257
|
-
_note_values(dates, notes[i-1], _all_keys[i-1], _elements[i-1]) do |dates, focused_notes, notes_hash|
|
|
1258
|
-
focused_notes.each do |note|
|
|
1259
|
-
unless notes_hash[note]
|
|
1260
|
-
void, event, *parameter = note.split(/^([^\d]+)/)
|
|
1261
|
-
method = event.downcase
|
|
1262
|
-
parameter << conditions unless conditions.empty?
|
|
1263
|
-
notes_hash[note] =
|
|
1264
|
-
if respond_to?(method)
|
|
1265
|
-
send(method, dates, *parameter)
|
|
1266
|
-
else
|
|
1267
|
-
_elements[i-1][note].send(When::Coordinates::PRECISION_NAME[i].downcase, dates)
|
|
1268
|
-
end
|
|
1269
|
-
end
|
|
1270
|
-
end
|
|
1271
|
-
notes_hash
|
|
1272
|
-
end
|
|
1273
|
-
}, options)
|
|
1274
|
-
end
|
|
1275
|
-
|
|
1276
|
-
#
|
|
1277
|
-
# 暦注の一致 or 不一致
|
|
1278
|
-
#
|
|
1279
|
-
# @param [When::TM::TemporalPosition] date 暦注を確認する日時
|
|
1280
|
-
# @param [When::TM::TemporalPosition 以外] date When::TM::TemporalPosition に変換して使用する
|
|
1281
|
-
# @param [String] options { :notes => String } または { :value => String } という Hash の指定と等価
|
|
1282
|
-
# (指定の notes が存在する場合は前者、しない場合は後者)
|
|
1283
|
-
# @param [Integer] options { :indices => Integer } という Hash の指定と等価
|
|
1284
|
-
# @param [Hash] options 下記のとおり
|
|
1285
|
-
# @option options [暦注の値] :value 確認する暦注の値
|
|
1286
|
-
# @option options [それぞれ] その他 {When::CalendarTypes::CalendarNote#notes} を参照
|
|
1287
|
-
#
|
|
1288
|
-
# @return [Boolean]
|
|
1289
|
-
# [ true - 暦注が一致 ]
|
|
1290
|
-
# [ false - 暦注が不一致 ]
|
|
1291
|
-
#
|
|
1292
|
-
def note?(date, options={})
|
|
1293
|
-
options = _find_note(options) if options.kind_of?(String)
|
|
1294
|
-
value = options.delete(:value) if options.kind_of?(Hash)
|
|
1295
|
-
result = notes(date, options)
|
|
1296
|
-
result = [result] unless result.kind_of?(Array)
|
|
1297
|
-
result = result.flatten.compact
|
|
1298
|
-
return false unless result.size > 0
|
|
1299
|
-
return true unless value
|
|
1300
|
-
result.each do |hash|
|
|
1301
|
-
return true if value == hash[:value]
|
|
1302
|
-
end
|
|
1303
|
-
return false
|
|
1304
|
-
end
|
|
1305
|
-
|
|
1306
|
-
# 年の名前を暦注として返す
|
|
1307
|
-
# @method year
|
|
1308
|
-
# @return [When::BasicTypes::M17n]
|
|
1309
|
-
|
|
1310
|
-
# 月の名前を暦注として返す
|
|
1311
|
-
# @method month
|
|
1312
|
-
# @return [When::BasicTypes::M17n]
|
|
1313
|
-
|
|
1314
|
-
# 日の名前を暦注として返す
|
|
1315
|
-
# @method day
|
|
1316
|
-
# @return [When::BasicTypes::M17n]
|
|
1317
|
-
|
|
1318
|
-
#
|
|
1319
|
-
# 標準的な暦注として、暦座標の値の名前を暦注として返すメソッドを登録
|
|
1320
|
-
#
|
|
1321
|
-
# @private
|
|
1322
|
-
['year', 'month', 'day'].each do |c|
|
|
1323
|
-
module_eval %Q{
|
|
1324
|
-
def #{c}(date)
|
|
1325
|
-
date.name('#{c}')
|
|
1326
|
-
end
|
|
1327
|
-
}
|
|
1328
|
-
end
|
|
1329
|
-
|
|
1330
|
-
private
|
|
1331
|
-
|
|
1332
|
-
#
|
|
1333
|
-
# オブジェクトの正規化
|
|
1334
|
-
#
|
|
1335
|
-
def _normalize(args=[], options={})
|
|
1336
|
-
@_elements = (args.size == 0 && self.class.const_defined?(:NoteObjects)) ?
|
|
1337
|
-
When::Parts::Resource.base_uri + self.class.to_s.split(/::/)[1..-1].join('/') + '/NoteObjects' :
|
|
1338
|
-
_to_iri(args, options[:prefix] || '_co:')
|
|
1339
|
-
if @_elements.kind_of?(Array)
|
|
1340
|
-
@_elements.each do |e|
|
|
1341
|
-
e.extend LabelAccess
|
|
1342
|
-
end
|
|
1343
|
-
end
|
|
1344
|
-
end
|
|
1345
|
-
|
|
1346
|
-
# 暦注要素
|
|
1347
|
-
#
|
|
1348
|
-
# @return [Array<Array<When::Parts::Resource>>]
|
|
1349
|
-
#
|
|
1350
|
-
def _elements
|
|
1351
|
-
@_elements = When.Resource(@_elements) if @_elements.kind_of?(String)
|
|
1352
|
-
@_elements
|
|
1353
|
-
end
|
|
1354
|
-
|
|
1355
|
-
#
|
|
1356
|
-
# [[暦注名]](全暦注)
|
|
1357
|
-
#
|
|
1358
|
-
# @return [Array<Array<String, When::BasicTypes::M17n>>]
|
|
1359
|
-
#
|
|
1360
|
-
def _all_keys
|
|
1361
|
-
@_all_keys ||= _elements.map { |c|
|
|
1362
|
-
c.map {|n|
|
|
1363
|
-
n.label.to_s
|
|
1364
|
-
}
|
|
1365
|
-
}
|
|
1366
|
-
end
|
|
1367
|
-
|
|
1368
|
-
#
|
|
1369
|
-
# [[暦注名]](主要暦注)
|
|
1370
|
-
#
|
|
1371
|
-
# @return [Array<Array<When::Parts::Resource>>]
|
|
1372
|
-
#
|
|
1373
|
-
def _prime_keys
|
|
1374
|
-
@prime ||= _all_keys
|
|
1375
|
-
end
|
|
1376
|
-
|
|
1377
|
-
#
|
|
1378
|
-
# notes メソッドの引数を parse する
|
|
1379
|
-
#
|
|
1380
|
-
# @return [Array] dates, indices, notes
|
|
1381
|
-
#
|
|
1382
|
-
def _parse_note(date, options)
|
|
1383
|
-
options =
|
|
1384
|
-
case options
|
|
1385
|
-
when Hash ; options
|
|
1386
|
-
when String ; {:notes => options}
|
|
1387
|
-
when Integer ; {:indices => options}
|
|
1388
|
-
else ; {}
|
|
1389
|
-
end
|
|
1390
|
-
conditions = options.delete(:conditions) || {}
|
|
1391
|
-
_opt = options.dup
|
|
1392
|
-
notes = _notes(_opt.delete(:notes) || :prime)
|
|
1393
|
-
indices = _indices(_opt.delete(:indices), notes)
|
|
1394
|
-
date = When.when?(date, _opt) unless date.kind_of?(When::TM::TemporalPosition)
|
|
1395
|
-
[_to_date_for_note(date), indices, notes, conditions, options]
|
|
1396
|
-
end
|
|
1397
|
-
|
|
1398
|
-
#
|
|
1399
|
-
# notes メソッドの 文字列引数の意味を解釈する
|
|
1400
|
-
#
|
|
1401
|
-
# @return [Hash] options for note String
|
|
1402
|
-
#
|
|
1403
|
-
def _find_note(note)
|
|
1404
|
-
_elements.each_index do |index|
|
|
1405
|
-
return {:notes=>note, :indices => [-index]} if _elements[-1-index]._pool[note]
|
|
1406
|
-
end
|
|
1407
|
-
{:value => note}
|
|
1408
|
-
end
|
|
1409
|
-
|
|
1410
|
-
#
|
|
1411
|
-
# 計算する暦注
|
|
1412
|
-
#
|
|
1413
|
-
# @return [Array<Array<String>, Integer>]
|
|
1414
|
-
#
|
|
1415
|
-
def _notes(notes)
|
|
1416
|
-
case notes
|
|
1417
|
-
when :all ; _all_keys
|
|
1418
|
-
when :prime ; _prime_keys
|
|
1419
|
-
when Integer ; [notes]
|
|
1420
|
-
when String ; [[notes]]
|
|
1421
|
-
else ; notes
|
|
1422
|
-
end
|
|
1423
|
-
end
|
|
1424
|
-
|
|
1425
|
-
#
|
|
1426
|
-
# 暦注を計算する暦座標の配列
|
|
1427
|
-
#
|
|
1428
|
-
# @return [Array<Integer>]
|
|
1429
|
-
#
|
|
1430
|
-
def _indices(indices, notes)
|
|
1431
|
-
case indices
|
|
1432
|
-
when nil ; (0...notes.size).to_a.reverse.map {|i| -i}
|
|
1433
|
-
when Range ; indices.to_a
|
|
1434
|
-
when Array ; indices
|
|
1435
|
-
else ; [indices.to_i]
|
|
1436
|
-
end
|
|
1437
|
-
end
|
|
1438
|
-
|
|
1439
|
-
#
|
|
1440
|
-
# notes メソッドの結果を後処理する
|
|
1441
|
-
#
|
|
1442
|
-
# @return [Array<Array>, Array, String]
|
|
1443
|
-
#
|
|
1444
|
-
def _result(result, options)
|
|
1445
|
-
return result[0][0] if options[:notes].kind_of?(String)
|
|
1446
|
-
return result[0] if options[:indices].kind_of?(Numeric)
|
|
1447
|
-
return result
|
|
1448
|
-
end
|
|
1449
|
-
|
|
1450
|
-
#
|
|
1451
|
-
# 年月日暦注計算の共通処理 - コールバック元
|
|
1452
|
-
#
|
|
1453
|
-
def _note_values(dates, focused_notes, all_notes, note_objects)
|
|
1454
|
-
return [] unless dates && all_notes
|
|
1455
|
-
|
|
1456
|
-
# prepare focused notes
|
|
1457
|
-
case focused_notes
|
|
1458
|
-
when Integer
|
|
1459
|
-
bits = ~focused_notes << 1
|
|
1460
|
-
focused_notes = all_notes.dup.delete_if { (bits>>=1)[0] == 1 }
|
|
1461
|
-
when []
|
|
1462
|
-
focused_notes = all_notes
|
|
1463
|
-
when nil
|
|
1464
|
-
focused_notes = []
|
|
1465
|
-
end
|
|
1466
|
-
focused_notes = focused_notes.dup
|
|
1467
|
-
not_focused_notes = all_notes - focused_notes
|
|
1468
|
-
notes = {}
|
|
1469
|
-
not_focused_notes.each do |note|
|
|
1470
|
-
notes[note] = true
|
|
1471
|
-
end
|
|
1472
|
-
focused_notes.each do |note|
|
|
1473
|
-
notes[note] = nil
|
|
1474
|
-
end
|
|
1475
|
-
|
|
1476
|
-
# update notes
|
|
1477
|
-
notes = yield(dates, focused_notes, notes)
|
|
1478
|
-
notes.keys.each do |note|
|
|
1479
|
-
notes.delete(note) unless focused_notes.include?(note)
|
|
1480
|
-
end
|
|
1481
|
-
|
|
1482
|
-
# return Array of Hash
|
|
1483
|
-
focused_notes.map {|note|
|
|
1484
|
-
next nil unless notes[note]
|
|
1485
|
-
if note_objects[note].respond_to?(:to_note_hash)
|
|
1486
|
-
note_objects[note].to_note_hash(notes[note], dates)
|
|
1487
|
-
else
|
|
1488
|
-
{:note=>note_objects[note].label, :value=>notes[note]}
|
|
1489
|
-
end
|
|
1490
|
-
}.compact
|
|
1491
|
-
end
|
|
1492
|
-
|
|
1493
|
-
#
|
|
1494
|
-
# 再帰的に配列の中を Resource化する
|
|
1495
|
-
#
|
|
1496
|
-
def _to_iri(args, prefix)
|
|
1497
|
-
args.map {|arg|
|
|
1498
|
-
case arg
|
|
1499
|
-
when String
|
|
1500
|
-
arg, method = $1, $2 if (arg =~ /^(.+)#([_A-Z0-9]+)$/i)
|
|
1501
|
-
obj = When.Resource(arg, prefix)
|
|
1502
|
-
obj = obj.copy(method) if method
|
|
1503
|
-
obj
|
|
1504
|
-
when Array
|
|
1505
|
-
_to_iri(arg, prefix)
|
|
1506
|
-
else
|
|
1507
|
-
arg
|
|
1508
|
-
end
|
|
1509
|
-
}
|
|
1510
|
-
end
|
|
1511
|
-
|
|
1512
|
-
#
|
|
1513
|
-
# 暦日を当該暦注計算用クラスに変換
|
|
1514
|
-
#
|
|
1515
|
-
# 基底クラスである本クラスでは何もしないで、引数をそのまま返す
|
|
1516
|
-
#
|
|
1517
|
-
def _to_date_for_note(date)
|
|
1518
|
-
date
|
|
1519
|
-
end
|
|
1520
|
-
|
|
1521
|
-
#
|
|
1522
|
-
# イベントを取得する Enumerator
|
|
1523
|
-
#
|
|
1524
|
-
class Enumerator < When::Parts::Enumerator
|
|
1525
|
-
|
|
1526
|
-
#
|
|
1527
|
-
# 次のイベントを得る
|
|
1528
|
-
#
|
|
1529
|
-
# @return [When::TM::TemporalPosition]
|
|
1530
|
-
#
|
|
1531
|
-
def _succ
|
|
1532
|
-
@current = (@current==:first) ? @first : event_eval(@current + @delta)
|
|
1533
|
-
end
|
|
1534
|
-
|
|
1535
|
-
# オブジェクトの生成
|
|
1536
|
-
#
|
|
1537
|
-
# @param [When::CalendarTypes::CalendarNote] parent 暦注アルゴリズム
|
|
1538
|
-
# @param [When::TM::TemporalPosition] first 始点
|
|
1539
|
-
# @param [Symbol] direction
|
|
1540
|
-
# [:forward] 昇順
|
|
1541
|
-
# [:reverse] 降順
|
|
1542
|
-
# @param [String] event イベント名
|
|
1543
|
-
# @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
|
|
1544
|
-
#
|
|
1545
|
-
def initialize(parent, first, direction, event, count_limit=nil)
|
|
1546
|
-
@parent = parent
|
|
1547
|
-
void, @event, @parameter = event.split(/^([^\d]+)/)
|
|
1548
|
-
@delta = @parent.send((@event+'_delta').to_sym, @parameter)
|
|
1549
|
-
instance_eval %Q{
|
|
1550
|
-
def event_eval(date)
|
|
1551
|
-
@parent.#{@event}(date, @parameter)
|
|
1552
|
-
end
|
|
1553
|
-
}
|
|
1554
|
-
date = event_eval(first)
|
|
1555
|
-
if direction == :reverse
|
|
1556
|
-
@delta = -@delta
|
|
1557
|
-
date = event_eval(first + @delta) if first.to_i < date.to_i
|
|
1558
|
-
else
|
|
1559
|
-
date = event_eval(first + @delta) if first.to_i > date.to_i
|
|
1560
|
-
end
|
|
1561
|
-
super(@parent, date, direction, count_limit)
|
|
1562
|
-
end
|
|
1563
|
-
end
|
|
1564
|
-
end
|
|
1565
1140
|
end
|