when_exe 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|