when_exe 0.4.1 → 0.4.2

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 (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -33
  3. data/bin/locales.rb +1 -1
  4. data/bin/make_ttl.rb.config +1 -1
  5. data/lib/when_exe.rb +27 -16
  6. data/lib/when_exe/basictypes.rb +772 -771
  7. data/lib/when_exe/calendartypes.rb +1485 -1453
  8. data/lib/when_exe/coordinates.rb +5 -0
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +147 -116
  11. data/lib/when_exe/core/extension.rb +499 -497
  12. data/lib/when_exe/ephemeris.rb +1952 -1951
  13. data/lib/when_exe/ephemeris/eclipse.rb +5 -4
  14. data/lib/when_exe/ephemeris/notes.rb +457 -421
  15. data/lib/when_exe/ephemeris/planets.rb +585 -585
  16. data/lib/when_exe/ephemeris/sun.rb +214 -214
  17. data/lib/when_exe/google_api.rb +153 -0
  18. data/lib/when_exe/icalendar.rb +1640 -1632
  19. data/lib/when_exe/inspect.rb +42 -20
  20. data/lib/when_exe/linkeddata.rb +28 -7
  21. data/lib/when_exe/locales/autoload.rb +2 -1
  22. data/lib/when_exe/locales/locale.rb +35 -15
  23. data/lib/when_exe/locales/zh.rb +77 -0
  24. data/lib/when_exe/mini_application.rb +3 -1
  25. data/lib/when_exe/{googlecalendar.rb → obsolete/googlecalendar.rb} +144 -144
  26. data/lib/when_exe/parts/enumerator.rb +498 -486
  27. data/lib/when_exe/parts/geometric_complex.rb +397 -397
  28. data/lib/when_exe/parts/timezone.rb +246 -241
  29. data/lib/when_exe/region/armenian.rb +55 -56
  30. data/lib/when_exe/region/babylonian.rb +406 -405
  31. data/lib/when_exe/region/bahai.rb +107 -106
  32. data/lib/when_exe/region/balinese.rb +624 -622
  33. data/lib/when_exe/region/chinese.rb +1071 -1026
  34. data/lib/when_exe/region/chinese/epochs.rb +28 -28
  35. data/lib/when_exe/region/chinese/notes.rb +219 -0
  36. data/lib/when_exe/region/chinese/twins.rb +803 -803
  37. data/lib/when_exe/region/christian.rb +21 -15
  38. data/lib/when_exe/region/coptic.rb +107 -106
  39. data/lib/when_exe/region/discordian.rb +218 -218
  40. data/lib/when_exe/region/east_asian.rb +1 -1
  41. data/lib/when_exe/region/french.rb +126 -56
  42. data/lib/when_exe/region/geologicalage.rb +639 -639
  43. data/lib/when_exe/region/goddess.rb +60 -58
  44. data/lib/when_exe/region/hanke_henry.rb +2 -2
  45. data/lib/when_exe/region/indian.rb +1225 -1222
  46. data/lib/when_exe/region/international_fixed.rb +96 -97
  47. data/lib/when_exe/region/iranian.rb +206 -203
  48. data/lib/when_exe/region/islamic.rb +102 -102
  49. data/lib/when_exe/region/japanese.rb +126 -71
  50. data/lib/when_exe/region/japanese/epochs.rb +426 -426
  51. data/lib/when_exe/region/japanese/notes.rb +101 -81
  52. data/lib/when_exe/region/japanese/residues.rb +1345 -1311
  53. data/lib/when_exe/region/japanese/twins.rb +225 -225
  54. data/lib/when_exe/region/japanese/weeks.rb +112 -112
  55. data/lib/when_exe/region/javanese.rb +230 -230
  56. data/lib/when_exe/region/jewish.rb +130 -131
  57. data/lib/when_exe/region/m17n.rb +114 -114
  58. data/lib/when_exe/region/martian.rb +258 -258
  59. data/lib/when_exe/region/mayan.rb +11 -8
  60. data/lib/when_exe/region/pax.rb +4 -5
  61. data/lib/when_exe/region/pope.rb +1 -1
  62. data/lib/when_exe/region/positivist.rb +100 -100
  63. data/lib/when_exe/region/residue.rb +162 -162
  64. data/lib/when_exe/region/roman.rb +333 -333
  65. data/lib/when_exe/region/{soviet.rb → russian.rb} +221 -209
  66. data/lib/when_exe/region/shire.rb +222 -223
  67. data/lib/when_exe/region/symmetry.rb +50 -50
  68. data/lib/when_exe/region/thai.rb +336 -336
  69. data/lib/when_exe/region/tibetan.rb +315 -316
  70. data/lib/when_exe/region/tranquility.rb +207 -208
  71. data/lib/when_exe/region/vanishing_leprechaun.rb +3 -1
  72. data/lib/when_exe/region/vietnamese.rb +449 -440
  73. data/lib/when_exe/region/weekdate.rb +80 -80
  74. data/lib/when_exe/region/world.rb +170 -171
  75. data/lib/when_exe/region/world_season.rb +89 -89
  76. data/lib/when_exe/region/yerm.rb +3 -3
  77. data/lib/when_exe/region/zoroastrian.rb +205 -205
  78. data/lib/when_exe/timestandard.rb +708 -707
  79. data/lib/when_exe/tmduration.rb +338 -338
  80. data/lib/when_exe/tmobjects.rb +1356 -1356
  81. data/lib/when_exe/tmposition.rb +66 -31
  82. data/lib/when_exe/version.rb +16 -2
  83. data/test/examples/Residue.m17n +83 -83
  84. data/test/examples/Terms.m17n +2 -2
  85. data/test/test.rb +2 -2
  86. data/test/test/google_api.rb +65 -0
  87. data/test/test/linkeddata.rb +1 -1
  88. data/test/test/{googlecalendar.rb → obsolete/googlecalendar.rb} +194 -194
  89. data/test/test/region/indian.rb +90 -85
  90. data/test/test/region/m17n.rb +7 -7
  91. data/test/test/region/mayan.rb +195 -195
  92. data/test/test/region/residue.rb +153 -153
  93. data/test/test/tmposition.rb +11 -1
  94. data/when_exe.gemspec +2 -2
  95. metadata +95 -8
  96. data/test/test.rb.config +0 -1
@@ -1,209 +1,221 @@
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
- class When::CalendarNote
9
-
10
- #
11
- # 標準の暦注 五曜
12
- #
13
- CommonWithSovietFiveDay = [['_m:Calendar::Month'], ['Common::Week', '_n:SovietFiveDayWeek/Notes::day::FiveDay']]
14
-
15
- #
16
- # 標準の暦注 + 六曜
17
- #
18
- CommonWithSovietSixDay = [['_m:Calendar::Month'], ['Common::Week', '_n:SovietSixDayWeek/Notes::day::SixDay']]
19
-
20
- #
21
- # 五曜
22
- #
23
- class SovietFiveDayWeek < Week
24
-
25
- Holidays = {
26
- [1,22] => 5, [2,29] => 6, [5,1] => 5, [5,2] => 5, [11,7] => 5, [11,8] => 5
27
- }
28
-
29
- FirstDay = [0, 0, 3, 4, 4, 3, 3, 4, 0, 0, 1, 4]
30
-
31
- SkipDay = {
32
- 1 => [23,1], 5 => [3,2], 11 => [9,2]
33
- }
34
-
35
-
36
- #
37
- # 暦注要素の定義
38
- #
39
- Notes = [When::BasicTypes::M17n, [
40
- "locale:[=en:, ja=ja:, alias]",
41
- "names:[SovietFiveDay]",
42
-
43
- # 日の暦注 ----------------------------
44
- [When::BasicTypes::M17n,
45
- "names:[day]",
46
- [When::BasicTypes::M17n,
47
- "names:[FiveDay, 五曜]",
48
- [DayOfWeek, "label:[I= ]", {'delta'=>5}],
49
- [DayOfWeek, "label:[II= ]", {'delta'=>5}],
50
- [DayOfWeek, "label:[III= ]", {'delta'=>5}],
51
- [DayOfWeek, "label:[IV= ]", {'delta'=>5}],
52
- [DayOfWeek, "label:[V= ]", {'delta'=>5}],
53
- [DayOfWeek, "label:[Holiday=]", {'delta'=>190}],
54
- [DayOfWeek, "label:[Leapday=]", {'delta'=>1461}]
55
- ]
56
- ]
57
- ]]
58
-
59
- #
60
- # この日は何曜?
61
- #
62
- # @param [When::TM::TemporalPosition] date
63
- # @param [When::TM::CalDate] base (not used)
64
- #
65
- # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
66
- #
67
- def fiveday(date, base=nil)
68
- date = _to_date_for_note(date)
69
- y,m,d = date.cal_date
70
- index = fiveday_index(m,d)
71
- {:value=>@days_of_week[index], :position=>[index, 7]}
72
- end
73
- alias :week :fiveday
74
-
75
- # @private
76
- def first(date, base=nil)
77
- count = 0
78
- d0 = d1 = _to_date_for_note(date)
79
- r0 = r1 = nil
80
- loop do
81
- y,m,d = d1.cal_date
82
- r1 = fiveday_index(m,d)
83
- break if r1 == 0
84
- d0 = d1
85
- r0 = r1
86
- d1 = d0 - When::P1D
87
- count += 1
88
- end
89
- date -= count if count > 0
90
- date.events = [@days_of_week[r1]]
91
- date
92
- end
93
-
94
- # @private
95
- def fiveday_index(m,d)
96
- index = Holidays[[m,d]]
97
- return index if index
98
- day, shift = SkipDay[m]
99
- d -= shift if day && d >= day
100
- (FirstDay[m-1] + d - 1) % 5
101
- end
102
-
103
- # @private
104
- def first_delta(parameter=nil)
105
- When::P5D
106
- end
107
-
108
- #
109
- # 暦日をグレゴリオ暦日に変換
110
- #
111
- # @private
112
- def _to_date_for_note(date)
113
- return date if date.frame.kind_of?(When::CalendarTypes::Gregorian)
114
- return When::Gregorian ^ date
115
- end
116
-
117
- private
118
-
119
- # オブジェクトの正規化
120
- # @private
121
- def _normalize(args=[], options={})
122
- @days_of_week ||= When.CalendarNote("SovietFiveDayWeek/Notes::day::FiveDay")
123
- @event ||= 'first'
124
- super
125
- end
126
- end
127
-
128
- #
129
- # 六曜
130
- #
131
- class SovietSixDayWeek < Week
132
-
133
- # @private
134
- # 1 2 3 4 5 6 7 8 9 X N D
135
- WeekLength = [7,6,7,6,7,6,7,7,6,7,6,7]
136
-
137
- #
138
- # 暦注要素の定義
139
- #
140
- Notes = [When::BasicTypes::M17n, [
141
- "locale:[=en:, ja=ja:, alias]",
142
- "names:[SovietSixDay]",
143
-
144
- # 日の暦注 ----------------------------
145
- [When::BasicTypes::M17n,
146
- "names:[day]",
147
- [When::BasicTypes::M17n,
148
- "names:[SixDay, 六曜]",
149
- [DayOfWeek, "label:[Первый= ]", {'delta'=>6}],
150
- [DayOfWeek, "label:[Второй= ]", {'delta'=>6}],
151
- [DayOfWeek, "label:[Третий= ]", {'delta'=>6}],
152
- [DayOfWeek, "label:[Четвертый=]", {'delta'=>6}],
153
- [DayOfWeek, "label:[Пятый= ]", {'delta'=>6}],
154
- [DayOfWeek, "label:[Шестой= ]", {'delta'=>6}],
155
- [DayOfWeek, "label:[Out of week= ]", {'delta'=>6}]
156
- ]
157
- ]
158
- ]]
159
-
160
- #
161
- # この日は何曜?
162
- #
163
- # @param [When::TM::TemporalPosition] date
164
- # @param [When::TM::CalDate] base (not used)
165
- #
166
- # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
167
- #
168
- def sixday(date, base=nil)
169
- date = _to_date_for_note(date)
170
- dow = date.cal_date[When::DAY-1]
171
- index = dow == 31 ? 6 : (dow - 1) % 6
172
- {:value=>@days_of_week[index], :position=>[index, WeekLength[(base||date).cal_date[When::MONTH-1]-1]]}
173
- end
174
- alias :week :sixday
175
-
176
- # @private
177
- def first(date, base=nil)
178
- dow = _to_date_for_note(date).cal_date[When::DAY-1]
179
- index = dow == 31 ? 6 : (dow - 1) % 6
180
- date -= index if index > 0
181
- date.events = [@days_of_week[index]]
182
- date
183
- end
184
-
185
- # @private
186
- def first_delta(parameter=nil)
187
- When::P6D
188
- end
189
-
190
- #
191
- # 暦日をグレゴリオ暦日に変換
192
- #
193
- # @private
194
- def _to_date_for_note(date)
195
- return date if date.frame.kind_of?(When::CalendarTypes::Gregorian)
196
- return When::Gregorian ^ date
197
- end
198
-
199
- private
200
-
201
- # オブジェクトの正規化
202
- # @private
203
- def _normalize(args=[], options={})
204
- @days_of_week ||= When.CalendarNote("SovietSixDayWeek/Notes::day::SixDay")
205
- @event ||= 'first'
206
- super
207
- end
208
- end
209
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014-2015 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::Coordinates
9
+
10
+ # Location of cities in Russia
11
+ Russian = [When::BasicTypes::M17n, [
12
+ "locale:[=en:, ja=ja:, alias]",
13
+ "names:[Russia, ロシア]",
14
+ [Spatial, "long:37.3756E", "lat:55.4508N", "label:[Moscow, モスクワ ]"],
15
+ [Spatial, "long:30.18E", "lat:59.57N", "label:[Saint_Petersburg, サンクトペテルブルク]"],
16
+ [Spatial,"long:131.55E", "lat:43.07N", "label:[Vladivostok, ウラジオストク ]"]
17
+ ]]
18
+ end
19
+
20
+ class When::CalendarNote
21
+
22
+ #
23
+ # 標準の暦注 五曜
24
+ #
25
+ CommonWithSovietFiveDay = [['_m:Calendar::Month'], ['Common::Week', '_n:SovietFiveDayWeek/Notes::day::FiveDay']]
26
+
27
+ #
28
+ # 標準の暦注 + 六曜
29
+ #
30
+ CommonWithSovietSixDay = [['_m:Calendar::Month'], ['Common::Week', '_n:SovietSixDayWeek/Notes::day::SixDay']]
31
+
32
+ #
33
+ # 五曜
34
+ #
35
+ class SovietFiveDayWeek < Week
36
+
37
+ Holidays = {
38
+ [1,22] => 5, [2,29] => 6, [5,1] => 5, [5,2] => 5, [11,7] => 5, [11,8] => 5
39
+ }
40
+
41
+ FirstDay = [0, 0, 3, 4, 4, 3, 3, 4, 0, 0, 1, 4]
42
+
43
+ SkipDay = {
44
+ 1 => [23,1], 5 => [3,2], 11 => [9,2]
45
+ }
46
+
47
+
48
+ #
49
+ # 暦注要素の定義
50
+ #
51
+ Notes = [When::BasicTypes::M17n, [
52
+ "locale:[=en:, ja=ja:, alias]",
53
+ "names:[SovietFiveDay]",
54
+
55
+ # 日の暦注 ----------------------------
56
+ [When::BasicTypes::M17n,
57
+ "names:[day]",
58
+ [When::BasicTypes::M17n,
59
+ "names:[FiveDay, 五曜]",
60
+ [DayOfWeek, "label:[I= ]", {'delta'=>5}],
61
+ [DayOfWeek, "label:[II= ]", {'delta'=>5}],
62
+ [DayOfWeek, "label:[III= ]", {'delta'=>5}],
63
+ [DayOfWeek, "label:[IV= ]", {'delta'=>5}],
64
+ [DayOfWeek, "label:[V= ]", {'delta'=>5}],
65
+ [DayOfWeek, "label:[Holiday=]", {'delta'=>190}],
66
+ [DayOfWeek, "label:[Leapday=]", {'delta'=>1461}]
67
+ ]
68
+ ]
69
+ ]]
70
+
71
+ #
72
+ # この日は何曜?
73
+ #
74
+ # @param [When::TM::TemporalPosition] date
75
+ # @param [When::TM::CalDate] base (not used)
76
+ #
77
+ # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
78
+ #
79
+ def fiveday(date, base=nil)
80
+ date = _to_date_for_note(date)
81
+ y,m,d = date.cal_date
82
+ index = fiveday_index(m,d)
83
+ {:value=>@days_of_week[index], :position=>[index, 7]}
84
+ end
85
+ alias :week :fiveday
86
+
87
+ # @private
88
+ def first(date, base=nil)
89
+ count = 0
90
+ d0 = d1 = _to_date_for_note(date)
91
+ r0 = r1 = nil
92
+ loop do
93
+ y,m,d = d1.cal_date
94
+ r1 = fiveday_index(m,d)
95
+ break if r1 == 0
96
+ d0 = d1
97
+ r0 = r1
98
+ d1 = d0 - When::P1D
99
+ count += 1
100
+ end
101
+ date -= count if count > 0
102
+ date.events = [@days_of_week[r1]]
103
+ date
104
+ end
105
+
106
+ # @private
107
+ def fiveday_index(m,d)
108
+ index = Holidays[[m,d]]
109
+ return index if index
110
+ day, shift = SkipDay[m]
111
+ d -= shift if day && d >= day
112
+ (FirstDay[m-1] + d - 1) % 5
113
+ end
114
+
115
+ # @private
116
+ def first_delta(parameter=nil)
117
+ When::P5D
118
+ end
119
+
120
+ #
121
+ # 暦日をグレゴリオ暦日に変換
122
+ #
123
+ # @private
124
+ def _to_date_for_note(date)
125
+ return date if date.frame.kind_of?(When::CalendarTypes::Gregorian)
126
+ return When::Gregorian ^ date
127
+ end
128
+
129
+ private
130
+
131
+ # オブジェクトの正規化
132
+ # @private
133
+ def _normalize(args=[], options={})
134
+ @days_of_week ||= When.CalendarNote("SovietFiveDayWeek/Notes::day::FiveDay")
135
+ @event ||= 'first'
136
+ super
137
+ end
138
+ end
139
+
140
+ #
141
+ # 六曜
142
+ #
143
+ class SovietSixDayWeek < Week
144
+
145
+ # @private
146
+ # 1 2 3 4 5 6 7 8 9 X N D
147
+ WeekLength = [7,6,7,6,7,6,7,7,6,7,6,7]
148
+
149
+ #
150
+ # 暦注要素の定義
151
+ #
152
+ Notes = [When::BasicTypes::M17n, [
153
+ "locale:[=en:, ja=ja:, alias]",
154
+ "names:[SovietSixDay]",
155
+
156
+ # 日の暦注 ----------------------------
157
+ [When::BasicTypes::M17n,
158
+ "names:[day]",
159
+ [When::BasicTypes::M17n,
160
+ "names:[SixDay, 六曜]",
161
+ [DayOfWeek, "label:[Первый= ]", {'delta'=>6}],
162
+ [DayOfWeek, "label:[Второй= ]", {'delta'=>6}],
163
+ [DayOfWeek, "label:[Третий= ]", {'delta'=>6}],
164
+ [DayOfWeek, "label:[Четвертый=]", {'delta'=>6}],
165
+ [DayOfWeek, "label:[Пятый= ]", {'delta'=>6}],
166
+ [DayOfWeek, "label:[Шестой= ]", {'delta'=>6}],
167
+ [DayOfWeek, "label:[Out of week= ]", {'delta'=>6}]
168
+ ]
169
+ ]
170
+ ]]
171
+
172
+ #
173
+ # この日は何曜?
174
+ #
175
+ # @param [When::TM::TemporalPosition] date
176
+ # @param [When::TM::CalDate] base (not used)
177
+ #
178
+ # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
179
+ #
180
+ def sixday(date, base=nil)
181
+ date = _to_date_for_note(date)
182
+ dow = date.cal_date[When::DAY-1]
183
+ index = dow == 31 ? 6 : (dow - 1) % 6
184
+ {:value=>@days_of_week[index], :position=>[index, WeekLength[(base||date).cal_date[When::MONTH-1]-1]]}
185
+ end
186
+ alias :week :sixday
187
+
188
+ # @private
189
+ def first(date, base=nil)
190
+ dow = _to_date_for_note(date).cal_date[When::DAY-1]
191
+ index = dow == 31 ? 6 : (dow - 1) % 6
192
+ date -= index if index > 0
193
+ date.events = [@days_of_week[index]]
194
+ date
195
+ end
196
+
197
+ # @private
198
+ def first_delta(parameter=nil)
199
+ When::P6D
200
+ end
201
+
202
+ #
203
+ # 暦日をグレゴリオ暦日に変換
204
+ #
205
+ # @private
206
+ def _to_date_for_note(date)
207
+ return date if date.frame.kind_of?(When::CalendarTypes::Gregorian)
208
+ return When::Gregorian ^ date
209
+ end
210
+
211
+ private
212
+
213
+ # オブジェクトの正規化
214
+ # @private
215
+ def _normalize(args=[], options={})
216
+ @days_of_week ||= When.CalendarNote("SovietSixDayWeek/Notes::day::SixDay")
217
+ @event ||= 'first'
218
+ super
219
+ end
220
+ end
221
+ end
@@ -1,223 +1,222 @@
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
- class BasicTypes::M17n
10
-
11
- Shire = [self, [
12
- "namespace:[cal=http://en.wikipedia.org/wiki/Middle-earth_calendar#]",
13
- "locale:[=en:, ja=ja:, alias]",
14
- "names:[Shire=]",
15
- "[Shire=en:The_Lord_of_the_Rings, ホビット庄暦=ja:%%<指輪物語>]",
16
-
17
- [self,
18
- "names:[Festival=, 祭= ]",
19
- "[%0sYule=en:Yule, %0sユール祭= ]",
20
- "[%0sLithe=cal:Hobbit_calendar, %0sライズ祭= ]",
21
- ],
22
-
23
- [self,
24
- "names:[Month, 月=ja:%%<月_(暦)>]",
25
- "[Yule=en:Yule, ユール祭= ]",
26
- "[Afteryule=en:Yule, ユール後月= ]",
27
- "[Solmath=cal:Hobbit_calendar, ソマス= ]",
28
- "[Rethe=cal:Hobbit_calendar, レセ= ]",
29
- "[Astron=cal:Hobbit_calendar, アストロン= ]",
30
- "[Thrimidge=cal:Hobbit_calendar, スリミッジ= ]",
31
- "[Forelithe=cal:Hobbit_calendar, ライズ前月= ]",
32
- "[Afterlithe=cal:Hobbit_calendar, ライズ後月= ]",
33
- "[Wedmath=cal:Hobbit_calendar, ウェドマス= ]",
34
- "[Halimath=cal:Hobbit_calendar, ハリマス= ]",
35
- "[Winterfilth=cal:Hobbit_calendar, ウィンターフィルス=]",
36
- "[Blotmath=cal:Hobbit_calendar, ブロドマス= ]",
37
- "[Foreyule=en:Yule, ユール前月= ]"
38
- ]
39
- ]]
40
- end
41
-
42
- #
43
- # ホビット庄暦の暦週
44
- #
45
- class CalendarNote::ShireWeek < CalendarNote::Week
46
-
47
- Notes = [When::BasicTypes::M17n, [
48
- "locale:[=en:, ja=ja:, alias]",
49
- "names:[Shire]",
50
-
51
- # 年の暦注 ----------------------------
52
- [When::BasicTypes::M17n,
53
- "names:[year]"
54
- ],
55
-
56
- # 月の暦注 ----------------------------
57
- [When::BasicTypes::M17n,
58
- "names:[month]",
59
- [When::BasicTypes::M17n,
60
- "names:[Month]"
61
- ]
62
- ],
63
-
64
- # 日の暦注 ----------------------------
65
- [When::BasicTypes::M17n,
66
- "names:[day]",
67
- [When::BasicTypes::M17n,
68
- "names:[Week]",
69
- [DayOfWeek, "label:[Saturday, 土曜日]", {'delta'=>7}],
70
- [DayOfWeek, "label:[Sunday, 日曜日]", {'delta'=>7}],
71
- [DayOfWeek, "label:[Monday, 月曜日]", {'delta'=>7}],
72
- [DayOfWeek, "label:[Tuesday, 火曜日]", {'delta'=>7}],
73
- [DayOfWeek, "label:[Wednesday, 水曜日]", {'delta'=>7}],
74
- [DayOfWeek, "label:[Thursday, 木曜日]", {'delta'=>7}],
75
- [DayOfWeek, "label:[Friday, 金曜日]", {'delta'=>7}],
76
- [DayOfWeek, "label:[lithe, 中日= ]", {'delta'=> 365}],
77
- [DayOfWeek, "label:[double, 重日= ]", {'delta'=>1827}]
78
- ],
79
-
80
- "[Common_Week=]"
81
- ]
82
- ]]
83
-
84
- # @private
85
- FirstDayOfWeek = [6, 1, 3, 5, 0, 2, 4] * 2
86
-
87
- # @private
88
- ExtraDayInYear = {
89
- [ 8, 2] => 7,
90
- [ 8, 4] => 0
91
- }
92
-
93
- # @private
94
- WeekLength = {
95
- [ 8, 3] => 8,
96
- [ 8, 4] => 9
97
- }
98
-
99
- # 当日または直前の lithe の日
100
- # @param date [When::TM::TemporalPosition]
101
- # @param parameter [nil] 未使用
102
- # @return [When::TM::TemporalPosition]
103
- #
104
- def lithe(date, parameter=nil)
105
- event_name = 'lithe'
106
- date = date.frame.jul_trans(date, {:events=>[event_name]})
107
- y,m,d = date.cal_date
108
- m = date.frame.send(:_to_index,[y,m]) + 1
109
- h,n = (m+5).divmod(7)
110
- dow = 182 * h[0] + 30 * n + d + 1
111
- if m==8
112
- case d
113
- when 2 ; dow = 0
114
- when 3 ; dow = date.frame._sum([y]) == 365 ? 1 : 0
115
- when 4 ; dow = 1
116
- end
117
- end
118
- return date if dow == 0
119
- date += When::TM::PeriodDuration.new([0,0,-dow])
120
- date.events = [event_name]
121
- date
122
- end
123
-
124
- # 当日または直前の week_day の日
125
- # @method week_day(date, parameter=nil)
126
- # @param [When::TM::TemporalPosition] date
127
- # @param [nil] parameter 未使用
128
- # @return [When::TM::TemporalPosition]
129
- # @note week_day は saturday, sunday, monday, tuesday, wednesday, thursday, friday に読み替えてください。
130
-
131
- # @private
132
- 7.times do |k|
133
- name = When.CalendarNote('ShireWeek/Notes::day::Week')[k].to_s.downcase
134
- module_eval %Q{
135
- def #{name}(date, parameter=nil)
136
- event_name = 'from_#{name}'
137
- date = date.frame.jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
138
- y,m,d = date.cal_date
139
- m = date.frame.send(:_to_index, [y,m]) + 1
140
- h,n = (m+5).divmod(7)
141
- dow = (182 * h[0] + 30 * n + d - #{k}) % 7
142
- case m
143
- when 8
144
- case d
145
- when 2 ; dow = 7 - #{k}
146
- when 3 ; dow = (date.frame._sum([y]) == 365 && #{k} == 0) ? 0 : 8 - #{k}
147
- when 4 ; dow = #{k} == 0 ? 0 : 9 - #{k}
148
- end
149
- when 9
150
- dow += (date.frame._sum([y]) == 365) ? 1 : 2 if d < #{k}
151
- end
152
- return date if dow == 0
153
- date += When::TM::PeriodDuration.new([0,0,-dow])
154
- date.events = [event_name]
155
- date
156
- end
157
- }
158
- end
159
-
160
- #
161
- # この日は何曜?
162
- #
163
- # @param [When::TM::TemporalPosition] date
164
- # @param [When::TM::CalDate] base (not used)
165
- #
166
- # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
167
- #
168
- def week(date, base=nil)
169
- date = _to_date_for_note(date)
170
- y, m, d = date.cal_date
171
- m = date.frame.send(:_to_index, [y,m]) + 1
172
- length = WeekLength[[m, date.length(When::MONTH)]] || 7
173
- index = length == 8 ? 0 : 8 if [m,d] == [8,3]
174
- index ||= ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7
175
- {:value=>@days_of_week[index], :position=>[index, length]}
176
- end
177
-
178
- #
179
- # 暦日を当該暦注計算用クラスに変換
180
- #
181
- # @private
182
- def _to_date_for_note(date)
183
- date = When::Shire ^ date unless date.frame.label.to_s == 'Shire'
184
- date
185
- end
186
-
187
- # オブジェクトの正規化
188
- # @private
189
- def _normalize(args=[], options={})
190
- @event ||= 'saturday'
191
- super
192
- end
193
- end
194
-
195
- module CalendarTypes
196
-
197
- _shire_indices = [
198
- When.Index('Shire::Month', {:base => 0,
199
- :branch=>{1=>When.Resource('_m:Shire::Festival::*')[1]}}),
200
- When::Coordinates::DefaultDayIndex
201
- ]
202
-
203
- _IDs = '0,1,2,3,4,5,6,6=,7,8,9,10,11,12'
204
-
205
- #
206
- # Shire Calendar based on summer solstice date
207
- #
208
- Shire = [SolarYearTableBased, {
209
- 'label' => 'Shire::Shire',
210
- 'indices' => _shire_indices,
211
- 'border' => '00-00-02',
212
- 'engine_day' => -9, # Jun 1st is 01-09
213
- 'day_offset' => -183, # the day 183 days before summer solstice
214
- 'cycle_offset' => Rational(1,4), # summer solstice
215
- # 'time_basis' => '+09:00', # JST
216
- 'rule_table' => {
217
- 365 => {'Length'=>[2]+[30]*6+[3]+[30]*6, 'IDs'=>_IDs},
218
- 366 => {'Length'=>[2]+[30]*6+[4]+[30]*6, 'IDs'=>_IDs}
219
- },
220
- 'note' => 'ShireWeek'
221
- }]
222
- end
223
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2015 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
+ class BasicTypes::M17n
10
+
11
+ Shire = [self, [
12
+ "namespace:[cal=http://en.wikipedia.org/wiki/Middle-earth_calendar#]",
13
+ "locale:[=en:, ja=ja:, zh=zh:, alias]",
14
+ "names:[Middle-earth=en:Middle-earth_calendar#Shire_calendar, ホビット庄暦=ja:%%<指輪物語>, 中土曆=zh:%%<魔戒>, *alias:Shire]",
15
+
16
+ [self,
17
+ "names:[Festival=, 祭= ]",
18
+ "[%0sYule=en:Yule, %0sユール祭= ]",
19
+ "[%0sLithe=cal:Hobbit_calendar, %0sライズ祭= ]",
20
+ ],
21
+
22
+ [self,
23
+ "names:[month name=en:Month, 月の名前=ja:%%<月_(暦)>, 該月的名稱=, *alias:Month=]",
24
+ "[Yule=en:Yule, ユール祭= ]",
25
+ "[Afteryule=en:Yule, ユール後月= ]",
26
+ "[Solmath=cal:Hobbit_calendar, ソマス= ]",
27
+ "[Rethe=cal:Hobbit_calendar, レセ= ]",
28
+ "[Astron=cal:Hobbit_calendar, アストロン= ]",
29
+ "[Thrimidge=cal:Hobbit_calendar, スリミッジ= ]",
30
+ "[Forelithe=cal:Hobbit_calendar, ライズ前月= ]",
31
+ "[Afterlithe=cal:Hobbit_calendar, ライズ後月= ]",
32
+ "[Wedmath=cal:Hobbit_calendar, ウェドマス= ]",
33
+ "[Halimath=cal:Hobbit_calendar, ハリマス= ]",
34
+ "[Winterfilth=cal:Hobbit_calendar, ウィンターフィルス=]",
35
+ "[Blotmath=cal:Hobbit_calendar, ブロドマス= ]",
36
+ "[Foreyule=en:Yule, ユール前月= ]"
37
+ ]
38
+ ]]
39
+ end
40
+
41
+ #
42
+ # ホビット庄暦の暦週
43
+ #
44
+ class CalendarNote::ShireWeek < CalendarNote::Week
45
+
46
+ Notes = [When::BasicTypes::M17n, [
47
+ "locale:[=en:, ja=ja:, alias]",
48
+ "names:[Shire, ホビット庄暦]",
49
+
50
+ # 年の暦注 ----------------------------
51
+ [When::BasicTypes::M17n,
52
+ "names:[note for year=, 年の暦注=, *year]"
53
+ ],
54
+
55
+ # 月の暦注 ----------------------------
56
+ [When::BasicTypes::M17n,
57
+ "names:[note for month=, 月の暦注=, *month]",
58
+ [When::BasicTypes::M17n,
59
+ "names:[month name=en:Month, 月の名前=ja:%%<月_(暦)>, zh:該月的名稱=, *alias:Month=]"
60
+ ]
61
+ ],
62
+
63
+ # 日の暦注 ----------------------------
64
+ [When::BasicTypes::M17n,
65
+ "names:[note for day=, 日の暦注=, *day]",
66
+ [When::BasicTypes::M17n,
67
+ "names:[Week, 週, zh:星期]",
68
+ [DayOfWeek, "label:[Saturday, 土曜日, /date/day_names/6]", {'delta'=>7}],
69
+ [DayOfWeek, "label:[Sunday, 日曜日, /date/day_names/0]", {'delta'=>7}],
70
+ [DayOfWeek, "label:[Monday, 月曜日, /date/day_names/1]", {'delta'=>7}],
71
+ [DayOfWeek, "label:[Tuesday, 火曜日, /date/day_names/2]", {'delta'=>7}],
72
+ [DayOfWeek, "label:[Wednesday, 水曜日, /date/day_names/3]", {'delta'=>7}],
73
+ [DayOfWeek, "label:[Thursday, 木曜日, /date/day_names/4]", {'delta'=>7}],
74
+ [DayOfWeek, "label:[Friday, 金曜日, /date/day_names/5]", {'delta'=>7}],
75
+ [DayOfWeek, "label:[lithe, 中日= ]", {'delta'=> 365}],
76
+ [DayOfWeek, "label:[double, 重日= ]", {'delta'=>1827}]
77
+ ],
78
+
79
+ "[Common_Week=]"
80
+ ]
81
+ ]]
82
+
83
+ # @private
84
+ FirstDayOfWeek = [6, 1, 3, 5, 0, 2, 4] * 2
85
+
86
+ # @private
87
+ ExtraDayInYear = {
88
+ [ 8, 2] => 7,
89
+ [ 8, 4] => 0
90
+ }
91
+
92
+ # @private
93
+ WeekLength = {
94
+ [ 8, 3] => 8,
95
+ [ 8, 4] => 9
96
+ }
97
+
98
+ # 当日または直前の lithe の日
99
+ # @param date [When::TM::TemporalPosition]
100
+ # @param parameter [nil] 未使用
101
+ # @return [When::TM::TemporalPosition]
102
+ #
103
+ def lithe(date, parameter=nil)
104
+ event_name = 'lithe'
105
+ date = date.frame.jul_trans(date, {:events=>[event_name]})
106
+ y,m,d = date.cal_date
107
+ m = date.frame.send(:_to_index,[y,m]) + 1
108
+ h,n = (m+5).divmod(7)
109
+ dow = 182 * h[0] + 30 * n + d + 1
110
+ if m==8
111
+ case d
112
+ when 2 ; dow = 0
113
+ when 3 ; dow = date.frame._sum([y]) == 365 ? 1 : 0
114
+ when 4 ; dow = 1
115
+ end
116
+ end
117
+ return date if dow == 0
118
+ date += When::TM::PeriodDuration.new([0,0,-dow])
119
+ date.events = [event_name]
120
+ date
121
+ end
122
+
123
+ # 当日または直前の week_day の日
124
+ # @method week_day(date, parameter=nil)
125
+ # @param [When::TM::TemporalPosition] date
126
+ # @param [nil] parameter 未使用
127
+ # @return [When::TM::TemporalPosition]
128
+ # @note week_day は saturday, sunday, monday, tuesday, wednesday, thursday, friday に読み替えてください。
129
+
130
+ # @private
131
+ 7.times do |k|
132
+ name = When.CalendarNote('ShireWeek/Notes::day::Week')[k].to_s.downcase
133
+ module_eval %Q{
134
+ def #{name}(date, parameter=nil)
135
+ event_name = 'from_#{name}'
136
+ date = date.frame.jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
137
+ y,m,d = date.cal_date
138
+ m = date.frame.send(:_to_index, [y,m]) + 1
139
+ h,n = (m+5).divmod(7)
140
+ dow = (182 * h[0] + 30 * n + d - #{k}) % 7
141
+ case m
142
+ when 8
143
+ case d
144
+ when 2 ; dow = 7 - #{k}
145
+ when 3 ; dow = (date.frame._sum([y]) == 365 && #{k} == 0) ? 0 : 8 - #{k}
146
+ when 4 ; dow = #{k} == 0 ? 0 : 9 - #{k}
147
+ end
148
+ when 9
149
+ dow += (date.frame._sum([y]) == 365) ? 1 : 2 if d < #{k}
150
+ end
151
+ return date if dow == 0
152
+ date += When::TM::PeriodDuration.new([0,0,-dow])
153
+ date.events = [event_name]
154
+ date
155
+ end
156
+ }
157
+ end
158
+
159
+ #
160
+ # この日は何曜?
161
+ #
162
+ # @param [When::TM::TemporalPosition] date
163
+ # @param [When::TM::CalDate] base (not used)
164
+ #
165
+ # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
166
+ #
167
+ def week(date, base=nil)
168
+ date = _to_date_for_note(date)
169
+ y, m, d = date.cal_date
170
+ m = date.frame.send(:_to_index, [y,m]) + 1
171
+ length = WeekLength[[m, date.length(When::MONTH)]] || 7
172
+ index = length == 8 ? 0 : 8 if [m,d] == [8,3]
173
+ index ||= ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7
174
+ {:value=>@days_of_week[index], :position=>[index, length]}
175
+ end
176
+
177
+ #
178
+ # 暦日を当該暦注計算用クラスに変換
179
+ #
180
+ # @private
181
+ def _to_date_for_note(date)
182
+ date = When::Shire ^ date unless date.frame.label.to_s == 'Shire'
183
+ date
184
+ end
185
+
186
+ # オブジェクトの正規化
187
+ # @private
188
+ def _normalize(args=[], options={})
189
+ @event ||= 'saturday'
190
+ super
191
+ end
192
+ end
193
+
194
+ module CalendarTypes
195
+
196
+ _shire_indices = [
197
+ When.Index('Shire::Month', {:base => 0,
198
+ :branch=>{1=>When.Resource('_m:Shire::Festival::*')[1]}}),
199
+ When::Coordinates::DefaultDayIndex
200
+ ]
201
+
202
+ _IDs = '0,1,2,3,4,5,6,6=,7,8,9,10,11,12'
203
+
204
+ #
205
+ # Shire Calendar based on summer solstice date
206
+ #
207
+ Shire = [SolarYearTableBased, {
208
+ 'label' => 'Shire',
209
+ 'indices' => _shire_indices,
210
+ 'border' => '00-00-02',
211
+ 'engine_day' => -9, # Jun 1st is 01-09
212
+ 'day_offset' => -183, # the day 183 days before summer solstice
213
+ 'cycle_offset' => Rational(1,4), # summer solstice
214
+ # 'time_basis' => '+09:00', # JST
215
+ 'rule_table' => {
216
+ 365 => {'Length'=>[2]+[30]*6+[3]+[30]*6, 'IDs'=>_IDs},
217
+ 366 => {'Length'=>[2]+[30]*6+[4]+[30]*6, 'IDs'=>_IDs}
218
+ },
219
+ 'note' => 'ShireWeek'
220
+ }]
221
+ end
222
+ end