when_exe 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. data/bin/locales.rb +2 -2
  2. data/bin/when.rb +2 -2
  3. data/lib/when_exe.rb +161 -55
  4. data/lib/when_exe/basictypes.rb +34 -26
  5. data/lib/when_exe/calendarnote.rb +654 -0
  6. data/lib/when_exe/calendartypes.rb +49 -474
  7. data/lib/when_exe/coordinates.rb +141 -34
  8. data/lib/when_exe/core/compatibility.rb +22 -2
  9. data/lib/when_exe/core/extension.rb +47 -3
  10. data/lib/when_exe/ephemeris.rb +82 -109
  11. data/lib/when_exe/googlecalendar.rb +1 -1
  12. data/lib/when_exe/icalendar.rb +26 -14
  13. data/lib/when_exe/inspect.rb +82 -68
  14. data/lib/when_exe/locales/af.rb +1 -1
  15. data/lib/when_exe/locales/ar.rb +1 -1
  16. data/lib/when_exe/locales/az.rb +1 -1
  17. data/lib/when_exe/locales/bg.rb +1 -1
  18. data/lib/when_exe/locales/bn.rb +1 -1
  19. data/lib/when_exe/locales/bs.rb +1 -1
  20. data/lib/when_exe/locales/ca.rb +1 -1
  21. data/lib/when_exe/locales/cs.rb +1 -1
  22. data/lib/when_exe/locales/cy.rb +1 -1
  23. data/lib/when_exe/locales/da.rb +1 -1
  24. data/lib/when_exe/locales/de.rb +1 -1
  25. data/lib/when_exe/locales/de_AT.rb +1 -1
  26. data/lib/when_exe/locales/de_CH.rb +1 -1
  27. data/lib/when_exe/locales/el.rb +1 -1
  28. data/lib/when_exe/locales/en.rb +1 -1
  29. data/lib/when_exe/locales/en_AU.rb +1 -1
  30. data/lib/when_exe/locales/en_CA.rb +1 -1
  31. data/lib/when_exe/locales/en_GB.rb +1 -1
  32. data/lib/when_exe/locales/en_IE.rb +1 -1
  33. data/lib/when_exe/locales/en_IN.rb +1 -1
  34. data/lib/when_exe/locales/en_NZ.rb +1 -1
  35. data/lib/when_exe/locales/en_US.rb +1 -1
  36. data/lib/when_exe/locales/eo.rb +1 -1
  37. data/lib/when_exe/locales/es.rb +1 -1
  38. data/lib/when_exe/locales/es_419.rb +1 -1
  39. data/lib/when_exe/locales/es_AR.rb +1 -1
  40. data/lib/when_exe/locales/es_CL.rb +1 -1
  41. data/lib/when_exe/locales/es_CO.rb +1 -1
  42. data/lib/when_exe/locales/es_CR.rb +1 -1
  43. data/lib/when_exe/locales/es_EC.rb +1 -1
  44. data/lib/when_exe/locales/es_MX.rb +1 -1
  45. data/lib/when_exe/locales/es_PA.rb +1 -1
  46. data/lib/when_exe/locales/es_PE.rb +1 -1
  47. data/lib/when_exe/locales/es_VE.rb +1 -1
  48. data/lib/when_exe/locales/et.rb +1 -1
  49. data/lib/when_exe/locales/eu.rb +1 -1
  50. data/lib/when_exe/locales/fa.rb +1 -1
  51. data/lib/when_exe/locales/fi.rb +1 -1
  52. data/lib/when_exe/locales/fr.rb +1 -1
  53. data/lib/when_exe/locales/fr_CA.rb +1 -1
  54. data/lib/when_exe/locales/fr_CH.rb +1 -1
  55. data/lib/when_exe/locales/gl.rb +1 -1
  56. data/lib/when_exe/locales/he.rb +1 -1
  57. data/lib/when_exe/locales/hi.rb +1 -1
  58. data/lib/when_exe/locales/hi_IN.rb +1 -1
  59. data/lib/when_exe/locales/hr.rb +1 -1
  60. data/lib/when_exe/locales/hu.rb +1 -1
  61. data/lib/when_exe/locales/id.rb +1 -1
  62. data/lib/when_exe/locales/is.rb +1 -1
  63. data/lib/when_exe/locales/it.rb +1 -1
  64. data/lib/when_exe/locales/it_CH.rb +1 -1
  65. data/lib/when_exe/locales/ja.rb +1 -1
  66. data/lib/when_exe/locales/kn.rb +1 -1
  67. data/lib/when_exe/locales/ko.rb +1 -1
  68. data/lib/when_exe/locales/lo.rb +1 -1
  69. data/lib/when_exe/locales/locales.rb +1 -1
  70. data/lib/when_exe/locales/lt.rb +1 -1
  71. data/lib/when_exe/locales/lv.rb +1 -1
  72. data/lib/when_exe/locales/mk.rb +1 -1
  73. data/lib/when_exe/locales/mn.rb +1 -1
  74. data/lib/when_exe/locales/ms.rb +1 -1
  75. data/lib/when_exe/locales/nb.rb +1 -1
  76. data/lib/when_exe/locales/ne.rb +1 -1
  77. data/lib/when_exe/locales/nl.rb +1 -1
  78. data/lib/when_exe/locales/nn.rb +1 -1
  79. data/lib/when_exe/locales/or.rb +1 -1
  80. data/lib/when_exe/locales/pl.rb +1 -1
  81. data/lib/when_exe/locales/pt.rb +1 -1
  82. data/lib/when_exe/locales/pt_BR.rb +1 -1
  83. data/lib/when_exe/locales/rm.rb +1 -1
  84. data/lib/when_exe/locales/ro.rb +1 -1
  85. data/lib/when_exe/locales/ru.rb +1 -1
  86. data/lib/when_exe/locales/sk.rb +1 -1
  87. data/lib/when_exe/locales/sl.rb +1 -1
  88. data/lib/when_exe/locales/sr.rb +1 -1
  89. data/lib/when_exe/locales/sv.rb +1 -1
  90. data/lib/when_exe/locales/sw.rb +1 -1
  91. data/lib/when_exe/locales/th.rb +1 -1
  92. data/lib/when_exe/locales/tl.rb +1 -1
  93. data/lib/when_exe/locales/tr.rb +1 -1
  94. data/lib/when_exe/locales/uk.rb +1 -1
  95. data/lib/when_exe/locales/ur.rb +1 -1
  96. data/lib/when_exe/locales/uz.rb +1 -1
  97. data/lib/when_exe/locales/vi.rb +1 -1
  98. data/lib/when_exe/locales/wo.rb +1 -1
  99. data/lib/when_exe/locales/zh_CN.rb +1 -1
  100. data/lib/when_exe/locales/zh_HK.rb +1 -1
  101. data/lib/when_exe/locales/zh_TW.rb +1 -1
  102. data/lib/when_exe/mini_application.rb +6 -2
  103. data/lib/when_exe/parts/enumerator.rb +13 -8
  104. data/lib/when_exe/parts/geometric_complex.rb +3 -5
  105. data/lib/when_exe/parts/locale.rb +185 -28
  106. data/lib/when_exe/parts/method_cash.rb +20 -10
  107. data/lib/when_exe/parts/resource.rb +154 -76
  108. data/lib/when_exe/parts/timezone.rb +11 -6
  109. data/lib/when_exe/region/bahai.rb +2 -2
  110. data/lib/when_exe/region/balinese.rb +296 -296
  111. data/lib/when_exe/region/chinese.rb +564 -564
  112. data/lib/when_exe/region/chinese_calendar.rb +5 -1
  113. data/lib/when_exe/region/chinese_epoch.rb +47 -102
  114. data/lib/when_exe/region/chinese_twin.rb +798 -0
  115. data/lib/when_exe/region/christian.rb +314 -338
  116. data/lib/when_exe/region/coptic.rb +88 -0
  117. data/lib/when_exe/region/ephemeric_notes.rb +322 -307
  118. data/lib/when_exe/region/french.rb +2 -2
  119. data/lib/when_exe/region/indian.rb +361 -272
  120. data/lib/when_exe/region/iranian.rb +2 -2
  121. data/lib/when_exe/region/islamic.rb +3 -3
  122. data/lib/when_exe/region/japanese.rb +1 -1
  123. data/lib/when_exe/region/japanese_notes.rb +165 -103
  124. data/lib/when_exe/region/japanese_residues.rb +56 -55
  125. data/lib/when_exe/region/japanese_twin.rb +228 -0
  126. data/lib/when_exe/region/javanese.rb +2 -2
  127. data/lib/when_exe/region/jewish.rb +2 -2
  128. data/lib/when_exe/region/korean.rb +4 -4
  129. data/lib/when_exe/region/m17n.rb +19 -19
  130. data/lib/when_exe/region/martian.rb +21 -9
  131. data/lib/when_exe/region/mayan.rb +19 -11
  132. data/lib/when_exe/region/moon.rb +7 -7
  133. data/lib/when_exe/region/nihon_shoki.rb +7 -7
  134. data/lib/when_exe/region/roman.rb +100 -100
  135. data/lib/when_exe/region/shire.rb +130 -147
  136. data/lib/when_exe/region/thai.rb +2 -2
  137. data/lib/when_exe/region/tibetan.rb +2 -2
  138. data/lib/when_exe/region/vietnamese.rb +383 -114
  139. data/lib/when_exe/region/world.rb +112 -129
  140. data/lib/when_exe/timestandard.rb +12 -1
  141. data/lib/when_exe/tmposition.rb +28 -14
  142. data/lib/when_exe/tmreference.rb +96 -93
  143. data/lib/when_exe/version.rb +1 -1
  144. data/test/examples/Terms.m17n +2 -2
  145. data/test/examples/sample.json +16 -0
  146. data/test/examples/sample.xml +1 -1
  147. data/test/test.rb +4 -0
  148. data/test/test/basictypes.rb +2 -2
  149. data/test/test/calendarnote.rb +69 -0
  150. data/test/test/calendartypes.rb +41 -1
  151. data/test/test/coordinates.rb +12 -1
  152. data/test/test/ephemeris.rb +13 -66
  153. data/test/test/icalendar.rb +3 -3
  154. data/test/test/inspect.rb +1 -1
  155. data/test/test/parts.rb +7 -4
  156. data/test/test/region/chinese.rb +45 -0
  157. data/test/test/region/coptic.rb +27 -0
  158. data/test/test/region/indian.rb +1 -1
  159. data/test/test/region/japanese.rb +4 -4
  160. data/test/test/region/jewish.rb +1 -1
  161. data/test/test/region/m17n.rb +7 -5
  162. data/test/test/region/residue.rb +2 -2
  163. data/test/test/region/vietnamese.rb +102 -0
  164. data/test/test/timestandard.rb +81 -0
  165. data/test/test/tmposition.rb +1 -1
  166. data/test/test/tmreference.rb +1 -1
  167. data/when_exe.gemspec +2 -2
  168. metadata +16 -7
