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.
Files changed (168) hide show
  1. data/bin/locales.rb +2 -2
  2. data/bin/when.rb +2 -2
  3. data/lib/when_exe.rb +161 -55
  4. data/lib/when_exe/basictypes.rb +34 -26
  5. data/lib/when_exe/calendarnote.rb +654 -0
  6. data/lib/when_exe/calendartypes.rb +49 -474
  7. data/lib/when_exe/coordinates.rb +141 -34
  8. data/lib/when_exe/core/compatibility.rb +22 -2
  9. data/lib/when_exe/core/extension.rb +47 -3
  10. data/lib/when_exe/ephemeris.rb +82 -109
  11. data/lib/when_exe/googlecalendar.rb +1 -1
  12. data/lib/when_exe/icalendar.rb +26 -14
  13. data/lib/when_exe/inspect.rb +82 -68
  14. data/lib/when_exe/locales/af.rb +1 -1
  15. data/lib/when_exe/locales/ar.rb +1 -1
  16. data/lib/when_exe/locales/az.rb +1 -1
  17. data/lib/when_exe/locales/bg.rb +1 -1
  18. data/lib/when_exe/locales/bn.rb +1 -1
  19. data/lib/when_exe/locales/bs.rb +1 -1
  20. data/lib/when_exe/locales/ca.rb +1 -1
  21. data/lib/when_exe/locales/cs.rb +1 -1
  22. data/lib/when_exe/locales/cy.rb +1 -1
  23. data/lib/when_exe/locales/da.rb +1 -1
  24. data/lib/when_exe/locales/de.rb +1 -1
  25. data/lib/when_exe/locales/de_AT.rb +1 -1
  26. data/lib/when_exe/locales/de_CH.rb +1 -1
  27. data/lib/when_exe/locales/el.rb +1 -1
  28. data/lib/when_exe/locales/en.rb +1 -1
  29. data/lib/when_exe/locales/en_AU.rb +1 -1
  30. data/lib/when_exe/locales/en_CA.rb +1 -1
  31. data/lib/when_exe/locales/en_GB.rb +1 -1
  32. data/lib/when_exe/locales/en_IE.rb +1 -1
  33. data/lib/when_exe/locales/en_IN.rb +1 -1
  34. data/lib/when_exe/locales/en_NZ.rb +1 -1
  35. data/lib/when_exe/locales/en_US.rb +1 -1
  36. data/lib/when_exe/locales/eo.rb +1 -1
  37. data/lib/when_exe/locales/es.rb +1 -1
  38. data/lib/when_exe/locales/es_419.rb +1 -1
  39. data/lib/when_exe/locales/es_AR.rb +1 -1
  40. data/lib/when_exe/locales/es_CL.rb +1 -1
  41. data/lib/when_exe/locales/es_CO.rb +1 -1
  42. data/lib/when_exe/locales/es_CR.rb +1 -1
  43. data/lib/when_exe/locales/es_EC.rb +1 -1
  44. data/lib/when_exe/locales/es_MX.rb +1 -1
  45. data/lib/when_exe/locales/es_PA.rb +1 -1
  46. data/lib/when_exe/locales/es_PE.rb +1 -1
  47. data/lib/when_exe/locales/es_VE.rb +1 -1
  48. data/lib/when_exe/locales/et.rb +1 -1
  49. data/lib/when_exe/locales/eu.rb +1 -1
  50. data/lib/when_exe/locales/fa.rb +1 -1
  51. data/lib/when_exe/locales/fi.rb +1 -1
  52. data/lib/when_exe/locales/fr.rb +1 -1
  53. data/lib/when_exe/locales/fr_CA.rb +1 -1
  54. data/lib/when_exe/locales/fr_CH.rb +1 -1
  55. data/lib/when_exe/locales/gl.rb +1 -1
  56. data/lib/when_exe/locales/he.rb +1 -1
  57. data/lib/when_exe/locales/hi.rb +1 -1
  58. data/lib/when_exe/locales/hi_IN.rb +1 -1
  59. data/lib/when_exe/locales/hr.rb +1 -1
  60. data/lib/when_exe/locales/hu.rb +1 -1
  61. data/lib/when_exe/locales/id.rb +1 -1
  62. data/lib/when_exe/locales/is.rb +1 -1
  63. data/lib/when_exe/locales/it.rb +1 -1
  64. data/lib/when_exe/locales/it_CH.rb +1 -1
  65. data/lib/when_exe/locales/ja.rb +1 -1
  66. data/lib/when_exe/locales/kn.rb +1 -1
  67. data/lib/when_exe/locales/ko.rb +1 -1
  68. data/lib/when_exe/locales/lo.rb +1 -1
  69. data/lib/when_exe/locales/locales.rb +1 -1
  70. data/lib/when_exe/locales/lt.rb +1 -1
  71. data/lib/when_exe/locales/lv.rb +1 -1
  72. data/lib/when_exe/locales/mk.rb +1 -1
  73. data/lib/when_exe/locales/mn.rb +1 -1
  74. data/lib/when_exe/locales/ms.rb +1 -1
  75. data/lib/when_exe/locales/nb.rb +1 -1
  76. data/lib/when_exe/locales/ne.rb +1 -1
  77. data/lib/when_exe/locales/nl.rb +1 -1
  78. data/lib/when_exe/locales/nn.rb +1 -1
  79. data/lib/when_exe/locales/or.rb +1 -1
  80. data/lib/when_exe/locales/pl.rb +1 -1
  81. data/lib/when_exe/locales/pt.rb +1 -1
  82. data/lib/when_exe/locales/pt_BR.rb +1 -1
  83. data/lib/when_exe/locales/rm.rb +1 -1
  84. data/lib/when_exe/locales/ro.rb +1 -1
  85. data/lib/when_exe/locales/ru.rb +1 -1
  86. data/lib/when_exe/locales/sk.rb +1 -1
  87. data/lib/when_exe/locales/sl.rb +1 -1
  88. data/lib/when_exe/locales/sr.rb +1 -1
  89. data/lib/when_exe/locales/sv.rb +1 -1
  90. data/lib/when_exe/locales/sw.rb +1 -1
  91. data/lib/when_exe/locales/th.rb +1 -1
  92. data/lib/when_exe/locales/tl.rb +1 -1
  93. data/lib/when_exe/locales/tr.rb +1 -1
  94. data/lib/when_exe/locales/uk.rb +1 -1
  95. data/lib/when_exe/locales/ur.rb +1 -1
  96. data/lib/when_exe/locales/uz.rb +1 -1
  97. data/lib/when_exe/locales/vi.rb +1 -1
  98. data/lib/when_exe/locales/wo.rb +1 -1
  99. data/lib/when_exe/locales/zh_CN.rb +1 -1
  100. data/lib/when_exe/locales/zh_HK.rb +1 -1
  101. data/lib/when_exe/locales/zh_TW.rb +1 -1
  102. data/lib/when_exe/mini_application.rb +6 -2
  103. data/lib/when_exe/parts/enumerator.rb +13 -8
  104. data/lib/when_exe/parts/geometric_complex.rb +3 -5
  105. data/lib/when_exe/parts/locale.rb +185 -28
  106. data/lib/when_exe/parts/method_cash.rb +20 -10
  107. data/lib/when_exe/parts/resource.rb +154 -76
  108. data/lib/when_exe/parts/timezone.rb +11 -6
  109. data/lib/when_exe/region/bahai.rb +2 -2
  110. data/lib/when_exe/region/balinese.rb +296 -296
  111. data/lib/when_exe/region/chinese.rb +564 -564
  112. data/lib/when_exe/region/chinese_calendar.rb +5 -1
  113. data/lib/when_exe/region/chinese_epoch.rb +47 -102
  114. data/lib/when_exe/region/chinese_twin.rb +798 -0
  115. data/lib/when_exe/region/christian.rb +314 -338
  116. data/lib/when_exe/region/coptic.rb +88 -0
  117. data/lib/when_exe/region/ephemeric_notes.rb +322 -307
  118. data/lib/when_exe/region/french.rb +2 -2
  119. data/lib/when_exe/region/indian.rb +361 -272
  120. data/lib/when_exe/region/iranian.rb +2 -2
  121. data/lib/when_exe/region/islamic.rb +3 -3
  122. data/lib/when_exe/region/japanese.rb +1 -1
  123. data/lib/when_exe/region/japanese_notes.rb +165 -103
  124. data/lib/when_exe/region/japanese_residues.rb +56 -55
  125. data/lib/when_exe/region/japanese_twin.rb +228 -0
  126. data/lib/when_exe/region/javanese.rb +2 -2
  127. data/lib/when_exe/region/jewish.rb +2 -2
  128. data/lib/when_exe/region/korean.rb +4 -4
  129. data/lib/when_exe/region/m17n.rb +19 -19
  130. data/lib/when_exe/region/martian.rb +21 -9
  131. data/lib/when_exe/region/mayan.rb +19 -11
  132. data/lib/when_exe/region/moon.rb +7 -7
  133. data/lib/when_exe/region/nihon_shoki.rb +7 -7
  134. data/lib/when_exe/region/roman.rb +100 -100
  135. data/lib/when_exe/region/shire.rb +130 -147
  136. data/lib/when_exe/region/thai.rb +2 -2
  137. data/lib/when_exe/region/tibetan.rb +2 -2
  138. data/lib/when_exe/region/vietnamese.rb +383 -114
  139. data/lib/when_exe/region/world.rb +112 -129
  140. data/lib/when_exe/timestandard.rb +12 -1
  141. data/lib/when_exe/tmposition.rb +28 -14
  142. data/lib/when_exe/tmreference.rb +96 -93
  143. data/lib/when_exe/version.rb +1 -1
  144. data/test/examples/Terms.m17n +2 -2
  145. data/test/examples/sample.json +16 -0
  146. data/test/examples/sample.xml +1 -1
  147. data/test/test.rb +4 -0
  148. data/test/test/basictypes.rb +2 -2
  149. data/test/test/calendarnote.rb +69 -0
  150. data/test/test/calendartypes.rb +41 -1
  151. data/test/test/coordinates.rb +12 -1
  152. data/test/test/ephemeris.rb +13 -66
  153. data/test/test/icalendar.rb +3 -3
  154. data/test/test/inspect.rb +1 -1
  155. data/test/test/parts.rb +7 -4
  156. data/test/test/region/chinese.rb +45 -0
  157. data/test/test/region/coptic.rb +27 -0
  158. data/test/test/region/indian.rb +1 -1
  159. data/test/test/region/japanese.rb +4 -4
  160. data/test/test/region/jewish.rb +1 -1
  161. data/test/test/region/m17n.rb +7 -5
  162. data/test/test/region/residue.rb +2 -2
  163. data/test/test/region/vietnamese.rb +102 -0
  164. data/test/test/timestandard.rb +81 -0
  165. data/test/test/tmposition.rb +1 -1
  166. data/test/test/tmreference.rb +1 -1
  167. data/when_exe.gemspec +2 -2
  168. 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 (trunk.kind_of?(String))
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
- mm, dd = 0, 0
391
+ offsets = [0, 0]
383
392
  rule['Rule'].each_index do |k|
384
393
  subkey = rule['Rule'][k]
385
- case subkey
386
- when String ; rule['Rule'][k] = [subkey, dd, mm]
387
- when Array ; subkey, dd, mm = rule['Rule'][k]
388
- else ; raise TypeError, "Irregal subkey type"
394
+ if subkey.kind_of?(Array)
395
+ subkey, *offsets = rule['Rule'][k]
396
+ else
397
+ rule['Rule'][k] = [subkey] + offsets
389
398
  end
390
- mm += subkey.length
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'] ||= mm
396
- rule['Days'] ||= dd
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
- @entry_key ||= key
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
- end
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