when_exe 0.3.6 → 0.3.7

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 (117) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +171 -0
  3. data/lib/when_exe.rb +78 -47
  4. data/lib/when_exe/basictypes.rb +752 -747
  5. data/lib/when_exe/calendarnote.rb +805 -801
  6. data/lib/when_exe/calendartypes.rb +1583 -1531
  7. data/lib/when_exe/coordinates.rb +16 -15
  8. data/lib/when_exe/core/duration.rb +114 -110
  9. data/lib/when_exe/core/extension.rb +504 -504
  10. data/lib/when_exe/ephemeris.rb +1917 -1913
  11. data/lib/when_exe/ephemeris/moon.rb +333 -333
  12. data/lib/when_exe/ephemeris/notes.rb +389 -387
  13. data/lib/when_exe/ephemeris/planets.rb +585 -585
  14. data/lib/when_exe/ephemeris/sun.rb +214 -214
  15. data/lib/when_exe/googlecalendar.rb +144 -140
  16. data/lib/when_exe/icalendar.rb +1636 -1636
  17. data/lib/when_exe/inspect.rb +46 -22
  18. data/lib/when_exe/locales/akt.rb +176 -176
  19. data/lib/when_exe/locales/encoding_conversion.rb +134 -126
  20. data/lib/when_exe/locales/iast.rb +90 -90
  21. data/lib/when_exe/locales/locale.rb +750 -746
  22. data/lib/when_exe/locales/transliteration_table.rb +62 -62
  23. data/lib/when_exe/mini_application.rb +307 -305
  24. data/lib/when_exe/parts/enumerator.rb +2 -2
  25. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  26. data/lib/when_exe/parts/method_cash.rb +224 -224
  27. data/lib/when_exe/parts/resource.rb +1069 -1071
  28. data/lib/when_exe/parts/timezone.rb +240 -230
  29. data/lib/when_exe/region/armenian.rb +56 -56
  30. data/lib/when_exe/region/babylonian.rb +405 -0
  31. data/lib/when_exe/region/bahai.rb +146 -146
  32. data/lib/when_exe/region/balinese.rb +622 -622
  33. data/lib/when_exe/region/chinese.rb +95 -25
  34. data/lib/when_exe/region/chinese/calendars.rb +1016 -1016
  35. data/lib/when_exe/region/chinese/epochs.rb +1 -1
  36. data/lib/when_exe/region/chinese/twins.rb +803 -795
  37. data/lib/when_exe/region/christian.rb +824 -824
  38. data/lib/when_exe/region/coptic.rb +106 -87
  39. data/lib/when_exe/region/discordian.rb +225 -225
  40. data/lib/when_exe/region/far_east.rb +188 -188
  41. data/lib/when_exe/region/french.rb +56 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +58 -58
  44. data/lib/when_exe/region/indian.rb +1254 -1251
  45. data/lib/when_exe/region/iranian.rb +8 -8
  46. data/lib/when_exe/region/islamic.rb +3 -3
  47. data/lib/when_exe/region/japanese.rb +93 -99
  48. data/lib/when_exe/region/japanese/calendars.rb +396 -397
  49. data/lib/when_exe/region/japanese/epochs.rb +26 -26
  50. data/lib/when_exe/region/japanese/nihon_shoki.rb +71 -71
  51. data/lib/when_exe/region/japanese/notes.rb +1383 -1386
  52. data/lib/when_exe/region/japanese/residues.rb +1306 -1306
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -0
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +126 -126
  57. data/lib/when_exe/region/korean.rb +378 -378
  58. data/lib/when_exe/region/m17n.rb +114 -113
  59. data/lib/when_exe/region/martian.rb +258 -255
  60. data/lib/when_exe/region/mayan.rb +32 -32
  61. data/lib/when_exe/region/residue.rb +89 -89
  62. data/lib/when_exe/region/roman.rb +36 -24
  63. data/lib/when_exe/region/ryukyu.rb +97 -97
  64. data/lib/when_exe/region/shire.rb +240 -240
  65. data/lib/when_exe/region/soviet.rb +209 -0
  66. data/lib/when_exe/region/symmetry.rb +50 -50
  67. data/lib/when_exe/region/thai.rb +336 -335
  68. data/lib/when_exe/region/tibetan.rb +316 -315
  69. data/lib/when_exe/region/vietnamese.rb +440 -439
  70. data/lib/when_exe/region/weekdate.rb +80 -80
  71. data/lib/when_exe/region/world.rb +175 -175
  72. data/lib/when_exe/region/yerm.rb +14 -14
  73. data/lib/when_exe/region/zoroastrian.rb +203 -203
  74. data/lib/when_exe/timestandard.rb +707 -681
  75. data/lib/when_exe/tmduration.rb +338 -330
  76. data/lib/when_exe/tmobjects.rb +1346 -1325
  77. data/lib/when_exe/tmposition.rb +2115 -2072
  78. data/lib/when_exe/tmreference.rb +1693 -1669
  79. data/lib/when_exe/version.rb +1 -1
  80. data/link_to_online_documents +1 -1
  81. data/test/examples/JapanHolidaysRFC6350.ics +1 -1
  82. data/test/test.rb +67 -61
  83. data/test/test/basictypes.rb +409 -409
  84. data/test/test/calendarnote.rb +86 -69
  85. data/test/test/calendartypes.rb +97 -97
  86. data/test/test/coordinates.rb +396 -396
  87. data/test/test/ephemeris.rb +83 -74
  88. data/test/test/ephemeris/moon.rb +14 -14
  89. data/test/test/ephemeris/planets.rb +14 -14
  90. data/test/test/ephemeris/sun.rb +14 -14
  91. data/test/test/googlecalendar.rb +194 -176
  92. data/test/test/icalendar.rb +867 -858
  93. data/test/test/inspect.rb +117 -117
  94. data/test/test/parts.rb +487 -487
  95. data/test/test/region/balinese.rb +34 -0
  96. data/test/test/region/chinese.rb +218 -206
  97. data/test/test/region/christian.rb +245 -245
  98. data/test/test/region/coptic.rb +27 -27
  99. data/test/test/region/french.rb +33 -33
  100. data/test/test/region/geologicalage.rb +17 -17
  101. data/test/test/region/indian.rb +57 -57
  102. data/test/test/region/iran.rb +54 -54
  103. data/test/test/region/islamic.rb +18 -18
  104. data/test/test/region/japanese.rb +237 -219
  105. data/test/test/region/jewish.rb +61 -61
  106. data/test/test/region/m17n.rb +184 -184
  107. data/test/test/region/mayan.rb +195 -195
  108. data/test/test/region/residue.rb +147 -139
  109. data/test/test/region/thai.rb +116 -116
  110. data/test/test/region/tibetan.rb +30 -30
  111. data/test/test/region/vietnamese.rb +102 -102
  112. data/test/test/region/yerm.rb +146 -146
  113. data/test/test/timestandard.rb +81 -81
  114. data/test/test/tmobjects.rb +328 -328
  115. data/test/test/tmposition.rb +397 -284
  116. data/test/test/tmreference.rb +157 -157
  117. metadata +13 -10