@@ -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,46 +12,10 @@ module When
12
12
  ChristianTerms = [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:[ChristianTerms]",
15
+ "names:[ChristianTerms=]",
16
16
  "[Julian=en:Julian_calendar, ユリウス暦 ]",
17
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:%%<月_(暦)>]",
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:%%<月_(暦)>]",
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
- ]
18
+ "[Civil in the West=en:Civil_calendar, 西暦, *alias:Civil]"
55
19
  ]]
56
20
  end
57
21
 
@@ -69,49 +33,22 @@ module When
69
33
  module CalendarTypes
70
34
 
71
35
  #
72
- # Coptic Calendar in Egypt
36
+ # Christian Base Calendar
73
37
  #
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
- }]
38
+ class Christian < When::TM::Calendar
90
39
 
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
40
+ # @private
41
+ #
42
+ # ::Date オブジェクトに対応する暦法名
43
+ # (require 'Date' されていることの保証は呼び出し側)
44
+ #
45
+ def self._default_start(date)
46
+ case date.start
47
+ when ::Date::JULIAN ; 'Julian'
48
+ when ::Date::GREGORIAN ; 'Gregorian'
49
+ else ; "Civil?reform_jdn=#{date.start}"
50
+ end
51
+ end
115
52
 
116
53
  # 年月日 -> 通日
