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
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2011-2013 Takashi SUGA
3
+ Copyright (C) 2011-2014 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -12,7 +12,7 @@ module When
12
12
  WorldTerms = [self, [
13
13
  "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
14
14
  "locale:[=en:, ja=ja:, alias]",
15
- "names:[WorldTerms]",
15
+ "names:[WorldTerms=]",
16
16
  "[World=en:The_World_Calendar, 世界暦]"
17
17
  ]]
18
18
  end
@@ -21,159 +21,142 @@ module When
21
21
 
22
22
  World = [self, [
23
23
  "namespace:[en=http://en.wikipedia.org/wiki/]",
24
- "area:[Common]",
24
+ "area:[Common=]",
25
25
  ["[BCE=en:BCE_(disambiguation), alias:BeforeCommonEra]0.1.1"],
26
26
  ["[CE=en:Common_Era, alias:CommonEra]1.1.1", "Calendar Epoch", "01-01-01^World"]
27
27
  ]]
28
28
  end
29
29
 
30
- module CalendarTypes
30
+ #
31
+ # 世界暦の暦週
32
+ #
33
+ class CalendarNote::WorldWeek < CalendarNote
31
34
 
32
- #
33
- # 世界暦の暦週
34
- #
35
- class CalendarNote::WorldWeek < CalendarNote
36
-
37
- NoteObjects = [When::BasicTypes::M17n, [
38
- "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
39
- "locale:[=en:, ja=ja:, alias]",
40
- "names:[World]",
35
+ NoteObjects = [When::BasicTypes::M17n, [
36
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
37
+ "locale:[=en:, ja=ja:, alias]",
38
+ "names:[World]",
41
39
 
42
- # 年の暦注 ----------------------------
43
- [When::BasicTypes::M17n,
44
- "names:[year]"
45
- ],
40
+ # 年の暦注 ----------------------------
41
+ [When::BasicTypes::M17n,
42
+ "names:[year]"
43
+ ],
46
44
 
47
- # 月の暦注 ----------------------------
45
+ # 月の暦注 ----------------------------
46
+ [When::BasicTypes::M17n,
47
+ "names:[month]",
48
48
  [When::BasicTypes::M17n,
49
- "names:[month]",
50
- [When::BasicTypes::M17n,
51
- "names:[Month]"
52
- ]
53
- ],
49
+ "names:[Month]"
50
+ ]
51
+ ],
54
52
 
55
- # 日の暦注 ----------------------------
53
+ # 日の暦注 ----------------------------
54
+ [When::BasicTypes::M17n,
55
+ "names:[day]",
56
56
  [When::BasicTypes::M17n,
57
- "names:[day]",
58
- [When::BasicTypes::M17n,
59
- "names:[Week]",
60
- "[Sunday, 日曜日]",
61
- "[Monday, 月曜日]",
62
- "[Tuesday, 火曜日]",
63
- "[Wednesday, 水曜日]",
64
- "[Thursday, 木曜日]",
65
- "[Friday, 金曜日]",
66
- "[Saturday, 土曜日]",
67
- "[Worldsday, 無曜日]"
68
- ]
57
+ "names:[Week]",
58
+ "[Sunday, 日曜日]",
59
+ "[Monday, 月曜日]",
60
+ "[Tuesday, 火曜日]",
61
+ "[Wednesday, 水曜日]",
62
+ "[Thursday, 木曜日]",
63
+ "[Friday, 金曜日]",
64
+ "[Saturday, 土曜日]",
65
+ "[Worldsday, 無曜日]"
69
66
  ]
70
- ]]
67
+ ]
68
+ ]]
71
69
 
72
- # イベントの標準的な間隔を返す
73
- # @private
74
- def _delta(parameter=nil)
75
- return When::DurationP1W
76
- end
70
+ # イベントの標準的な間隔を返す
71
+ # @private
72
+ def _delta(parameter=nil)
73
+ return When::DurationP1W
74
+ end
77
75
 
