when_exe 0.4.1 → 0.4.2

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