117
54
  #
@@ -167,6 +104,26 @@ module When
167
104
  return (((((mm + 10) % 12) % 5) % 2) == 0) ? 31 : 30
168
105
  end
169
106
 
107
+ private
108
+
109
+ def _normalize(args=[], options={})
110
+ raise TypeError, "#{self.class} is abstract class" unless @label
111
+ @note = When.CalendarNote(@note || 'Christian')
112
+ @indices ||= [
113
+ Index.new({:unit =>12,
114
+ :trunk=>m17n('[::_m:CalendarTerms::Month::*]')}),
115
+
116
+ DefaultDayIndex
117
+ ]
118
+ super
119
+ end
120
+ end
121
+
122
+ #
123
+ # Julian Calendar
124
+ #
125
+ class Julian < Christian
126
+
170
127
  # 太陰方程式
171
128
  #
172
129
  # @param [Numeric] year 西暦の年数
@@ -176,17 +133,17 @@ module When
176
133
  0
177
134
  end
178
135
 
136
+ # @private
137
+ #
138
+ # 対応する ::Date の start 属性
139
+ def _default_start
140
+ ::Date::JULIAN
141
+ end
142
+
179
143
  private
180
144
 
181
145
  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
- DefaultDayIndex
189
- ]
146
+ @label ||= When.Resource('_m:ChristianTerms::Julian')
190
147
  super
