when_exe 0.2.100 → 0.3.1

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