78
- # @private
79
- def worldsday_delta(parameter=nil)
80
- return When::TM::PeriodDuration.new([0,0,7*26+1])
81
- end
76
+ # @private
77
+ def worldsday_delta(parameter=nil)
78
+ return When::TM::PeriodDuration.new([0,0,7*26+1])
79
+ end
82
80
 
83
- # 当日または直前の worldsday の日
84
- # @param date [When::TM::TemporalPosition]
85
- # @param parameter [nil] 未使用
86
- # @return [When::TM::TemporalPosition]
87
- #
88
- def worldsday(date, parameter=nil)
89
- event_name = 'worldsday'
90
- date = When.Calendar('World').jul_trans(date, {:events=>event_name})
91
- y,m,d = date.cal_date
92
- h, m = (m-1).divmod(6)
93
- return date if m == 5 && d == 31
94
- dow = [0, 31, 61, 91, 122, 152][m] + d
95
- dow += 182 if h == 1 && When.Calendar('World')._sum([y]) == 365
96
- date += When::TM::PeriodDuration.new([0,0,-dow])
97
- date.events = [event_name]
98
- date
99
- end
81
+ # 当日または直前の worldsday の日
82
+ # @param date [When::TM::TemporalPosition]
83
+ # @param parameter [nil] 未使用
84
+ # @return [When::TM::TemporalPosition]
85
+ #
86
+ def worldsday(date, parameter=nil)
87
+ event_name = 'worldsday'
88
+ date = When.Calendar('World').jul_trans(date, {:events=>event_name})
89
+ y,m,d = date.cal_date
90
+ h, m = (m-1).divmod(6)
91
+ return date if m == 5 && d == 31
92
+ dow = [0, 31, 61, 91, 122, 152][m] + d
93
+ dow += 182 if h == 1 && When.Calendar('World')._sum([y]) == 365
94
+ date += When::TM::PeriodDuration.new([0,0,-dow])
95
+ date.events = [event_name]
96
+ date
97
+ end
100
98
 
101
- # 当日または直前の week_day の日
102
- # @method week_day(date, parameter=nil)
103
- # @param date [When::TM::TemporalPosition]
104
- # @param parameter [nil] 未使用
105
- # @return [When::TM::TemporalPosition]
106
- # @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。
107
-
108
- # @private
109
- 7.times do |k|
110
- name = When.CalendarNote('WorldWeek/NoteObjects::day::Week')[k].to_s.downcase
111
- module_eval %Q{
112
- def #{name}(date, parameter=nil)
113
- event_name = 'from_#{name}'
114
- date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
115
- y,m,d = date.cal_date
116
- dow = (m % 6 == 0 && d == 31) ? 7-#{k} : ([4,6,2][m % 3] + d - #{k}) % 7
117
- return date if dow == 0
118
- dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366)
119
- date += When::TM::PeriodDuration.new([0,0,-dow])
120
- date.events = [event_name]
121
- date
122
- end
123
-
124
- alias :#{name}_delta :_delta
125
- }
126
- end
99
+ # 当日または直前の week_day の日
100
+ # @method week_day(date, parameter=nil)
101
+ # @param date [When::TM::TemporalPosition]
102
+ # @param parameter [nil] 未使用
103
+ # @return [When::TM::TemporalPosition]
104
+ # @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。
105
+
106
+ # @private
107
+ 7.times do |k|
108
+ name = When.CalendarNote('WorldWeek/NoteObjects::day::Week')[k].to_s.downcase
109
+ module_eval %Q{
110
+ def #{name}(date, parameter=nil)
111
+ event_name = 'from_#{name}'
112
+ date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
113
+ y,m,d = date.cal_date
114
+ dow = (m % 6 == 0 && d == 31) ? 7-#{k} : ([4,6,2][m % 3] + d - #{k}) % 7
115
+ return date if dow == 0
116
+ dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366)
117
+ date += When::TM::PeriodDuration.new([0,0,-dow])
118
+ date.events = [event_name]
119
+ date
120
+ end
127
121
 