191
148
  end
192
149
  end
@@ -194,7 +151,7 @@ module When
194
151
  #
195
152
  # Gregorian Calendar
196
153
  #
197
- class Gregorian < Julian
154
+ class Gregorian < Christian
198
155
 
199
156
  # 通日 - > ユリウス暦とグレゴリオ暦の差
200
157
  #
@@ -282,6 +239,11 @@ module When
282
239
  #
283
240
  attr_reader :reform_jdn
284
241
 
242
+ # @private
243
+ #
244
+ # 対応する ::Date の start 属性
245
+ alias :_default_start :reform_jdn
246
+
285
247
  #
286
248
  # 年初の最初の定義の年
287
249
  #
@@ -460,280 +422,294 @@ module When
460
422
  @border = [0,0,0]
461
423
  end
462
424
  end
425
+ end
463
426
 
464
- #
465
- # キリスト教の暦注(クリスマスと復活祭)
466
- #
467
- class CalendarNote::Christian < CalendarNote
468
-
469
- NoteObjects = [When::BasicTypes::M17n, [
470
- "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
471
- "locale:[=en:, ja=ja:, alias]",
472
- "names:[Christian]",
427
+ #
428
+ # キリスト教の暦注(クリスマスと復活祭)
429
+ #
430
+ class CalendarNote::Christian < CalendarNote
473
431
 
474
- # 年の暦注 ----------------------------
475
- [When::BasicTypes::M17n,
476
- "names:[year]"
477
- ],
432
+ NoteObjects = [When::BasicTypes::M17n, [
433
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
434
+ "locale:[=en:, ja=ja:, alias]",
435
+ "names:[Christian]",
478
436
 
479
- # 月の暦注 ----------------------------
480
- [When::BasicTypes::M17n,
481
- "names:[month]",
482
- [When::BasicTypes::M17n,
483
- "names:[Month]"
484
- ]
485
- ],
437
+ # 年の暦注 ----------------------------
438
+ [When::BasicTypes::M17n,
439
+ "names:[year]"
440
+ ],
486
441
 
487
- # 日の暦注 ----------------------------
442
+ # 月の暦注 ----------------------------
443
+ [When::BasicTypes::M17n,
444
+ "names:[month]",
488
445
  [When::BasicTypes::M17n,
489
- "names:[day]",
490
- [When::BasicTypes::M17n, "names:[Easter, 復活祭]" ],
491
- [When::BasicTypes::M17n, "names:[Christmas, クリスマス]"],
492
- [When::BasicTypes::M17n, "names:[Fixed_feast=, 固定祝日=]" ],
493
- [When::BasicTypes::M17n, "names:[Moveable_feast, 移動祝日]" ]
446
+ "names:[Month]"
494
447
  ]
495
- ]]
496
-
497
- # 固定祝日
498
- Fixed_feasts = {
499
- [ 1, 6] => "Epiphany",
500
- [ 3, 1] => "St.David's Day",
501
- [ 3, 17] => "St.Patrick's Day",
502
- [ 3, 25] => "Annunciation-Lady Day",
503
- [ 4, 23] => "St.George's Day",
504
- [ 6, 24] => "Midsummer Day",
505
- [ 9, 14] => "Holy Cross Day",
506
- [ 9, 29] => "Michaelmas Day",
507
- [11, 30] => "St.Andrew's Day",
508
- [12, 13] => "St.Lucia's Day",
509
- [12, 21] => "St.Thomas's Day",
510
- # [12, 25] => "Christmas Day"
511
- }
512
-
513
- # 移動祝日 (日付と曜日による)
514
- moveable_feasts = {}
515
- [[[ 9, 15, 2], "III Quatember"],
516
- [[11, 27, 6], "Advent Sunday"],
517
- [[12, 14, 2], "IV Quatember" ]].each do |pair|
518
- date, name = pair
519
- 7.times do
520
- moveable_feasts[date.dup] = name
521
- date[1] += 1
522
- if date[1] > 30
523
- date[0] += 1
524
- date[1] = 1
525
- end
526
- end
527
- end
528
-
529
- # 移動祝日
530
- Moveable_feasts = {
531
- # 復活祭からの日数による
532
- -63 => "Septuagesima Sunday",
533
- -56 => "Sexagesima Sunday",
534
- -49 => "Quinquagesima Sunday",
535
- -46 => "Ash Wednesday",
536
- -42 => "Quadragesima Sunday",
537
- -40 => "I Quatember",
538
- -35 => "Reminizer Sunday",
539
- -28 => "Oculi Sunday",
540
- -21 => "Laetare Sunday",
541
- -14 => "Judica Sunday",
542
- -7 => "Palmarum",
543
- -2 => "Good Friday",
544
- # 0 => "Easter Day",
545
- 7 => "Low Sunday",
546
- 35 => "Rogation Sunday",
547
- 39 => "Ascension Day",
548
- 49 => "Whitsunday",
549
- 53 => "II Quatember",
550
- 56 => "Trinity Sunday",
551
- 60 => "Corpus Christi",
552
- }.update(moveable_feasts)
553
-
554
- # 週日補正フラグ
555
- # @return [Integer]
556
- attr_reader :w
557
-
558
- # 最も遅い満月の3月0日からの日数
559
- # @return [Integer]
560
- attr_reader :d
561
-
562
- # クリスマスの3月0日からの日数
563
- # @return [Integer]
564
- attr_reader :x
565
-
566
- # 平年数
567
- # @return [Integer]
568
- attr_reader :n
569
-
570
- # 置閏周期
571
- # @return [Integer]
572
- attr_reader :s
573
-
574
- # 月の位相の補正
575
- # @return [Integer]
576
- attr_reader :c
577
-
578
- # ガード
579
- # @return [Integer]
580
- attr_reader :g
581
-
582
- # ベース
583
- # @return [Integer]
584
- attr_reader :b
448
+ ],
585
449
 
586
- # 満月補正フラグ
587
- # @return [Integer]
588
- attr_reader :f
450
+ # 日の暦注 ----------------------------
451
+ [When::BasicTypes::M17n,
452
+ "names:[day]",
453
+ [When::BasicTypes::M17n, "names:[Week, 七曜]" ],
454
+ [When::BasicTypes::M17n, "names:[Easter, 復活祭]" ],
455
+ [When::BasicTypes::M17n, "names:[Christmas, クリスマス]"],
456
+ [When::BasicTypes::M17n, "names:[Fixed_feast=, 固定祝日=]" ],
457
+ [When::BasicTypes::M17n, "names:[Moveable_feast, 移動祝日]" ]
458
+ ]
459
+ ]]
589
460
 
