when_exe 0.2.100 → 0.3.1

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 (193) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/irb.rc +5 -0
  4. data/bin/locales.rb +2 -2
  5. data/bin/when.rb +16 -0
  6. data/bin/when.rb.config +7 -0
  7. data/lib/when_exe.rb +616 -14
  8. data/lib/when_exe/basictypes.rb +615 -0
  9. data/lib/when_exe/calendartypes.rb +1700 -0
  10. data/lib/when_exe/coordinates.rb +1936 -0
  11. data/lib/when_exe/core/compatibility.rb +54 -0
  12. data/lib/when_exe/core/duration.rb +72 -72
  13. data/lib/when_exe/core/extension.rb +382 -0
  14. data/lib/when_exe/ephemeris.rb +1845 -0
  15. data/lib/when_exe/googlecalendar.rb +140 -0
  16. data/lib/when_exe/icalendar.rb +1587 -0
  17. data/lib/when_exe/inspect.rb +1237 -0
  18. data/lib/when_exe/locales/af.rb +90 -0
  19. data/lib/when_exe/locales/ar.rb +145 -0
  20. data/lib/when_exe/locales/az.rb +90 -0
  21. data/lib/when_exe/locales/bg.rb +90 -0
  22. data/lib/when_exe/locales/bn.rb +94 -0
  23. data/lib/when_exe/locales/bs.rb +121 -0
  24. data/lib/when_exe/locales/ca.rb +92 -0
  25. data/lib/when_exe/locales/cs.rb +107 -0
  26. data/lib/when_exe/locales/cy.rb +150 -0
  27. data/lib/when_exe/locales/da.rb +84 -0
  28. data/lib/when_exe/locales/de.rb +92 -0
  29. data/lib/when_exe/locales/de_AT.rb +92 -0
  30. data/lib/when_exe/locales/de_CH.rb +92 -0
  31. data/lib/when_exe/locales/el.rb +93 -0
  32. data/lib/when_exe/locales/en.rb +88 -0
  33. data/lib/when_exe/locales/en_AU.rb +88 -0
  34. data/lib/when_exe/locales/en_CA.rb +88 -0
  35. data/lib/when_exe/locales/en_GB.rb +88 -0
  36. data/lib/when_exe/locales/en_IN.rb +88 -0
  37. data/lib/when_exe/locales/en_NZ.rb +88 -0
  38. data/lib/when_exe/locales/eo.rb +89 -0
  39. data/lib/when_exe/locales/es.rb +84 -0
  40. data/lib/when_exe/locales/es_419.rb +84 -0
  41. data/lib/when_exe/locales/es_AR.rb +84 -0
  42. data/lib/when_exe/locales/es_CL.rb +84 -0
  43. data/lib/when_exe/locales/es_CO.rb +84 -0
  44. data/lib/when_exe/locales/es_MX.rb +84 -0
  45. data/lib/when_exe/locales/es_PE.rb +85 -0
  46. data/lib/when_exe/locales/es_VE.rb +84 -0
  47. data/lib/when_exe/locales/et.rb +94 -0
  48. data/lib/when_exe/locales/eu.rb +95 -0
  49. data/lib/when_exe/locales/fa.rb +80 -0
  50. data/lib/when_exe/locales/fi.rb +89 -0
  51. data/lib/when_exe/locales/fr.rb +88 -0
  52. data/lib/when_exe/locales/fr_CA.rb +88 -0
  53. data/lib/when_exe/locales/fr_CH.rb +88 -0
  54. data/lib/when_exe/locales/gl.rb +81 -0
  55. data/lib/when_exe/locales/he.rb +84 -0
  56. data/lib/when_exe/locales/hi.rb +80 -0
  57. data/lib/when_exe/locales/hi_IN.rb +84 -0
  58. data/lib/when_exe/locales/hr.rb +128 -0
  59. data/lib/when_exe/locales/hu.rb +84 -0
  60. data/lib/when_exe/locales/id.rb +89 -0
  61. data/lib/when_exe/locales/is.rb +89 -0
  62. data/lib/when_exe/locales/it.rb +87 -0
  63. data/lib/when_exe/locales/it_CH.rb +87 -0
  64. data/lib/when_exe/locales/ja.rb +78 -0
  65. data/lib/when_exe/locales/kn.rb +86 -0
  66. data/lib/when_exe/locales/ko.rb +78 -0
  67. data/lib/when_exe/locales/links.rb +2342 -0
  68. data/lib/when_exe/locales/lo.rb +123 -0
  69. data/lib/when_exe/locales/locales.rb +91 -0
  70. data/lib/when_exe/locales/lt.rb +111 -0
  71. data/lib/when_exe/locales/lv.rb +118 -0
  72. data/lib/when_exe/locales/mk.rb +93 -0
  73. data/lib/when_exe/locales/mn.rb +80 -0
  74. data/lib/when_exe/locales/nb.rb +81 -0
  75. data/lib/when_exe/locales/ne.rb +81 -0
  76. data/lib/when_exe/locales/nl.rb +92 -0
  77. data/lib/when_exe/locales/nn.rb +73 -0
  78. data/lib/when_exe/locales/or.rb +84 -0
  79. data/lib/when_exe/locales/pl.rb +128 -0
  80. data/lib/when_exe/locales/pt.rb +88 -0
  81. data/lib/when_exe/locales/pt_BR.rb +88 -0
  82. data/lib/when_exe/locales/rm.rb +143 -0
  83. data/lib/when_exe/locales/ro.rb +105 -0
  84. data/lib/when_exe/locales/ru.rb +128 -0
  85. data/lib/when_exe/locales/sk.rb +109 -0
  86. data/lib/when_exe/locales/sl.rb +122 -0
  87. data/lib/when_exe/locales/sr.rb +122 -0
  88. data/lib/when_exe/locales/sv.rb +83 -0
  89. data/lib/when_exe/locales/sw.rb +89 -0
  90. data/lib/when_exe/locales/th.rb +78 -0
  91. data/lib/when_exe/locales/tl.rb +99 -0
  92. data/lib/when_exe/locales/tr.rb +96 -0
  93. data/lib/when_exe/locales/uk.rb +128 -0
  94. data/lib/when_exe/locales/uz.rb +128 -0
  95. data/lib/when_exe/locales/vi.rb +94 -0
  96. data/lib/when_exe/locales/wo.rb +82 -0
  97. data/lib/when_exe/locales/zh_CN.rb +77 -0
  98. data/lib/when_exe/locales/zh_HK.rb +77 -0
  99. data/lib/when_exe/locales/zh_TW.rb +77 -0
  100. data/lib/when_exe/mini_application.rb +252 -0
  101. data/lib/when_exe/parts/enumerator.rb +472 -0
  102. data/lib/when_exe/parts/geometric_complex.rb +379 -0
  103. data/lib/when_exe/parts/locale.rb +513 -0
  104. data/lib/when_exe/parts/method_cash.rb +207 -0
  105. data/lib/when_exe/parts/resource.rb +806 -0
  106. data/lib/when_exe/parts/timezone.rb +182 -0
  107. data/lib/when_exe/region/bahai.rb +145 -0
  108. data/lib/when_exe/region/balinese.rb +627 -0
  109. data/lib/when_exe/region/chinese.rb +896 -0
  110. data/lib/when_exe/region/chinese_calendar.rb +919 -0
  111. data/lib/when_exe/region/chinese_epoch.rb +1245 -0
  112. data/lib/when_exe/region/christian.rb +644 -0
  113. data/lib/when_exe/region/far_east.rb +192 -0
  114. data/lib/when_exe/region/french.rb +66 -0
  115. data/lib/when_exe/region/geologicalage.rb +639 -0
  116. data/lib/when_exe/region/indian.rb +1066 -0
  117. data/lib/when_exe/region/iranian.rb +66 -0
  118. data/lib/when_exe/region/islamic.rb +105 -0
  119. data/lib/when_exe/region/japanese.rb +851 -0
  120. data/lib/when_exe/region/japanese_notes.rb +964 -0
  121. data/lib/when_exe/region/japanese_residues.rb +1149 -0
  122. data/lib/when_exe/region/javanese.rb +228 -0
  123. data/lib/when_exe/region/jewish.rb +127 -0
  124. data/lib/when_exe/region/korean.rb +267 -0
  125. data/lib/when_exe/region/m17n.rb +115 -0
  126. data/lib/when_exe/region/martian.rb +215 -0
  127. data/lib/when_exe/region/mayan.rb +122 -0
  128. data/lib/when_exe/region/moon.rb +333 -0
  129. data/lib/when_exe/region/nihon_shoki.rb +73 -0
  130. data/lib/when_exe/region/planets.rb +585 -0
  131. data/lib/when_exe/region/pope.rb +298 -0
  132. data/lib/when_exe/region/residue.rb +229 -0
  133. data/lib/when_exe/region/roman.rb +325 -0
  134. data/lib/when_exe/region/ryukyu.rb +98 -0
  135. data/lib/when_exe/region/shire.rb +254 -0
  136. data/lib/when_exe/region/sun.rb +210 -0
  137. data/lib/when_exe/region/thai.rb +227 -0
  138. data/lib/when_exe/region/tibetan.rb +233 -0
  139. data/lib/when_exe/region/v50.rb +111 -0
  140. data/lib/when_exe/region/vietnamese.rb +173 -0
  141. data/lib/when_exe/region/world.rb +197 -0
  142. data/lib/when_exe/timestandard.rb +547 -0
  143. data/lib/when_exe/tmduration.rb +330 -330
  144. data/lib/when_exe/tmobjects.rb +1295 -0
  145. data/lib/when_exe/tmposition.rb +1955 -0
  146. data/lib/when_exe/tmreference.rb +1547 -0
  147. data/lib/when_exe/version.rb +10 -3
  148. data/link_to_online_documents +4 -0
  149. data/test/examples/JapanHolidays.ics +456 -0
  150. data/test/examples/Millennium.ics +17 -0
  151. data/test/examples/NewYork.ics +61 -0
  152. data/test/examples/Residue.m17n +135 -0
  153. data/test/examples/Spatial.m17n +179 -0
  154. data/test/examples/Terms.m17n +39 -0
  155. data/test/examples/Test.ics +53 -0
  156. data/test/examples/USA-DST.ics +61 -0
  157. data/test/examples/geometric_complex.rb +41 -0
  158. data/test/examples/sample.xml +14 -0
  159. data/test/examples/today.rb +61 -0
  160. data/test/test.rb +54 -19
  161. data/test/test.rb.config +1 -0
  162. data/test/test/basictypes.rb +368 -0
  163. data/test/test/calendartypes.rb +57 -0
  164. data/test/test/coordinates.rb +380 -0
  165. data/test/test/ephemeris.rb +127 -0
  166. data/test/test/googlecalendar.rb +167 -0
  167. data/test/test/icalendar.rb +848 -0
  168. data/test/test/inspect.rb +115 -0
  169. data/test/test/parts.rb +480 -0
  170. data/test/test/region/chinese.rb +161 -0
  171. data/test/test/region/french.rb +33 -0
  172. data/test/test/region/geologicalage.rb +14 -0
  173. data/test/test/region/indian.rb +55 -0
  174. data/test/test/region/iran.rb +54 -0
  175. data/test/test/region/islamic.rb +18 -0
  176. data/test/test/region/japanese.rb +62 -0
  177. data/test/test/region/jewish.rb +61 -0
  178. data/test/test/region/m17n.rb +181 -0
  179. data/test/test/region/mayan.rb +78 -0
  180. data/test/test/region/moon.rb +14 -0
  181. data/test/test/region/planets.rb +14 -0
  182. data/test/test/region/residue.rb +123 -0
  183. data/test/test/region/sun.rb +14 -0
  184. data/test/test/region/thai.rb +94 -0
  185. data/test/test/region/tibetan.rb +30 -0
  186. data/test/test/tmobjects.rb +356 -57
  187. data/test/test/tmposition.rb +237 -0
  188. data/test/test/tmreference.rb +95 -0
  189. data/when_exe.gemspec +2 -2
  190. metadata +187 -7
  191. data/doc/COPYING +0 -31
  192. data/doc/COPYING.ja +0 -25
  193. data/doc/document_url +0 -1