128
- alias :week :sunday
122
+ alias :#{name}_delta :_delta
123
+ }
124
+ end
129
125
 
130
- # Enumeratorの生成
131
- #
132
- # @param [When::TM::TemporalPosition] first 始点
133
- # @param [Symbol] direction
134
- # [ :forward - 昇順 ]
135
- # [ :reverse - 降順 ]
136
- # @param [String] event イベント名
137
- # @param [Integer] count_limit 繰り返し回数(デフォルトは指定なし)
138
- #
139
- # @return [When::CalendarTypes::ShireWeek::Enumerator]
140
- #
141
- def enum_for(first, direction=:forward, event=nil, count_limit=nil)
142
- Enumerator.new(self, first, direction, event||@event, count_limit)
143
- end
144
- alias :to_enum :enum_for
126
+ alias :week :sunday
145
127
 
146
- # オブジェクトの正規化
147
- # @private
148
- def _normalize(args=[], options={})
149
- @event ||= 'sunday'
150
- super
151
- end
128
+ # オブジェクトの正規化
129
+ # @private
130
+ def _normalize(args=[], options={})
131
+ @event ||= 'sunday'
132
+ super
133
+ end
134
+
135
+ #
136
+ # イベントを取得する Enumerator
137
+ #
138
+ class Enumerator < When::CalendarNote::Enumerator
152
139
 
153
140
  #
154
- # イベントを取得する Enumerator
141
+ # 次のイベントを得る
155
142
  #
156
- class Enumerator < CalendarNote::Enumerator
157
-
158
- #
159
- # 次のイベントを得る
160
- #
161
- # @return [When::TM::TemporalPosition]
162
- #
163
- def succ
164
- value = @current
165
- if @current==:first
166
- @first = event_eval(@first) if @delta.sign < 0
167
- @current = @first
168
- else
169
- @current = event_eval(@current + @delta)
170
- @current = event_eval(@current + @delta * 2) if @current.to_i == value.to_i
171
- end
172
- return value
143
+ # @return [When::TM::TemporalPosition]
144
+ #
145
+ def succ
146
+ value = @current
147
+ if @current==:first
148
+ @first = event_eval(@first) if @delta.sign < 0
149
+ @current = @first
150
+ else
151
+ @current = event_eval(@current + @delta)
152
+ @current = event_eval(@current + @delta * 2) if @current.to_i == value.to_i
173
153
  end
154
+ return value
174
155
  end
175
156
  end
157
+ end
176
158
 
159
+ module CalendarTypes
177
160
  #
178
161
  # World calendar based on Gregorian calendar
179
162
  #
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2011-2013 Takashi SUGA
3
+ Copyright (C) 2011-2014 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -91,6 +91,14 @@ module When::TimeStandard
91
91
  end
92
92
  end
93
93
 
94
+ # 設定情報を取得する
95
+ #
96
+ # @return [Hash] 設定情報
97
+ #
98
+ def _setup_info
99
+ {:leap_seconds => _leap_seconds}
100
+ end
101
+
94
102
  # @private
95
103
  # 閏秒の挿入記録を取得する
96
104
  def _leap_seconds
@@ -310,6 +318,9 @@ module When::TimeStandard
310
318
  # @private
311
319
  module TimeBasis
312
320
 
321
+ # @private
322
+ attr_reader :_time_basis
323
+
313
324
  module FixedTimeBasis
314
325
 
315
326
  private
@@ -172,7 +172,7 @@ module When::TM
172
172
  #
173
173
  # 対応する When::TM::JulianDate を生成
174
174
  #
175
- # @param [Hash] options
175
+ # @param [Hash] options 以下の通り
176
176
  # @option options [When::TM::Clock] :clock
177
177
  # @option options [When::Parts::Timezone] :tz
178
178
  #
@@ -271,7 +271,7 @@ module When::TM
271
271
  # @param [String] specification When.exe Standard Representation