590
- # クリスマス
591
- #
592
- # @param [Numeric] date 西暦の年数
593
- # @param [When::TM::TemporalPosition] date
594
- # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
595
- #
596
- # @return [Integer] クリスマスのユリウス通日(dateが西暦の年数の場合)
597
- # @return [When::TM::CalDate] クリスマスのWhen::TM::CalDate(yearがWhen::TM::TemporalPositionの場合)
598
- #
599
- def christmas(date, frame=nil)
600
- _event(date, 'christmas', frame) do |year, frame|
601
- @x - 1 + frame._coordinates_to_number(year, 2, 0)
461
+ # 固定祝日
462
+ Fixed_feasts = {
463
+ [ 1, 6] => "Epiphany",
464
+ [ 3, 1] => "St.David's Day",
465
+ [ 3, 17] => "St.Patrick's Day",
466
+ [ 3, 25] => "Annunciation-Lady Day",
467
+ [ 4, 23] => "St.George's Day",
468
+ [ 6, 24] => "Midsummer Day",
469
+ [ 9, 14] => "Holy Cross Day",
470
+ [ 9, 29] => "Michaelmas Day",
471
+ [11, 30] => "St.Andrew's Day",
472
+ [12, 13] => "St.Lucia's Day",
473
+ [12, 21] => "St.Thomas's Day",
474
+ # [12, 25] => "Christmas Day"
475
+ }
476
+
477
+ # 移動祝日 (日付と曜日による)
478
+ moveable_feasts = {}
479
+ [[[ 9, 15, 2], "III Quatember"],
480
+ [[11, 27, 6], "Advent Sunday"],
481
+ [[12, 14, 2], "IV Quatember" ]].each do |pair|
482
+ date, name = pair
483
+ 7.times do
484
+ moveable_feasts[date.dup] = name
485
+ date[1] += 1
486
+ if date[1] > 30
487
+ date[0] += 1
488
+ date[1] = 1
602
489
  end
603
490
  end
491
+ end
604
492
 
