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.
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