272
272
  # @param [Hash] options 下記の通り
273
273
  # @option options [When::TM::ReferenceSystem] :frame 暦法の指定
274
- # @option options [When::TM::Clock, When::V::Timezone, When::Parts::Timezone, String] :clock 時法の指定
274
+ # @option options [When::Parts::Timezone::Base, String] :clock 時法の指定
275
275
  # @option options [String] :tz 時法の指定(時間帯を指定する場合 :clock の替わりに用いることができる)
276
276
  # @option options [Array<Numeric>] :abbr ISO8601上位省略形式のためのデフォルト日付(省略時 指定なし)
277
277
  # @option options [Integer] :extra_year_digits ISO8601拡大表記のための年の構成要素拡大桁数(省略時 1桁)
@@ -296,7 +296,7 @@ module When::TM
296
296
  # @note options の中身は本メソッドによって更新されることがある。
297
297
  #
298
298
  # @note :tz は 'Asia/Tokyo'など時間帯を表す文字列をキーにして、登録済みのWhen::V::Timezone, When::Parts::Timezoneを検索して使用する。
299
- # :clock はWhen::TM::Clock, When::V::Timezone, When::Parts::Timezoneオブジェクトをそのまま使用するか '+09:00'などの文字列をWhen::TM::Clock化して使用する。
299
+ # :clock はWhen::Parts::Timezone::Baseオブジェクトをそのまま使用するか '+09:00'などの文字列をWhen::TM::Clock化して使用する。
300
300
  # :tz の方が :clock よりも優先される。
301
301
  #
302
302
  # @return [When::TM::TemporalPosition] ISO8601 time point
@@ -630,15 +630,17 @@ module When::TM
630
630
  # @param [Hash] option 時間の歩度が1.0でない場合のための option
631
631
  # see {When::TM::TemporalPosition._instance}
632
632
  #
633
+ # @param [Integer] start ::DateTime オブジェクトのグレゴリオ改暦日(ユリウス通日)
634
+ #
633
635
  # @return [::DateTime]
634
636
  #
635
- def to_date_time(option={:frame=>When.utc})
637
+ def to_date_time(option={:frame=>When.utc}, start=_default_start)
636
638
  return JulianDate.dynamical_time(dynamical_time, option).to_date_time unless time_standard.rate_of_clock == 1.0
637
639
  raise TypeError, "Clock not assigned" unless clock
638
640
  Rational
639
641
  offset = Rational(-(clock.universal_time/Duration::SECOND).to_i, (Duration::DAY/Duration::SECOND).to_i)
640
642
  clk_time = clock.to_clk_time(universal_time - (to_i - JulianDate::JD19700101)*Duration::DAY).clk_time
641
- ::DateTime.jd(to_i, clk_time[1], clk_time[2], clk_time[3].to_i, offset, ::Date::GREGORIAN)
643
+ ::DateTime.jd(to_i, clk_time[1], clk_time[2], clk_time[3].to_i, offset, start)
642
644
  end
643
645
 
644
646
  # 標準ライブラリの Date オブジェクトへの変換
@@ -646,11 +648,13 @@ module When::TM
646
648
  # @param [Hash] option 時間の歩度が1.0でない場合のための option
647
649
  # see {When::TM::TemporalPosition._instance}
648
650
  #
651
+ # @param [Integer] start ::DateTime オブジェクトのグレゴリオ改暦日(ユリウス通日)
652
+ #
649
653
  # @return [::Date]
650
654
  #
651
- def to_date(option={})
655
+ def to_date(option={}, start=_default_start)
652
656
  return JulianDate.dynamical_time(dynamical_time, option).to_date unless time_standard.rate_of_clock == 1.0
653
- ::Date.jd(to_i, ::Date::GREGORIAN)
657
+ ::Date.jd(to_i, start)
654
658
  end
655
659
 
656
660
  # 組み込みライブラリの Time オブジェクトへの変換