605
- # 復活祭
606
- #
607
- # @param [Numeric] date 西暦の年数
608
- # @param [When::TM::TemporalPosition] date
609
- # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
610
- #
611
- # @return [Integer] 復活祭のユリウス通日(dateが西暦の年数の場合)
612
- # @return [When::TM::CalDate] 復活祭のWhen::TM::CalDate(yearがWhen::TM::TemporalPositionの場合)
613
- #
614
- def easter(date, frame=nil)
615
- _event(date, 'easter', frame) do |year, frame|
616
- golden = (year+@b) % @s + 1
617
- m = (frame._lunar_equation(year) + 11*golden + @c) % 30
618
- if @f == 0
619
- m += 1 if m==0 || m==1 && golden>=@n
620
- else
621
- m += (golden-1) / @f
622
- m -= 30 if m>=@n
623
- end
624
- result = frame._coordinates_to_number(year, 2, 0) + @d - 1 - m
625
- result += @g - (result-@w) % 7 if @w<7
626
- result
627
- end
493
+ # 移動祝日
494
+ Moveable_feasts = {
495
+ # 復活祭からの日数による
496
+ -63 => "Septuagesima Sunday",
497
+ -56 => "Sexagesima Sunday",
498
+ -49 => "Quinquagesima Sunday",
499
+ -46 => "Ash Wednesday",
500
+ -42 => "Quadragesima Sunday",
501
+ -40 => "I Quatember",
502
+ -35 => "Reminizer Sunday",
503
+ -28 => "Oculi Sunday",
504
+ -21 => "Laetare Sunday",
505
+ -14 => "Judica Sunday",
506
+ -7 => "Palmarum",
507
+ -2 => "Good Friday",
508
+ # 0 => "Easter Day",
509
+ 7 => "Low Sunday",
510
+ 35 => "Rogation Sunday",
511
+ 39 => "Ascension Day",
512
+ 49 => "Whitsunday",
513
+ 53 => "II Quatember",
514
+ 56 => "Trinity Sunday",
515
+ 60 => "Corpus Christi",
516
+ }.update(moveable_feasts)
517
+
518
+ # 週日補正フラグ
519
+ # @return [Integer]
520
+ attr_reader :w
521
+
522
+ # 最も遅い満月の3月0日からの日数
523
+ # @return [Integer]
524
+ attr_reader :d
525
+
526
+ # クリスマスの3月0日からの日数
527
+ # @return [Integer]
528
+ attr_reader :x
529
+
530
+ # 平年数
531
+ # @return [Integer]
532
+ attr_reader :n
533
+
534
+ # 置閏周期
535
+ # @return [Integer]
536
+ attr_reader :s
537
+
538
+ # 月の位相の補正
539
+ # @return [Integer]
540
+ attr_reader :c
541
+
542
+ # ガード
543
+ # @return [Integer]
544
+ attr_reader :g
545
+
546
+ # ベース
547
+ # @return [Integer]
548
+ attr_reader :b
549
+
550
+ # 満月補正フラグ
551
+ # @return [Integer]
552
+ attr_reader :f
553
+
554
+ # 七曜
555
+ #
556
+ # @param [When::TM::TemporalPosition] date
557
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(ダミー)
558
+ #
559
+ # @return [When::Coordinates::Residue] 七曜
560
+ #
561
+ def week(date, frame=nil)
562
+ When.Residue('Week')[date.to_i % 7]
563
+ end
564
+
565
+ # クリスマス
566
+ #
567
+ # @param [Numeric] date 西暦の年数
568
+ # @param [When::TM::TemporalPosition] date
569
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
570
+ #
571
+ # @return [Integer] クリスマスのユリウス通日(dateが西暦の年数の場合)
572
+ # @return [When::TM::CalDate] クリスマスのWhen::TM::CalDate(yearがWhen::TM::TemporalPositionの場合)
573
+ #
574
+ def christmas(date, frame=nil)
575
+ _event(date, 'christmas', frame) do |year, frame|
576
+ @x - 1 + frame._coordinates_to_number(year, 2, 0)
628
577
  end
578
+ end
629
579
 
630
- # イベントの標準的な間隔を返す
631
- # @private
632
- def _delta(parameter=nil)
633
- return When::DurationP1Y
580
+ # 復活祭
581
+ #
582
+ # @param [Numeric] date 西暦の年数
583
+ # @param [When::TM::TemporalPosition] date
584
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
585
+ #
586
+ # @return [Integer] 復活祭のユリウス通日(dateが西暦の年数の場合)
587
+ # @return [When::TM::CalDate] 復活祭のWhen::TM::CalDate(yearがWhen::TM::TemporalPositionの場合)
588
+ #
589
+ def easter(date, frame=nil)
590
+ _event(date, 'easter', frame) do |year, frame|
591
+ golden = (year+@b) % @s + 1
592
+ m = (frame._lunar_equation(year) + 11*golden + @c) % 30
593
+ if @f == 0
594
+ m += 1 if m==0 || m==1 && golden>=@n
595
+ else
596
+ m += (golden-1) / @f
597
+ m -= 30 if m>=@n
598
+ end
599
+ result = frame._coordinates_to_number(year, 2, 0) + @d - 1 - m
600
+ result += @g - (result-@w) % 7 if @w<7
601
+ result
634
602
  end
