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