@@ -1007,6 +1011,12 @@ module When::TM
1007
1011
  end
1008
1012
  end
1009
1013
 
1014
+ #
1015
+ # 対応する ::Date の start 属性
1016
+ def _default_start
1017
+ frame ? frame._default_start : ::Date::GREGORIAN
1018
+ end
1019
+
1010
1020
  alias :_method_missing :method_missing
1011
1021
 
1012
1022
  # その他のメソッド
@@ -1568,10 +1578,14 @@ module When::TM
1568
1578
  #
1569
1579
  def %(other)
1570
1580
  raise TypeError,"The right operand should be When::Coordinates::Residue" unless other.kind_of?(Residue)
1571
- case other.event
1572
- when 'day' ; other % least_significant_coordinate
1573
- when 'year' ; other % (most_significant_coordinate + @frame._diff_to_CE)
1574
- else ; raise ArgumentError,"The right operand should have a unit 'day' or 'year'"
1581
+ if precision <= When::YEAR && other.units['year'] && other.event != 'year'
1582
+ other.to('year') % (most_significant_coordinate + @frame._diff_to_CE)
1583
+ else
1584
+ case other.event
1585
+ when 'day' ; other % least_significant_coordinate
1586
+ when 'year' ; other % (most_significant_coordinate + @frame._diff_to_CE)
1587
+ else ; raise ArgumentError,"The right operand should have a unit 'day' or 'year'"
1588
+ end
1575
1589
  end
1576
1590
  end
1577
1591
 
@@ -1887,7 +1901,7 @@ module When::TM
1887
1901
  count = digit - length
1888
1902
  period = PeriodDuration.new((count<=0) ? 1 : 0.1**count, digit, (-@frame.indices.length)..length)
1889
1903
  result = floor(digit, precision) + period
1890
- result += clock._tz_difference if (result.universal_time <= self.universal_time)
1904
+ result += clock.tz_difference if (result.universal_time <= self.universal_time)
1891
1905
  return result
1892
1906
  end
1893
1907
 
@@ -1969,8 +1983,8 @@ module When::TM
1969
1983
  clock ||= options[:time].frame if options[:time].kind_of?(ClockTime)
1970
1984
  clock ||= Clock.local_time
1971
1985
  end
1972
- clock = When.Clock(clock) if (clock.kind_of?(String))
1973
- clock_is_timezone = clock.respond_to?(:daylight)
1986
+ clock = When.Clock(clock) if clock.kind_of?(String)
1987
+ clock_is_timezone = clock && !clock.kind_of?(When::TM::Clock)
1974
1988
  clock = clock.daylight if clock_is_timezone
1975
1989
 
1976
1990
  # ClockTime
@@ -302,6 +302,7 @@ module When::TM
302
302
  class Clock < ReferenceSystem
303
303
 
304
304
  include When::Coordinates
305
+ include When::Parts::Timezone::Base
305
306
  include Spatial::Normalize
306
307
  include Temporal
307
308
 
@@ -310,7 +311,7 @@ module When::TM
310
311
 
311
312
  # When::TM::Clock Class のグローバルな設定を行う
312
313
  #
313
- # @param [When::TM::Clock, When::Parts::Timezone, When::V::Timezone, String] local 地方時を使用する場合、指定する
314
+ # @param [When::Parts::Timezone::Base, String] local 地方時を使用する場合、指定する
314
315
  #
315
316
  # @return [void]
316
317
  #
@@ -324,11 +325,19 @@ module When::TM
324
325
  @local_time = local
325
326
  end
326
327
 
328
+ # 設定情報を取得する
329
+ #
330
+ # @return [Hash] 設定情報
331
+ #
332
+ def _setup_info
333
+ {:local => _local_time}
334
+ end
335
+
327
336
  # 地方時
328
337
  #
329
- # @param [When::TM::Clock, When::Parts::Timezone, When::V::Timezone, String] local 地方時
338
+ # @param [When::Parts::Timezone::Base, String] local 地方時
330
339
  #