603
+ end
635
604
 
636
- # @private
637
- alias :christmas_delta :_delta
605
+ # イベントの標準的な間隔を返す
606
+ # @private
607
+ def _delta(parameter=nil)
608
+ return When::DurationP1Y
609
+ end
638
610
 
639
- # @private
640
- alias :easter_delta :_delta
611
+ # @private
612
+ alias :christmas_delta :_delta
641
613
 
642
- # 固定祝日
643
- #
644
- # @param [When::TM::TemporalPosition] date
645
- # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
646
- #
647
- # @return [String] 祝日の名称
648
- # @return [nil] 祝日に該当しない
649
- #
650
- def fixed_feast(date, frame=nil)
651
- date = When.Calendar(frame||'Gregorian') ^ date unless date.frame.kind_of?(When::CalendarTypes::Julian)
652
- Fixed_feasts[date.cal_date[-2..-1]]
653
- end
614
+ # @private
615
+ alias :easter_delta :_delta
654
616
 
655
- # 移動祝日
656
- #
657
- # @param [When::TM::TemporalPosition] date
658
- # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
659
- #
660
- # @return [String] 祝日の名称
661
- # @return [nil] 祝日に該当しない
662
- #
663
- def moveable_feast(date, frame=nil)
664
- result = Moveable_feasts[date.to_i - easter(date, frame).to_i]
665
- return result if result
666
- date = When.Calendar(frame||'Gregorian') ^ date unless date.frame.kind_of?(When::CalendarTypes::Julian)
667
- Moveable_feasts[date.cal_date[-2..-1] + [date.to_i % 7]]
668
- end
617
+ # 固定祝日
618
+ #
619
+ # @param [When::TM::TemporalPosition] date
620
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
621
+ #
622
+ # @return [String] 祝日の名称
623
+ # @return [nil] 祝日に該当しない
624
+ #
625
+ def fixed_feast(date, frame=nil)
626
+ date = When.Calendar(frame||'Gregorian') ^ date unless date.frame.kind_of?(When::CalendarTypes::Christian)
627
+ Fixed_feasts[date.cal_date[-2..-1]]
628
+ end
669
629
 
670
- private
630
+ # 移動祝日
631
+ #
632
+ # @param [When::TM::TemporalPosition] date
633
+ # @param [When::TM::ReferenceSystem] frame 使用する暦法(デフォルトは When.Resource('_c:Gregorian'))
634
+ #
635
+ # @return [String] 祝日の名称
636
+ # @return [nil] 祝日に該当しない
637
+ #
638
+ def moveable_feast(date, frame=nil)
639
+ result = Moveable_feasts[date.to_i - easter(date, frame).to_i]
640
+ return result if result
641
+ date = When.Calendar(frame||'Gregorian') ^ date unless date.frame.kind_of?(When::CalendarTypes::Christian)
642
+ Moveable_feasts[date.cal_date[-2..-1] + [date.to_i % 7]]
643
+ end
671
644
 
672
- # オブジェクトの正規化
673
- # w - 週日補正フラグ(デフォルト 6)
674
- # d - 最も遅い満月 (デフォルト 3月0日から 50日)
675
- # x - クリスマス (デフォルト 3月0日から300日)
676
- # n - 平年数 (デフォルト 12)
677
- # s - 置閏周期 (デフォルト 19)
678
- # c - 月の位相の補正(デフォルト 3)
679
- # g - ガード (デフォルト 7)
680
- # b - ベース (デフォルト 0)
681
- # f - 満月補正フラグ(デフォルト 0)
682
- def _normalize(args=[], options={})
683
- w, d, x, n, s, c, g, b, f = args
684
- @w = (w || @w || 6).to_i
685
- @d = (d || @d || 50).to_i
686
- @x = (x || @x || 300).to_i
687
- @n = (n || @n || 12).to_i
688
- @s = (s || @s || 19).to_i
689
- @c = (c || @c || 3).to_i
690
- @g = (g || @g || 7).to_i
691
- @b = (b || @b || 0).to_i
692
- @f = (f || @f || 0).to_i
693
- @event = 'easter'
694
- @prime ||= [['Month'], nil]
695
- super
696
- end
645
+ private
646
+
647
+ # オブジェクトの正規化
648
+ # w - 週日補正フラグ(デフォルト 6)
649
+ # d - 最も遅い満月 (デフォルト 3月0日から 50日)
650
+ # x - クリスマス (デフォルト 3月0日から300日)
651
+ # n - 平年数 (デフォルト 12)
652
+ # s - 置閏周期 (デフォルト 19)
653
+ # c - 月の位相の補正(デフォルト 3)
654
+ # g - ガード (デフォルト 7)
655
+ # b - ベース (デフォルト 0)
656
+ # f - 満月補正フラグ(デフォルト 0)
657
+ def _normalize(args=[], options={})
658
+ w, d, x, n, s, c, g, b, f = args
659
+ @w = (w || @w || 6).to_i
660
+ @d = (d || @d || 50).to_i
661
+ @x = (x || @x || 300).to_i
662
+ @n = (n || @n || 12).to_i
663
+ @s = (s || @s || 19).to_i
664
+ @c = (c || @c || 3).to_i
665
+ @g = (g || @g || 7).to_i
666
+ @b = (b || @b || 0).to_i
667
+ @f = (f || @f || 0).to_i
668
+ @event = 'easter'
669
+ @prime ||= [['Month'], ['Week']]
670
+ super
671
+ end
697
672
 