@@ -1,87 +1,106 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2011-2014 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
- Coptic = [self, [
13
- "locale:[=en:, ja=ja:, alias]",
14
- "names:[Coptic=]",
15
- "[Coptic=en:Coptic_calendar, コプト暦 ]",
16
- "[Ethiopian=en:Ethiopian_calendar, エチオピア暦=en:Ethiopian_calendar]",
17
-
18
- [self,
19
- "names:[EgyptianMonth=, 月=ja:%%<月_(暦)>]",
20
- "[tut=, トート= ]",
21
- "[baba=, バーバ= ]",
22
- "[hatur=, ハートール= ]",
23
- "[kiyahak=, キヤハーク= ]",
24
- "[tuba=, トーバ= ]",
25
- "[amshir=, アムシール= ]",
26
- "[baramhat=, バラムハート=]",
27
- "[barmuda=, バルムーダ= ]",
28
- "[bashans=, バシャンス= ]",
29
- "[ba'una=, バウーナ= ]",
30
- "[abib=, アビーブ= ]",
31
- "[misra=, ミスラー= ]",
32
- "[epagomen=, エパゴメネ= ]"
33
- ],
34
-
35
- [self,
36
- "names:[EthiopianMonth=, 月=ja:%%<月_(暦)>]",
37
- "[Mäskäräm=, マスカラム= ]",
38
- "[Ṭəqəmt=, テケルト= ]",
39
- "[Ḫədar=, ヘダル= ]",
40
- "[Taḫśaś=, ターサス= ]",
41
- "[Ṭərr=, テル= ]",
42
- "[Yäkatit=, イェカティト=]",
43
- "[Mägabit=, メガビト= ]",
44
- "[Miyazya=, ミアジア= ]",
45
- "[Gənbot=, ゲエンポト= ]",
46
- "[Säne=, セネ= ]",
47
- "[Ḥamle=, ハムレ= ]",
48
- "[Nähase=, ネハッセ= ]",
49
- "[Ṗagʷəmen=, パゴウメン= ]"
50
- ]
51
- ]]
52
- end
53
-
54
- module CalendarTypes
55
-
56
- _egyptian_month_indices = [
57
- When.Index('Coptic::EgyptianMonth', {:unit =>13}),
58
- When::Coordinates::DefaultDayIndex
59
- ]
60
-
61
- _ethiopian_month_indices = [
62
- When.Index('Coptic::EthiopianMonth', {:unit =>13}),
63
- When::Coordinates::DefaultDayIndex
64
- ]
65
-
66
- #
67
- # Coptic Calendar in Egypt and Ethiopia
68
- #
69
- Coptic = [{'Epoch'=>{'284Y'=>{'origin_of_MSC' => 1,
70
- 'label' => 'Coptic::Coptic',
71
- 'indices' => _egyptian_month_indices},
72
- '8Y'=>{'origin_of_MSC' => 277,
73
- 'label' => 'Coptic::Ethiopian',
74
- 'indices' => _ethiopian_month_indices}}}, CyclicTableBased, {
75
- 'label' => 'Coptic::Coptic',
76
- 'origin_of_LSC' => 1825030,
77
- 'origin_of_MSC' => 1,
78
- 'epoch_in_CE' => 285,
79
- 'indices' => _egyptian_month_indices,
80
- 'rule_table' => {
81
- 'T' => {'Rule' =>[365,365,366,365]},
82
- 365 => {'Length'=>[30]*12+[5]},
83
- 366 => {'Length'=>[30]*12+[6]}
84
- }
85
- }]
86
- end
87
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2014 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
+ Coptic = [self, [
13
+ "locale:[=en:, ja=ja:, alias]",
14
+ "names:[Coptic=]",
15
+ "[Coptic=en:Coptic_calendar, コプト暦 ]",
16
+ "[Ethiopian=en:Ethiopian_calendar, エチオピア暦=en:Ethiopian_calendar]",
17
+ "[Ptolemaic=en:Ptolemaic_dynasty, プトレマイオス朝]",
18
+
19
+ # Remarks
20
+ '[based on Chris Bennett "Egyptian Dates" (Retrieved 2014-06-29)=http://www.tyndalehouse.com/Egypt/ptolemies/chron/egyptian/chron_eg_intro.htm,' +
21
+ '典拠 - Chris Bennett "Egyptian Dates" (2014-06-29 閲覧)=]',
22
+
23
+ [self,
24
+ "names:[EgyptianMonth=, 月=ja:%%<月_(暦)>]",
25
+ "[tut=, トート= ]",
26
+ "[baba=, バーバ= ]",
27
+ "[hatur=, ハートール= ]",
28
+ "[kiyahak=, キヤハーク= ]",
29
+ "[tuba=, トーバ= ]",
30
+ "[amshir=, アムシール= ]",
31
+ "[baramhat=, バラムハート=]",
32
+ "[barmuda=, バルムーダ= ]",
33
+ "[bashans=, バシャンス= ]",
34
+ "[ba'una=, バウーナ= ]",
35
+ "[abib=, アビーブ= ]",
36
+ "[misra=, ミスラー= ]",
37
+ "[epagomen=, エパゴメネ= ]"
38
+ ],
39
+
40
+ [self,
41
+ "names:[EthiopianMonth=, 月=ja:%%<月_(暦)>]",
42
+ "[Mäskäräm=, マスカラム= ]",
43
+ "[Ṭəqəmt=, テケルト= ]",
44
+ "[Ḫədar=, ヘダル= ]",
45
+ "[Taḫśaś=, ターサス= ]",
46
+ "[Ṭərr=, テル= ]",
47
+ "[Yäkatit=, イェカティト=]",
48
+ "[Mägabit=, メガビト= ]",
49
+ "[Miyazya=, ミアジア= ]",
50
+ "[Gənbot=, ゲエンポト= ]",
51
+ "[Säne=, セネ= ]",
52
+ "[Ḥamle=, ハムレ= ]",
53
+ "[Nähase=, ネハッセ= ]",
54
+ "[Ṗagʷəmen=, パゴウメン= ]"
55
+ ]
56
+ ]]
57
+ end
58
+
59
+ module CalendarTypes
60
+
61
+ _egyptian_month_indices = [
62
+ When.Index('Coptic::EgyptianMonth', {:unit =>13}),
63
+ When::Coordinates::DefaultDayIndex
64
+ ]
65
+
66
+ _ethiopian_month_indices = [
67
+ When.Index('Coptic::EthiopianMonth', {:unit =>13}),
68
+ When::Coordinates::DefaultDayIndex
69
+ ]
70
+
71
+ #
72
+ # Coptic Calendar in Egypt and Ethiopia
73
+ #
74
+ Coptic = [{'Epoch'=>{'284Y'=>{'origin_of_MSC' => 1},
75
+ '0Y'=>{'origin_of_MSC' => 285},
76
+ '8Y'=>{'origin_of_MSC' => 277,
77
+ 'label' => 'Coptic::Ethiopian',
78
+ 'indices' => _ethiopian_month_indices}}}, CyclicTableBased, {
79
+ 'label' => 'Coptic::Coptic',
80
+ 'origin_of_LSC' => 1825030,
81
+ 'origin_of_MSC' => 1,
82
+ 'epoch_in_CE' => 285,
83
+ 'indices' => _egyptian_month_indices,
84
+ 'rule_table' => {
85
+ 'T' => {'Rule' =>[365,365,366,365]},
86
+ 365 => {'Length'=>[30]*12+[5]},
87
+ 366 => {'Length'=>[30]*12+[6]}
88
+ }
89
+ }]
90
+
91
+ #
92
+ # Egyptian Calendar based on Chris Bennett, http://www.tyndalehouse.com/Egypt/ptolemies/chron/babylonian/chron_bab_intro_fr.htm
93
+ #
94
+ Ptolemaic = [CyclicTableBased, {
95
+ 'label' => 'Coptic::Ptolemaic',
96
+ 'remarks' => When.M17n('Coptic::based on Chris Bennett "Egyptian Dates" (Retrieved 2014-06-29)'),
97
+ 'origin_of_LSC' => 1600478,
98
+ 'origin_of_MSC' => -330,
99
+ 'indices' => _egyptian_month_indices,
100
+ 'rule_table' => {
101
+ 'T' => {'Rule' =>[365]},
102
+ 365 => {'Length'=>[30]*12+[5]}
103
+ }
104
+ }]
105
+ end
106
+ end
@@ -1,225 +1,225 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2014 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
- Discordian = [self, [
13
- "locale:[=en:, ja]",
14
- "names:[Discordian=en:Discordian_calendar, ディスコーディアン暦=]",
15
- [self,
16
- "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
17
- "[%0sSt. Tib's Day=, %0s閏日=]"
18
- ]
19
- ]]
20
- end
21
-
22
- #
23
- # Discordian Note
24
- #
25
- class CalendarNote::DiscordianWeek < CalendarNote::Week
26
-
27
- Notes = [When::BasicTypes::M17n, [
28
- "namespace:[en=http://en.wiktionary.org/wiki/]",
29
- "locale:[=en:]",
30
- "names:[Discordian]",
31
-
32
- # Notes for year ----------------------------
33
- [When::BasicTypes::M17n,
34
- "names:[year]"
35
- ],
36
-
37
- # Notes for month ----------------------------
38
- [When::BasicTypes::M17n,
39
- "names:[month]",
40
- [When::BasicTypes::M17n,
41
- "names:[Month]",
42
- "[Chaos=en:chaos ]",
43
- "[Discord=en:discord ]",
44
- "[Confusion=en:confusion ]",
45
- "[Bureaucracy ]",
46
- "[The Aftermath=en:aftermath]"
47
- ]
48
- ],
49
-
50
- # Notes for day ----------------------------
51
- [When::BasicTypes::M17n,
52
- "names:[day]",
53
- [When::BasicTypes::M17n,
54
- "names:[Week]",
55
- [DayOfWeek, "label:[Sweetmorn= ]", {'delta'=>5}],
56
- [DayOfWeek, "label:[Boomtime= ]", {'delta'=>5}],
57
- [DayOfWeek, "label:[Pungenday= ]", {'delta'=>5}],
58
- [DayOfWeek, "label:[Prickle-Prickle=]", {'delta'=>5}],
59
- [DayOfWeek, "label:[Setting Orange= ]", {'delta'=>5}],
60
- [DayOfWeek, "label:[Out of Week= ]", {'delta'=>1461}]
61
- ],
62
-
63
- [When::BasicTypes::M17n,
64
- "names:[Holyday=]",
65
- "[St. Tib's Day=]", # 02-29 St. Tib's Day
66
- "[Mungday= ]", # 01-05 Chaos 5
67
- "[Chaoflux= ]", # 02-19 Chaos 50
68
- "[Mojoday= ]", # 03-19 Discord 5
69
- "[Discoflux= ]", # 05-03 Discord 50
70
- "[Syaday= ]", # 05-31 Confusion 5
71
- "[Confuflux= ]", # 07-15 Confusion 50
72
- "[Zaraday= ]", # 08-12 Bureaucracy 5
73
- "[Bureflux= ]", # 09-26 Bureaucracy 50
74
- "[Maladay= ]", # 10-24 The Aftermath 5
75
- "[Afflux= ]" # 12-08 The Aftermath 50
76
- ],
77
-
78
- "[Standard_Week]"
79
- ]
80
- ]]
81
-
82
- # @private
83
- IndexOfWeek = [0, 1, 2, 3, 5, 4]
84
-
85
- # Just or last sweetmorn
86
- #
87
- # @param [When::TM::TemporalPosition] date
88
- # @param [nil] parameter (not used)
89
- #
90
- # @return [When::TM::TemporalPosition]
91
- #
92
- def sweetmorn(date, parameter=nil)
93
- date = _to_date_for_note(date)
94
- y,m,d = date.cal_date
95
- date -= When::P1D if date.length(When::MONTH) == 74 && +d == 60
96
- dow = ((m-1)*73+d*1-1) % 5
97
- date -= When::P1D * dow unless dow == 0
98
- date.events = [@days_of_week[0]]
99
- date
100
- end
101
-
102
- # Erisian week
103
- #
104
- # @param [When::TM::CalDate] date
105
- # @param [When::TM::CalDate] base
106
- #
107
- # @return [String]
108
- #
109
- def week(date, base=nil)
110
- date = _to_date_for_note(date)
111
- y,m,d = date.cal_date
112
- dow = d*0 == 0 ? ((m-1)*73+d*1-1) % 5 : 5
113
- length = (base || date).length(When::MONTH) == 73 ? 5 : 6
114
- index = length == 5 ? dow : IndexOfWeek[dow]
115
- {:value=>@days_of_week[dow], :position=>[index,length]}
116
- end
117
-
118
- #
119
- # Week labels
120
- #
121
- # @param [When::TM::TemporalPosition] date
122
- #
123
- # @return [Array<When::CalendarNote::Week::DayOfWeek>]
124
- #
125
- def week_labels(date)
126
- date = _to_date_for_note(date)
127
- date.length(When::MONTH) == 73 ?
128
- @days_of_week.child[0...5] :
129
- @days_of_week.child[0...4] + [@days_of_week.child[5]] + [@days_of_week.child[4]]
130
- end
131
-
132
- # Holyday
133
- #
134
- # @param [When::TM::CalDate] date
135
- #
136
- # @return [String]
137
- #
138
- def holyday(date)
139
- date = _to_date_for_note(date)
140
- y, m, d = date.cal_date
141
- index =
142
- case +d
143
- when 5 ; 1
144
- when 50 ; 2
145
- else ; d * 0 - 1
146
- end
147
- return nil if index == -1
148
- When.CalendarNote('DiscordianWeek/Notes::day::Holyday::*')[(m-1)*2+index]
149
- end
150
-
151
- #
152
- # convert date to Discordian date
153
- #
154
- # @private
155
- def _to_date_for_note(date)
156
- date = When::Discordian ^ date unless date.frame.label.to_s == 'Discordian'
157
- date
158
- end
159
-
160
- private
161
-
162
- # object normalization
163
- #
164
- # @private
165
- def _normalize(args=[], options={})
166
- @event ||= 'sweetmorn'
167
- super
168
- end
169
- end
170
-
171
- module CalendarTypes
172
-
173
- #
174
- # Discordian Calendar
175
- #
176
- class Discordian < TableBased
177
-
178
- # @private
179
- Normal_IDS = (1..73).to_a
180
-
181
- # @private
182
- Long_IDS = (1..59).to_a + [When.Pair(59,1)] + (60..73).to_a
183
-
184
- private
185
-
186
- #
187
- # Object Normalization
188
- #
189
- def _normalize(args=[], options={})
190
- @label ||= 'Discordian'
191
- @epoch_in_CE ||= -1166
192
- @note ||= 'DiscordianWeek'
193
- @engine ||= 'Gregorian'
194
- @engine = When.Calendar(@engine)
195
- @indices ||= [
196
- When.Index('DiscordianWeekNotes::month::Month', {:unit =>5}),
197
- When.Index({:branch=>{1=>When.M17n('Discordian::IntercalaryDay')[0]}})
198
- ]
199
- @rule_table ||= {
200
- 365 => {'Length'=> [73]*5},
201
- 366 => {'Length'=> [74] + [73]*4}
202
- }
203
- super
204
- end
205
-
206
- # first day of year
207
- #
208
- def _sdn_(date)
209
- year = +date[0] + @epoch_in_CE
210
- @engine._coordinates_to_number(year, 0, 0)
211
- end
212
-
213
- #
214
- # day arrangement pattern
215
- #
216
- def _ids_(date)
217
- y, m = date
218
- return super unless m
219
- return Normal_IDS unless m == 0
220
- year = +y + @epoch_in_CE
221
- @engine._length([year,1]) == 28 ? Normal_IDS : Long_IDS
222
- end
223
- end
224
- end
225
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014 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
+ Discordian = [self, [
13
+ "locale:[=en:, ja]",
14
+ "names:[Discordian=en:Discordian_calendar, ディスコーディアン暦=]",
15
+ [self,
16
+ "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%%<閏>]",
17
+ "[%0sSt. Tib's Day=, %0s閏日=]"
18
+ ]
19
+ ]]
20
+ end
21
+
22
+ #
23
+ # Discordian Note
24
+ #
25
+ class CalendarNote::DiscordianWeek < CalendarNote::Week
26
+
27
+ Notes = [When::BasicTypes::M17n, [
28
+ "namespace:[en=http://en.wiktionary.org/wiki/]",
29
+ "locale:[=en:]",
30
+ "names:[Discordian]",
31
+
32
+ # Notes for year ----------------------------
33
+ [When::BasicTypes::M17n,
34
+ "names:[year]"
35
+ ],
36
+
37
+ # Notes for month ----------------------------
38
+ [When::BasicTypes::M17n,
39
+ "names:[month]",
40
+ [When::BasicTypes::M17n,
41
+ "names:[Month]",
42
+ "[Chaos=en:chaos ]",
43
+ "[Discord=en:discord ]",
44
+ "[Confusion=en:confusion ]",
45
+ "[Bureaucracy ]",
46
+ "[The Aftermath=en:aftermath]"
47
+ ]
48
+ ],
49
+
50
+ # Notes for day ----------------------------
51
+ [When::BasicTypes::M17n,
52
+ "names:[day]",
53
+ [When::BasicTypes::M17n,
54
+ "names:[Week]",
55
+ [DayOfWeek, "label:[Sweetmorn= ]", {'delta'=>5}],
56
+ [DayOfWeek, "label:[Boomtime= ]", {'delta'=>5}],
57
+ [DayOfWeek, "label:[Pungenday= ]", {'delta'=>5}],
58
+ [DayOfWeek, "label:[Prickle-Prickle=]", {'delta'=>5}],
59
+ [DayOfWeek, "label:[Setting Orange= ]", {'delta'=>5}],
60
+ [DayOfWeek, "label:[Out of Week= ]", {'delta'=>1461}]
61
+ ],
62
+
63
+ [When::BasicTypes::M17n,
64
+ "names:[Holyday=]",
65
+ "[St. Tib's Day=]", # 02-29 St. Tib's Day
66
+ "[Mungday= ]", # 01-05 Chaos 5
67
+ "[Chaoflux= ]", # 02-19 Chaos 50
68
+ "[Mojoday= ]", # 03-19 Discord 5
69
+ "[Discoflux= ]", # 05-03 Discord 50
70
+ "[Syaday= ]", # 05-31 Confusion 5
71
+ "[Confuflux= ]", # 07-15 Confusion 50
72
+ "[Zaraday= ]", # 08-12 Bureaucracy 5
73
+ "[Bureflux= ]", # 09-26 Bureaucracy 50
74
+ "[Maladay= ]", # 10-24 The Aftermath 5
75
+ "[Afflux= ]" # 12-08 The Aftermath 50
76
+ ],
77
+
78
+ "[Common_Week]"
79
+ ]
80
+ ]]
81
+
82
+ # @private
83
+ IndexOfWeek = [0, 1, 2, 3, 5, 4]
84
+
85
+ # Just or last sweetmorn
86
+ #
87
+ # @param [When::TM::TemporalPosition] date
88
+ # @param [nil] parameter (not used)
89
+ #
90
+ # @return [When::TM::TemporalPosition]
91
+ #
92
+ def sweetmorn(date, parameter=nil)
93
+ date = _to_date_for_note(date)
94
+ y,m,d = date.cal_date
95
+ date -= When::P1D if date.length(When::MONTH) == 74 && +d == 60
96
+ dow = ((m-1)*73+d*1-1) % 5
97
+ date -= When::P1D * dow unless dow == 0
98
+ date.events = [@days_of_week[0]]
99
+ date
100
+ end
101
+
102
+ # Erisian week
103
+ #
104
+ # @param [When::TM::CalDate] date
105
+ # @param [When::TM::CalDate] base
106
+ #
107
+ # @return [String]
108
+ #
109
+ def week(date, base=nil)
110
+ date = _to_date_for_note(date)
111
+ y,m,d = date.cal_date
112
+ dow = d*0 == 0 ? ((m-1)*73+d*1-1) % 5 : 5
113
+ length = (base || date).length(When::MONTH) == 73 ? 5 : 6
114
+ index = length == 5 ? dow : IndexOfWeek[dow]
115
+ {:value=>@days_of_week[dow], :position=>[index,length]}
116
+ end
117
+
118
+ #
119
+ # Week labels
120
+ #
121
+ # @param [When::TM::TemporalPosition] date
122
+ #
123
+ # @return [Array<When::CalendarNote::Week::DayOfWeek>]
124
+ #
125
+ def week_labels(date)
126
+ date = _to_date_for_note(date)
127
+ date.length(When::MONTH) == 73 ?
128
+ @days_of_week.child[0...5] :
129
+ @days_of_week.child[0...4] + [@days_of_week.child[5]] + [@days_of_week.child[4]]
130
+ end
131
+
132
+ # Holyday
133
+ #
134
+ # @param [When::TM::CalDate] date
135
+ #
136
+ # @return [String]
137
+ #
138
+ def holyday(date)
139
+ date = _to_date_for_note(date)
140
+ y, m, d = date.cal_date
141
+ index =
142
+ case +d
143
+ when 5 ; 1
144
+ when 50 ; 2
145
+ else ; d * 0 - 1
146
+ end
147
+ return nil if index == -1
148
+ When.CalendarNote('DiscordianWeek/Notes::day::Holyday::*')[(m-1)*2+index]
149
+ end
150
+
151
+ #
152
+ # convert date to Discordian date
153
+ #
154
+ # @private
155
+ def _to_date_for_note(date)
156
+ date = When::Discordian ^ date unless date.frame.label.to_s == 'Discordian'
157
+ date
158
+ end
159
+
160
+ private
161
+
162
+ # object normalization
163
+ #
164
+ # @private
165
+ def _normalize(args=[], options={})
166
+ @event ||= 'sweetmorn'
167
+ super
168
+ end
169
+ end
170
+
171
+ module CalendarTypes
172
+
173
+ #
174
+ # Discordian Calendar
175
+ #
176
+ class Discordian < TableBased
177
+
178
+ # @private
179
+ Normal_IDS = (1..73).to_a
180
+
181
+ # @private
182
+ Long_IDS = (1..59).to_a + [When.Pair(59,1)] + (60..73).to_a
183
+
184
+ private
185
+
186
+ #
187
+ # Object Normalization
188
+ #
189
+ def _normalize(args=[], options={})
190
+ @label ||= 'Discordian'
191
+ @epoch_in_CE ||= -1166
192
+ @note ||= 'DiscordianWeek'
193
+ @engine ||= 'Gregorian'
194
+ @engine = When.Calendar(@engine)
195
+ @indices ||= [
196
+ When.Index('DiscordianWeekNotes::month::Month', {:unit =>5}),
197
+ When.Index({:branch=>{1=>When.M17n('Discordian::IntercalaryDay')[0]}})
198
+ ]
199
+ @rule_table ||= {
200
+ 365 => {'Length'=> [73]*5},
201
+ 366 => {'Length'=> [74] + [73]*4}
202
+ }
203
+ super
204
+ end
205
+
206
+ # first day of year
207
+ #
208
+ def _sdn_(date)
209
+ year = +date[0] + @epoch_in_CE
210
+ @engine._coordinates_to_number(year, 0, 0)
211
+ end
212
+
213
+ #
214
+ # day arrangement pattern
215
+ #
216
+ def _ids_(date)
217
+ y, m = date
218
+ return super unless m
219
+ return Normal_IDS unless m == 0
220
+ year = +y + @epoch_in_CE
221
+ @engine._length([year,1]) == 28 ? Normal_IDS : Long_IDS
222
+ end
223
+ end
224
+ end
225
+ end