331
- # @return [When::TM::Clock, When::Parts::Timezone, When::V::Timezone, String]
340
+ # @return [When::Parts::Timezone::Base, String]
332
341
  #
333
342
  # @note
334
343
  # @local_timeは、原則、ライブラリ立ち上げ時に _setup_ で初期化する。
@@ -344,7 +353,7 @@ module When::TM
344
353
 
345
354
  # When::TM::Clock のローカルタイムを読みだす
346
355
  #
347
- # @return [When::TM::Clock, When::Parts::Timezone, When::V::Timezone]
356
+ # @return [When::Parts::Timezone::Base]
348
357
  #
349
358
  def local_time
350
359
  _local_time[1]
@@ -593,32 +602,51 @@ module When::TM
593
602
  return time
594
603
  end
595
604
 
596
- # When::TM::TemporalPosition の時間帯を変更して複製する
597
605
  #
598
- # @param [When::TM::CalDate, When::TM::DateAndTime, When::TM::JulianDate] date
599
- # @param [Hash] options see {When::TM::TemporalPosition._instance}
606
+ # _m17n_form のための要素生成
600
607
  #
601
- # @return [When::TM::DateAndTime, When::TM::JulianDate]
608
+ # @param [Hash] options 下記のとおり
609
+ # @option options [Symbol] :method :to_m17n なら時間帯名を返す、その他は When::Parts::Resource#to_h 参照
602
610
  #
603
- def ^(date, options={})
604
- date = Position.any_other(date, options)
605
- my_options = (date.options||{}).merge(options)
606
- frac = self.universal_time(date.to_i)
607
- sdn, time = (date.universal_time - frac).divmod(Duration::DAY)
608
- my_options[:frame] ||= date.frame if date.kind_of?(CalDate)
609
- my_options[:clock] = self
610
- case date
611
- when DateAndTime
612
- time += frac unless self.kind_of?(When::CalendarTypes::LocalTime)
613
- DateAndTime.new(my_options[:frame].to_cal_date(sdn + JulianDate::JD19700101), time, my_options)
614
- when CalDate
615
- CalDate.new(my_options[:frame].to_cal_date(date.to_i), my_options)
616
- when JulianDate
617
- my_options[:frame] = my_options.delete(:clock)
618
- JulianDate.universal_time(sdn * Duration::DAY, my_options)
619
- else
620
- raise TypeError, "Irregal (Temporal)Position"
611
+ # @private
612
+ def _to_hash_value(options={})
613
+ options[:method] == :to_m17n ? tzname(:hash)[0] : super
614
+ end
615
+
616
+ # この時法のUTCとの差(ISO 8601 basic format)
617
+ #
618
+ # @return [String] (±hhmm)
619
+ #
620
+ def to_basic
621
+ return '' unless @zone
622
+ @zone.gsub(/:/, '')
623
+ end
624
+
625
+ # 期間オブジェクトの桁数合わせ
626
+ # @private
627
+ def _arrange_length(period)
628
+ return period unless period.kind_of?(Array)
629
+ diff = @indices.length - period.length + 1
630
+ return period if (diff == 0)
631
+ return (diff > 0) ? period + Array.new(diff, 0) : period[0...diff]
632
+ end
633
+
634
+ # 時刻配列の分解能
635
+ # @private
636
+ def _precision(time, default=nil)
637
+ nil_index = time.index(nil) || time.length
638
+ precision = nil_index - 1 if (nil_index < @base.length || time[-1].kind_of?(Integer))
639
+ When::Coordinates::Index.precision(default || precision)
640
+ end
641
+
642
+ # 丸め量 / When::TM::Duration::SYSTEM
643
+ # @private
644
+ def _round_value(precision)
645
+ offset = When::TM::Duration::DAY / 2
646
+ precision.times do |i|
647
+ offset /= @unit[i+1] ? @unit[i+1] : 10
621
648
  end
649
+ offset
622
650
  end
623
651
 