698
- #
699
- # 任意の暦をグレゴリオorユリウス暦日に変換
700
- #
701
- def _to_date_for_note(date)
702
- return date if date.frame.kind_of?(When::CalendarTypes::Julian)
703
- When.Calendar(date.to_i < 2299161 ? 'Julian' : 'Gregorian') ^ date
704
- end
673
+ #
674
+ # 任意の暦をグレゴリオorユリウス暦日に変換
675
+ #
676
+ def _to_date_for_note(date)
677
+ return When.Calendar(When::CalendarTypes::Christian._default_start(date)) ^ date if ::Object.const_defined?(:Date) && date.kind_of?(::Date)
678
+ return When.Calendar('Gregorian') ^ date if date.kind_of?(::Time)
679
+ return date if date.frame.kind_of?(When::CalendarTypes::Christian)
680
+ When.Calendar(date.frame.iri =~ /Coptic/ || date.to_i < 2299161 ? 'Julian' : 'Gregorian') ^ date
681
+ end
705
682
 
706
- # 当該年のイベントの日付
707
- # date : 西暦の年数 or When::TM::(Temporal)Position
708
- # event : イベント名 (String)
709
- # frame : 暦法(デフォルトは When.Resource('_c:Gregorian'))
710
- #
711
- # @return [Integer] イベントのユリウス通日(dateが西暦の年数の場合)
712
- # @return [When::TM::CalDate] イベントのWhen::TM::CalDate(yearがWhen::TM::(Temporal)Positionの場合)
713
- #
714
- def _event(date, event, frame=nil)
715
- case date
716
- when Numeric
717
- year = date * 1
718
- when When::TimeValue
719
- options = date._attr
720
- options[:precision] = When::DAY
721
- options[:events] = [event]
722
- if frame
723
- frame = When.Calendar(frame)
724
- date = frame.jul_trans(date, options)
725
- else
726
- frame = date.frame
727
- end
728
- year = date.most_significant_coordinate * 1
683
+ # 当該年のイベントの日付
684
+ # date : 西暦の年数 or When::TM::(Temporal)Position
685
+ # event : イベント名 (String)
686
+ # frame : 暦法(デフォルトは When.Resource('_c:Gregorian'))
687
+ #
688
+ # @return [Integer] イベントのユリウス通日(dateが西暦の年数の場合)
689
+ # @return [When::TM::CalDate] イベントのWhen::TM::CalDate(yearがWhen::TM::(Temporal)Positionの場合)
690
+ #
691
+ def _event(date, event, frame=nil)
692
+ case date
693
+ when Numeric
694
+ year = date * 1
695
+ when When::TimeValue
696
+ options = date._attr
697
+ options[:precision] = When::DAY
698
+ options[:events] = [event]
699
+ if frame
700
+ frame = When.Calendar(frame)
701
+ date = frame.jul_trans(date, options)
729
702
  else
730
- raise TypeError, "Irregal date type: #{date.class}"
703
+ frame = date.frame
731
704
  end
732
- frame ||= When.Resource('_c:Gregorian')
733
- result = yield(year, frame)
734
- return result if date.kind_of?(Numeric)
735
- return frame.jul_trans(result, options)
705
+ year = date.most_significant_coordinate * 1
706
+ else
707
+ raise TypeError, "Irregal date type: #{date.class}"
736
708
  end
709
+ frame ||= When.Resource('_c:Gregorian')
710
+ result = yield(year, frame)
711
+ return result if date.kind_of?(Numeric)
712
+ return frame.jul_trans(result, options)
737
713
  end
738
714
  end
739
715
  end