when_exe 0.3.6 → 0.3.7

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