624
652
  # この時法の時間帯名
@@ -647,84 +675,43 @@ module When::TM
647
675
  name
648
676
  end
649
677
 
650
- #
651
- # _m17n_form のための要素生成
652
- #
653
- # @private
654
- def _to_hash_value(options={})
655
- tzname(:hash)[0]
678
+ # 標準時間帯の時計
679
+ # @return [When::TM::Clock]
680
+ def standard
681
+ _tz_prop ? _tz_prop.standard : self
656
682
  end
657
683
 
658
- # この時法のUTCとの差(ISO 8601 basic format)
659
- #
660
- # @return [String] (±hhmm)
661
- #
662
- def to_basic
663
- return '' unless @zone
664
- @zone.gsub(/:/, '')
684
+ # 夏時間帯の時計
685
+ # @return [When::TM::Clock]
686
+ def daylight
687
+ _tz_prop ? _tz_prop.daylight : self
688
+ end
689
+
690
+ # 夏時間帯と標準時間帯の時間差
691
+ # @return [When::TM:IntervalLength]
692
+ def tz_difference
693
+ _tz_prop ? _tz_prop.tz_difference : 0
665
694
  end
666
695
 
667
696
  # 夏時間の有無
668
697
  # @private
669
698
  def _need_validate
670
- case @tz_prop
671
- when nil ; false
672
- when When::V::TimezoneProperty ; @tz_prop._pool['..']._need_validate
673
- else ; @tz_prop._need_validate
674
- end
699
+ _tz_prop ? _tz_prop._need_validate : false
675
700
  end
676
701
 
677
702
  # 夏時間
678
703
  # @private
679
704
  def _daylight(time)
680
- case @tz_prop
681
- when nil ; return self
682
- when When::V::TimezoneProperty ; timezone = @tz_prop._pool['..']
683
- else ; timezone = @tz_prop
684
- end
685
- return self unless timezone
686
- return timezone._daylight(time)
687
- end
688
-
689
- # この時法の夏時間-標準時間変化量
690
- # @private
691
- def _tz_difference
692
- case @tz_prop
693
- when nil ; 0
694
- when When::V::TimezoneProperty ; @tz_prop._pool['..'].difference
695
- else ; @tz_prop.difference
696
- end
697
- end
698
-
699
- # 期間オブジェクトの桁数合わせ
700
- # @private
701
- def _arrange_length(period)
702
- return period unless period.kind_of?(Array)
703
- diff = @indices.length - period.length + 1
704
- return period if (diff == 0)
705
- return (diff > 0) ? period + Array.new(diff, 0) : period[0...diff]
705
+ _tz_prop ? _tz_prop._daylight(time) : self
706
706
  end
707
707
 
708
- # 時刻配列の分解能
709
- # @private
710
- def _precision(time, default=nil)
711
- nil_index = time.index(nil) || time.length
712
- precision = nil_index - 1 if (nil_index < @base.length || time[-1].kind_of?(Integer))
713
- When::Coordinates::Index.precision(default || precision)
714
- end
708
+ private
715
709
 
716
- # 丸め量 / When::TM::Duration::SYSTEM
717
- # @private
718
- def _round_value(precision)
719
- offset = When::TM::Duration::DAY / 2
720
- precision.times do |i|
721
- offset /= @unit[i+1] ? @unit[i+1] : 10
722
- end
723
- offset
710
+ # Timezone オブジェクト
711
+ def _tz_prop
712
+ @tz_prop.kind_of?(When::V::TimezoneProperty) ? @tz_prop._pool['..'] : @tz_prop
724
713
  end
725
714
 
726
- private
727
-
728
715
  # オブジェクトの正規化
729
716
  def _normalize(args=[], options={})
730
717
  @indices ||= DefaultTimeIndices
@@ -971,13 +958,21 @@ module When::TM
971
958
  @order = order || DefaultEpochs
972
959
  end
973
960
 