@@ -0,0 +1,644 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2013 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ module When
9
+
10
+ class BasicTypes::M17n
11
+
12
+ ChristianTerms = [self, [
13
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
14
+ "locale:[=en:, ja=ja:, alias]",
15
+ "names:[ChristianTerms]",
16
+ "[Julian=en:Julian_calendar, ユリウス暦 ]",
17
+ "[Gregorian=en:Gregorian_calendar, グレゴリオ暦]",
18
+ "[Civil=en:Civil_calendar, 西暦 ]",
19
+ "[Coptic=en:Coptic_calendar, コプト暦 ]",
20
+ "[Ethiopian=en:Ethiopian_calendar, エチオピア暦=en:Ethiopian_calendar]",
21
+
22
+ [self,
23
+ "names:[EgyptianMonth, 月=ja:%E6%9C%88_(%E6%9A%A6)]",
24
+ "[tut=, トート= ]",
25
+ "[baba=, バーバ= ]",
26
+ "[hatur=, ハートール= ]",
27
+ "[kiyahak=, キヤハーク= ]",
28
+ "[tuba=, トーバ= ]",
29
+ "[amshir=, アムシール= ]",
30
+ "[baramhat=, バラムハート=]",
31
+ "[barmuda=, バルムーダ= ]",
32
+ "[bashans=, バシャンス= ]",
33
+ "[ba'una=, バウーナ= ]",
34
+ "[abib=, アビーブ= ]",
35
+ "[misra=, ミスラー= ]",
36
+ "[epagomen=, エパゴメネ= ]"
37
+ ],
38
+
39
+ [self,
40
+ "names:[EthiopianMonth, 月=ja:%E6%9C%88_(%E6%9A%A6)]",
41
+ "[Mäskäräm=, マスカラム= ]",
42
+ "[Ṭəqəmt=, テケルト= ]",
43
+ "[Ḫədar=, ヘダル= ]",
44
+ "[Taḫśaś=, ターサス= ]",
45
+ "[Ṭərr=, テル= ]",
46
+ "[Yäkatit=, イェカティト=]",
47
+ "[Mägabit=, メガビト= ]",
48
+ "[Miyazya=, ミアジア= ]",
49
+ "[Gənbot=, ゲエンポト= ]",
50
+ "[Säne=, セネ= ]",
51
+ "[Ḥamle=, ハムレ= ]",
52
+ "[Nähase=, ネハッセ= ]",
53
+ "[Ṗagʷəmen=, パゴウメン= ]"
54
+ ]
55
+ ]]
56
+ end
57
+
58
+ class TM::CalendarEra
59
+ # Anno Mundi Era
60
+ Byzantine = [self, [
61
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
62
+ "locale:[=en:, ja=ja:, alias]",
63
+ "period:[Byzantine=en:Byzantine_calendar, ビザンティン暦=ja:%E4%B8%96%E7%95%8C%E5%89%B5%E9%80%A0%E7%B4%80%E5%85%83]",
64
+ ["[AM=en:Anno_Mundi, 世界創造紀元, alias:Anno_Mundi]6497.9.1",
65
+ "Calendar Epoch", "989-09-01^Julian?border=[-1,9,1]&note=RomanNote", "1453=5-29"]
66
+ ]]
67
+ end
68
+
69
+ module CalendarTypes
70
+
71
+ #
72
+ # Coptic Calendar in Egypt
73
+ #
74
+ EgyptianCoptic = [CyclicTableBased, {
75
+ 'label' => Parts::Resource._instance('_m:ChristianTerms::Coptic'),
76
+ 'origin_of_LSC' => 1825030,
77
+ 'origin_of_MSC' => 1,
78
+ 'epoch_in_CE' => 285,
79
+ 'indices' => [
80
+ When::Coordinates::Index.new({:unit =>13,
81
+ :trunk=>When::Parts::Resource._instance('_m:ChristianTerms::EgyptianMonth::*')}),
82
+ When::Coordinates::Index.new
83
+ ],
84
+ 'rule_table' => {
85
+ 'T' => {'Rule' =>[366,365,365,365]},
86
+ 365 => {'Length'=>[30]*12+[5]},
87
+ 366 => {'Length'=>[30]*12+[6]}
88
+ }
89
+ }]
90
+
91
+ #
92
+ # Coptic Calendar in Ethiopia
93
+ #
94
+ EthiopianCoptic = [CyclicTableBased, {
95
+ 'label' => Parts::Resource._instance('_m:ChristianTerms::Ethiopian'),
96
+ 'origin_of_LSC' => 1825030,
97
+ 'origin_of_MSC' => 277,
98
+ 'epoch_in_CE' => 285,
99
+ 'indices' => [
100
+ When::Coordinates::Index.new({:unit =>13,
101
+ :trunk=>When::Parts::Resource._instance('_m:ChristianTerms::EthiopianMonth::*')}),
102
+ When::Coordinates::Index.new
103
+ ],
104
+ 'rule_table' => {
105
+ 'T' => {'Rule' =>[366,365,365,365]},
106
+ 365 => {'Length'=>[30]*12+[5]},
107
+ 366 => {'Length'=>[30]*12+[6]}
108
+ }
109
+ }]
110
+
111
+ #
112
+ # Julian Calendar
113
+ #
114
+ class Julian < When::TM::Calendar
115
+
116
+ # 年月日 -> 通日
117
+ #
118
+ # @param [Numeric] y 年
119
+ # @param [Integer] m 月 (0 始まり)
120
+ # @param [Integer] d 日 (0 始まり)
121
+ #
122
+ # @return [Integer] 通日
123
+ #
124
+ def _coordinates_to_number(y,m,d)
125
+ m = (+m + 10) % 12
126
+ y = +y + 4716 - m / 10
127
+ a = (1461*y.to_i ).div(4)
128
+ b = ( 153*m.to_i + 2).div(5)
129
+ return a + b + (+d) - 1401
130
+ end
131
+
132
+ # 通日 - > 年月日
133
+ #
134
+ # @param [Integer] jdn 通日
135
+ #
136
+ # @return [Array<Integer>] ( y, m, d )
137
+ # [ y 年 ]
138
+ # [ m 月 (0 始まり) ]
139
+ # [ d 日 (0 始まり) ]
140
+ #
141
+ def _number_to_coordinates(jdn)
142
+ j = jdn.to_i + 1401
143
+ y, t = (4*j + 3).divmod(1461)
144
+ t = t.div(4)
145
+ m, d = (5*t + 2).divmod(153)
146
+ d = d.div(5)
147
+ m = (m+2) % 12
148
+ y = y - 4716 + (13-m) / 12
149
+ return [y,m,d]
150
+ end
151
+
152
+ # 暦要素数
153
+ #
154
+ # @overload _length(date)
155
+ # @param [Array<Integer>] date ( 年 )
156
+ # @return [Integer] 12 (=その年の月数)
157
+ #
158
+ # @overload _length(date)
159
+ # @param [Array<Integer>] date ( 年, 月 )
160
+ # @note 月は 0 始まりの通番
161
+ # @return [Integer] その年月の日数
162
+ #
163
+ def _length(date)
164
+ yy, mm = date
165
+ return super unless(mm)
166
+ return ((yy % 4) == 0) ? 29 : 28 if (mm == 1)
167
+ return (((((mm + 10) % 12) % 5) % 2) == 0) ? 31 : 30
168
+ end
169
+
170
+ # 太陰方程式
171
+ #
172
+ # @param [Numeric] year 西暦の年数
173
+ # @return [Integer] 0 (ユリウス暦では補正なし)
174
+ #
175
+ def _lunar_equation(year)
176
+ 0
177
+ end
178
+
179
+ private
180
+
181
+ def _normalize(args=[], options={})
182
+ @label ||= When.Resource('_m:ChristianTerms::Julian')
183
+ @note = When.CalendarNote(@note || 'Christian')
184
+ @indices ||= [
185
+ Index.new({:unit =>12,
186
+ :trunk=>m17n('[::_m:CalendarTerms::Month::*]')}),
187
+
188
+ Index.new
189
+ ]
190
+ super
191
+ end
192
+ end
193
+
194
+ #
195
+ # Gregorian Calendar
196
+ #
197
+ class Gregorian < Julian
198
+
199
+ # 通日 - > ユリウス暦とグレゴリオ暦の差
200
+ #
201
+ # @param [Integer] jdn 通日
202
+ #
203
+ # @return [Integer] ユリウス暦とグレゴリオ暦の差
204
+ #
205
+ def self.diff(jdn)
206
+ div, mod = (jdn - 77528).divmod(36524.25)
207
+ c = div - 45
208
+ (3*(c-3)).div(4)+1
209
+ end
210
+
211
+ # 年月日 -> 通日
212
+ #
213
+ # @param [Numeric] y 年
214
+ # @param [Integer] m 月 (0 始まり)
215
+ # @param [Integer] d 日 (0 始まり)
216
+ #
217
+ # @return [Integer] 通日
218
+ #
219
+ def _coordinates_to_number(y,m,d)
220
+ c = ((m < 2) ? +y-1 : +y).to_i.div(100)
221
+ super - ((3*(c-3)).div(4)+1)
222
+ end
223
+
224
+ # 通日 - > 年月日
225
+ #
226
+ # @param [Integer] jdn 通日
227
+ #
228
+ # @return [Array<Integer>] [ y, m, d ]
229
+ # y 年
230
+ # m 月 (0 始まり)
231
+ # d 日 (0 始まり)
232
+ #
233
+ def _number_to_coordinates(jdn)
234
+ super(jdn + Gregorian.diff(jdn))
235
+ end
236
+
237
+ # 暦要素数
238
+ #
239
+ # @overload _length(date)
240
+ # @param [Array<Integer>] date ( 年 )
241
+ # @return [Integer] 12 (=その年の月数)
242
+ #
243
+ # @overload _length(date)
244
+ # @param [Array<Integer>] date ( 年, 月 )
245
+ # @note 月は 0 始まりの通番
246
+ # @return [Integer] その年月の日数
247
+ #
248
+ def _length(date)
249
+ yy, mm = date
250
+ return 28 if (((yy % 400) != 0) && ((yy % 100) == 0) && (mm == 1))
251
+ return super
252
+ end
253
+
254
+ # 太陰方程式
255
+ #
256
+ # @param [Numeric] year 西暦の年数
257
+ # @return [Integer] 19年7閏のペースに対する満月の日付の補正量
258
+ # @note 太陽暦日の補正も、本メソッドで行う
259
+ #
260
+ def _lunar_equation(year)
261
+ h = +year / 100
262
+ -h + h/4 + (8*(h+11))/25 - 3
263
+ end
264
+
265
+ private
266
+
267
+ def _normalize(args=[], options={})
268
+ @label ||= When.Resource('_m:ChristianTerms::Gregorian')
269
+ super
270
+ end
271
+ end
272
+
273
+ #
274
+ # Civil Calendar
275
+ #
276
+ class Civil < Gregorian
277
+
278
+ #
279
+ # グレゴリオ暦への改暦日付
280
+ #
281
+ # @return [Integer]
282
+ #
283
+ attr_reader :reform_jdn
284
+
285
+ #
286
+ # 年初の最初の定義の年
287
+ #
288
+ # @return [Integer] 年初の最初の定義の年
289
+ # @return nil
290
+ #
291
+ def first_year_of_border
292
+ return nil unless @border.kind_of?(When::CalendarTypes::MultiBorder)
293
+ year = @border.borders[-1][:key]
294
+ year.kind_of?(Integer) ? year : nil
295
+ end
296
+
297
+ # 年月日 -> 通日
298
+ #
299
+ # @param [Numeric] y 年
300
+ # @param [Integer] m 月 (0 始まり)
301
+ # @param [Integer] d 日 (0 始まり)
302
+ #
303
+ # @return [Integer] 通日
304
+ #
305
+ def _coordinates_to_number(y,m,d)
306
+ skip, limit = @the_length[[y,m]]
307
+ d += skip if skip && d >= limit
308
+ jdn = super(y,m,d)
309
+ jdn >= @reform_jdn ? jdn : @past._coordinates_to_number(y + @origin_of_MSC - @past.origin_of_MSC, m, d)
310
+ end
311
+
312
+ # 通日 - > 年月日
313
+ #
314
+ # @param [Integer] jdn 通日
315
+ #
316
+ # @return [Array<Integer>] ( y, m, d )
317
+ # [ y 年 ]
318
+ # [ m 月 (0 始まり) ]
319
+ # [ d 日 (0 始まり) ]
320
+ #
321
+ def _number_to_coordinates(jdn)
322
+ if jdn >= @reform_jdn
323
+ date = super
324
+ else
325
+ date = @past._number_to_coordinates(jdn)
326
+ date[0] -= @origin_of_MSC - @past.origin_of_MSC
327
+ end
328
+ skip, limit = @the_length[date[0..-2]]
329
+ date[2] -= skip if skip && date[2] >= limit
330
+ date
331
+ end
332
+
333
+ # 暦要素数
334
+ #
335
+ # @overload _length(date)
336
+ # @param [Array<Integer>] date ( 年 )
337
+ # @return [Integer] 12 (=その年の月数)
338
+ #
339
+ # @overload _length(date)
340
+ # @param [Array<Integer>] date ( 年, 月 )
341
+ # @note 月は 0 始まりの通番
342
+ # @return [Integer] その年月の日数
343
+ #
344
+ def _length(date)
345
+ return @the_length[date][2] if @the_length[date]
346
+ yy, mm = date
347
+ (yy > @reform_date[0]) ||
348
+ (yy == @reform_date[0] && (!mm || mm >= @reform_date[1])) ?
349
+ super :
350
+ @past._length([yy + @origin_of_MSC - @past.origin_of_MSC, mm])
351
+ end
352
+
353
+ # 太陰方程式
354
+ #
355
+ # @param [Numeric] year 西暦の年数
356
+ # @return [Integer] 19年7閏のペースに対する満月の日付の補正量
357
+ # @note 太陽暦日の補正も、本メソッドで行う
358
+ #
359
+ def _lunar_equation(year)
360
+ year >= @the_easter ? super : 0
361
+ end
362
+
363
+ private
364
+
365
+ # オブジェクトの正規化
366
+ #
367
+ # @past = グレゴリオ暦への改暦前の暦法
368
+ # @reform_date = 改暦日付(月日は 1 オリジンで指定し、0 オリジンに直して保持)
369
+ # @reform_jdn = 改暦日付のユリウス通日
370
+ # @the_easter = グレゴリオ暦の復活祭計算の適用を始める年
371
+ # @the_length = 通常と異なる日付となる年月の情報({[年,月]=>[スキップした日数, スキップし始める日, 月の日数]})
372
+ #
373
+ def _normalize(args=[], options={})
374
+ @label ||= When.Resource('_m:ChristianTerms::Civil')
375
+
376
+ # 前後の暦法
377
+ @past = When.Calendar(@past || 'Julian')
378
+ gregorian = When.Calendar('Gregorian')
379
+ @indices ||= @past.indices
380
+
381
+ # 改暦日付 (0 オリジン)
382
+ if @reform_date
383
+ @reform_date = When::Coordinates::Pair._en_pair_date_time(@reform_date) if @reform_date.kind_of?(String)
384
+ @reform_date = @reform_date.map {|c| c.to_i}
385
+ (1..2).each {|i| @reform_date[i] = @reform_date[i] ? @reform_date[i] - 1 : 0 }
386
+ @reform_jdn = gregorian._coordinates_to_number(*@reform_date)
387
+ else
388
+ @reform_jdn ||= 2299161 # 1582-10-15
389
+ @reform_jdn = @reform_jdn.to_i
390
+ @reform_date = gregorian._number_to_coordinates(@reform_jdn)
391
+ end
392
+ last_date = @past._number_to_coordinates(@reform_jdn-1)
393
+
394
+ # 復活祭との前後関係
395
+ @the_easter = @reform_jdn > When.CalendarNote('Christian').easter(@reform_date[0], gregorian) ? @reform_date[0]+1 : @reform_date[0]
396
+
397
+ # 月の日数
398
+ this_month = @reform_date[0..1]
399
+ greg_length = gregorian._length(this_month)
400
+ @the_length = {}
401
+ if @reform_date[1] == last_date[1] # 同一月内に閉じた改暦
402
+ skipped_length = @reform_date[2] - last_date[2] - 1
403
+ @the_length[this_month] = [skipped_length, last_date[2]+1, greg_length-skipped_length]
404
+ else
405
+ last_month = [(@reform_date[1] > last_date[1] ? @reform_date[0] : @reform_date[0]-1), last_date[1]]
406
+ @the_length[this_month] = [@reform_date[2], 0, greg_length - @reform_date[2]]
407
+ @the_length[last_month] = [false, false, last_date[2]+1]
408
+ end
409
+
410
+ super
411
+ end
412
+
413
+ #
414
+ # 整数のindex化
415
+ #
416
+ def _to_index(date)
417
+ digit = date[-1] - @base[date.length-1]
418
+ skip, limit = @the_length[date[0..-2]]
419
+ skip && digit >= limit ? digit-skip : digit
420
+ end
421
+
422
+ #
423
+ # indexの整数化
424
+ #
425
+ def _from_index(date)
426
+ digit = date[-1]
427
+ skip, limit = @the_length[date[0..-2]]
428
+ (skip && digit >= limit ? digit+skip : digit)+@base[date.length-1]
429
+ end
430
+ end
431
+
432
+ #
433
+ # 日時要素の境界 - 復活祭
434
+ #
435
+ class Easter < Border
436
+
437
+ # 境界の取得
438
+ #
439
+ # @param [Array<Numeric>] date 境界を計算する年
440
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法
441
+ #
442
+ # @return [Array<Numeric>] その年の境界
443
+ #
444
+ def border(date=[], frame=When.Calendar('Gregorian'))
445
+ frame._encode(frame._number_to_coordinates(frame.note.easter(date[0], frame)), false)
446
+ end
447
+
448
+ private
449
+
450
+ # 要素の正規化
451
+ def _normalize(args=[], options={})
452
+ @border = [0,0,0]
453
+ end
454
+ end
455
+
456
+ #
457
+ # キリスト教の暦注(クリスマスと復活祭)
458
+ #
459
+ class CalendarNote::Christian < CalendarNote
460
+
461
+ NoteObjects = [When::BasicTypes::M17n, [
462
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
463
+ "locale:[=en:, ja=ja:, alias]",
464
+ "names:[Christian]",
465
+
466
+ # 年の暦注 ----------------------------
467
+ [When::BasicTypes::M17n,
468
+ "names:[year]"
469
+ ],
470
+
471
+ # 月の暦注 ----------------------------
472
+ [When::BasicTypes::M17n,
473
+ "names:[month]",
474
+ [When::BasicTypes::M17n,
475
+ "names:[Month]"
476
+ ]
477
+ ],
478
+
479
+ # 日の暦注 ----------------------------
480
+ [When::BasicTypes::M17n,
481
+ "names:[day]",
482
+ [When::BasicTypes::M17n, "names:[Easter, 復活祭]" ],
483
+ [When::BasicTypes::M17n, "names:[Christmas, クリスマス]"]
484
+ ]
485
+ ]]
486
+
487
+ # 週日補正フラグ
488
+ # @return [Integer]
489
+ attr_reader :w
490
+
491
+ # 最も遅い満月の3月0日からの日数
492
+ # @return [Integer]
493
+ attr_reader :d
494
+
495
+ # クリスマスの3月0日からの日数
496
+ # @return [Integer]
497
+ attr_reader :x
498
+
499
+ # 平年数
500
+ # @return [Integer]
501
+ attr_reader :n
502
+
503
+ # 置閏周期
504
+ # @return [Integer]
505
+ attr_reader :s
506
+
507
+ # 月の位相の補正
508
+ # @return [Integer]
509
+ attr_reader :c
510
+
511
+ # ガード
512
+ # @return [Integer]
513
+ attr_reader :g
514
+
515
+ # ベース
516
+ # @return [Integer]
517
+ attr_reader :b
518
+
519
+ # 満月補正フラグ
520
+ # @return [Integer]
521
+ attr_reader :f
522
+
523
+ # クリスマス
524
+ #
525
+ # @param [Numeric] date 西暦の年数
526
+ # @param [When::TM::TemporalPosition] date
527
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
528
+ #
529
+ # @return [Integer] クリスマスのユリウス通日(dateが西暦の年数の場合)
530
+ # @return [When::TM::CalDate] クリスマスのWhen::TM::CalDate(yearがWhen::TM::TemporalPositionの場合)
531
+ #
532
+ def christmas(date, frame=nil)
533
+ _event(date, 'christmas', frame) do |year, frame|
534
+ @x - 1 + frame._coordinates_to_number(year, 2, 0)
535
+ end
536
+ end
537
+
538
+ # 復活祭
539
+ #
540
+ # @param [Numeric] date 西暦の年数
541
+ # @param [When::TM::TemporalPosition] date
542
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
543
+ #
544
+ # @return [Integer] 復活祭のユリウス通日(dateが西暦の年数の場合)
545
+ # @return [When::TM::CalDate] 復活祭のWhen::TM::CalDate(yearがWhen::TM::TemporalPositionの場合)
546
+ #
547
+ def easter(date, frame=nil)
548
+ _event(date, 'easter', frame) do |year, frame|
549
+ golden = (year+@b) % @s + 1
550
+ m = (frame._lunar_equation(year) + 11*golden + @c) % 30
551
+ if @f == 0
552
+ m += 1 if m==0 || m==1 && golden>=@n
553
+ else
554
+ m += (golden-1) / @f
555
+ m -= 30 if m>=@n
556
+ end
557
+ result = frame._coordinates_to_number(year, 2, 0) + @d - 1 - m
558
+ result += @g - (result-@w) % 7 if @w<7
559
+ result
560
+ end
561
+ end
562
+
563
+ # イベントの標準的な間隔を返す
564
+ # @private
565
+ def _delta(parameter=nil)
566
+ return When::DurationP1Y
567
+ end
568
+
569
+ # @private
570
+ alias :christmas_delta :_delta
571
+
572
+ # @private
573
+ alias :easter_delta :_delta
574
+
575
+ private
576
+
577
+ # オブジェクトの正規化
578
+ # w - 週日補正フラグ(デフォルト 6)
579
+ # d - 最も遅い満月 (デフォルト 3月0日から 50日)
580
+ # x - クリスマス (デフォルト 3月0日から300日)
581
+ # n - 平年数 (デフォルト 12)
582
+ # s - 置閏周期 (デフォルト 19)
583
+ # c - 月の位相の補正(デフォルト 3)
584
+ # g - ガード (デフォルト 7)
585
+ # b - ベース (デフォルト 0)
586
+ # f - 満月補正フラグ(デフォルト 0)
587
+ def _normalize(args=[], options={})
588
+ w, d, x, n, s, c, g, b, f = args
589
+ @w = (w || @w || 6).to_i
590
+ @d = (d || @d || 50).to_i
591
+ @x = (x || @x || 300).to_i
592
+ @n = (n || @n || 12).to_i
593
+ @s = (s || @s || 19).to_i
594
+ @c = (c || @c || 3).to_i
595
+ @g = (g || @g || 7).to_i
596
+ @b = (b || @b || 0).to_i
597
+ @f = (f || @f || 0).to_i
598
+ @event = 'easter'
599
+ @prime ||= [['Month'], nil]
600
+ super
601
+ end
602
+
603
+ #
604
+ # 任意の暦をグレゴリオorユリウス暦日に変換
605
+ #
606
+ def _to_date_for_note(date)
607
+ return date if date.frame.kind_of?(When::CalendarTypes::Julian)
608
+ When.Calendar(date.to_i < 2299161 ? 'Julian' : 'Gregorian') ^ date
609
+ end
610
+
611
+ # 当該年のイベントの日付
612
+ # date : 西暦の年数 or When::TM::(Temporal)Position
613
+ # event : イベント名 (String)
614
+ # frame : 暦法(デフォルトは When.Resource('_c:Gregorian'))
615
+ #
616
+ # @return [Integer] イベントのユリウス通日(dateが西暦の年数の場合)
617
+ # @return [When::TM::CalDate] イベントのWhen::TM::CalDate(yearがWhen::TM::(Temporal)Positionの場合)
618
+ #
619
+ def _event(date, event, frame=nil)
620
+ case date
621
+ when Numeric
622
+ year = date * 1
623
+ when When::TimeValue
624
+ options = date._attr
625
+ options[:precision] = When::DAY
626
+ options[:events] = [event]
627
+ if frame
628
+ frame = When.Calendar(frame)
629
+ date = frame.jul_trans(date, options)
630
+ else
631
+ frame = date.frame
632
+ end
633
+ year = date.most_significant_coordinate * 1
634
+ else
635
+ raise TypeError, "Irregal date type: #{date.class}"
636
+ end
637
+ frame ||= When.Resource('_c:Gregorian')
638
+ result = yield(year, frame)
639
+ return result if date.kind_of?(Numeric)
640
+ return frame.jul_trans(result, options)
641
+ end
642
+ end
643
+ end
644
+ end