961
+ # 設定情報を取得する
962
+ #
963
+ # @return [Hash] 設定情報
964
+ #
965
+ def _setup_info
966
+ {:order => @order || _setup_}
967
+ end
968
+
974
969
  # When::TM::CalendarEra オブジェクトを検索し取得する
975
970
  #
976
971
  # @overload _instance(key, epoch=nil, reverse=nil, options={})
977
972
  # @param [String, Regexp] key 検索する暦年代または、暦年代にマッチする正規表現
978
973
  # @param [Integer] epoch 年数を昇順にカウントする方式での暦元(0年)の通年(デフォルトは nil - 指定なし)
979
974
  # @param [Integer] reverse 年数を降順にカウントする方式での暦元(0年)の通年(デフォルトは nil - 指定なし)
980
- # @param [Hash] options
975
+ # @param [Hash] options 以下の通り
981
976
  # @option options [String] :area 暦年代の使用地域の指定(デフォルトは nil - 指定なし)
982
977
  # @option options [String] :period 暦年代の使用時代の指定(デフォルトは nil - 指定なし)
983
978
  # @option options [Integer] :count 何件ヒットするまで検索するかを指定(デフォルトは 1件)
@@ -1009,7 +1004,15 @@ module When::TM
1009
1004
  _compact(pool, parents)
1010
1005
  return pool unless pool.size < count
1011
1006
 
1012
- @order.each do |iri|
1007
+ order = @order
1008
+ if /\?.+?=/ =~ parents[-1]
1009
+ begin
1010
+ head = When.CalendarEra(parents[-1])
1011
+ order = order.dup.unshift(head)
1012
+ rescue
1013
+ end
1014
+ end
1015
+ order.each do |iri|
1013
1016
  When.CalendarEra(iri)
1014
1017
  pool = _candidates(options, area, period, key, epoch, false) +
1015
1018
  _candidates(options, area, period, key, reverse, true)
@@ -1295,7 +1298,7 @@ module When::TM
1295
1298
  next_ref = next_era.reference_date if next_era.respond_to?(:reference_date)
1296
1299
  next_ref &&
1297
1300
  next_ref.precision == YEAR &&
1298
- next_ref.cal_date[YEAR-1] == 0 ? @epoch[-1].ceil(YEAR).to_i :
1301
+ next_ref.cal_date[YEAR-1] == 0 ? @epoch[-1].ceil(YEAR).to_i - 1 :
1299
1302
  case type
1300
1303
  when true ; @epoch[-1].to_i - 1
1301
1304
  when :reference_date ; @reference_date.to_i
@@ -1430,7 +1433,7 @@ module When::TM
1430
1433
  f.domain_of_validity = When::EX::Extent.new(
1431
1434
  When::TM::Period.new(
1432
1435
  When::TM::Instant.new(first),
1433
- When::TM::Instant.new(last))) if first
1436
+ When::TM::Instant.new(last))) if first && first <= last
1434
1437
  end
1435
1438
  end
1436
1439
 
@@ -1466,7 +1469,7 @@ module When::TM
1466
1469
  # other attributes
1467
1470
  if (@child && @child.length>0)
1468
1471
  _non_leaf_era(args, term_options)
1469
- #_register_calendar_era unless _pool['..'].kind_of?(CalendarEra)
1472
+ _register_calendar_era unless _pool['..'].kind_of?(CalendarEra)
1470
1473
  @child.each do |era|
1471
1474
  era._register_calendar_era
1472
1475
  end
@@ -1477,7 +1480,7 @@ module When::TM
1477
1480
  end
1478
1481
 
1479
1482
  def _non_leaf_era(args, term_options)
1480
- @label = m17n(@label, nil, nil, term_options) if (@label.instance_of?(String))
1483
+ @label = m17n(@label, nil, nil, term_options) if @label.instance_of?(String)
1481
1484
  if @label
1482
1485
  @label._pool['..'] = self # TODO ここを ||= にすると leaf? の判定がおかしくなる
1483
1486
  @_pool[@label.to_s] = @label