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,80 +1,80 @@
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
- WeekDate = [self, [
13
- "locale:[=en:, ja]",
14
- "names:[WeekDate=en:ISO_week_date, 暦週=]",
15
- [self, "names:[week]"] + (1...100).to_a.map {|m| "Week #{m}"},
16
- ]]
17
- end
18
-
19
- module CalendarTypes
20
-
21
- #
22
- # Week Date Calendar
23
- #
24
- class WeekDate < TableBased
25
-
26
- private
27
-
28
- #
29
- # Object Normalization
30
- #
31
- def _normalize(args=[], options={})
32
- @label ||= 'WeekDate'
33
- @period ||= 7 # length of week
34
- @first ||= 0 # first day of week
35
- @margin ||= 3 # first day of year
36
- @strftime ||= @period < 10 ? '%Y-W%m-%q' : '%Y-W%m-%d'
37
- @engine ||= 'Gregorian'
38
- @engine = When.Calendar(@engine)
39
- @indices ||= [
40
- When.Index('WeekDate::week'),
41
- When::Coordinates::DefaultDayIndex
42
- ]
43
- @rule_table ||= _generate_rule
44
- raise ArgumentError, 'Too many weeks in a year' if @rule_table.keys.max / @period >= 100
45
- super
46
- end
47
-
48
- # 年初の通日
49
- #
50
- # @param [Array<Numeric>] date ( 年 )
51
- #
52
- # @return [Integer] 年初の通日
53
- #
54
- def _sdn_(date)
55
- year = +date[0] - @engine.origin_of_MSC
56
- sdn0 = @margin + @engine._coordinates_to_number(year, 0, 0)
57
- sdn1 = @first + @period * sdn0.div(@period)
58
- sdn1 -= @period if sdn1 > sdn0
59
- sdn1
60
- end
61
-
62
- # @private
63
- def _generate_rule
64
- hash = {}
65
- _week_number_range.each do |length|
66
- hash[@period * length] = {'Length'=>[@period] * length}
67
- end
68
- hash
69
- end
70
-
71
- # @private
72
- def _week_number_range
73
- return 52..53 if @engine.kind_of?(When::CalendarTypes::Christian)
74
- starts = (0..19).to_a.map {|year| @engine._coordinates_to_number(year, 0, 0)}
75
- lengths = (0..18).to_a.map {|year| starts[year+1] - starts[year]}
76
- (lengths.min / @period)..((lengths.max + @period - 1) / @period)
77
- end
78
- end
79
- end
80
- 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
+ WeekDate = [self, [
13
+ "locale:[=en:, ja]",
14
+ "names:[WeekDate=en:ISO_week_date, 暦週=]",
15
+ [self, "names:[week]"] + (1...100).to_a.map {|m| "Week #{m}"},
16
+ ]]
17
+ end
18
+
19
+ module CalendarTypes
20
+
21
+ #
22
+ # Week Date Calendar
23
+ #
24
+ class WeekDate < TableBased
25
+
26
+ private
27
+
28
+ #
29
+ # Object Normalization
30
+ #
31
+ def _normalize(args=[], options={})
32
+ @label ||= 'WeekDate'
33
+ @period ||= 7 # length of week
34
+ @first ||= 0 # first day of week
35
+ @margin ||= 3 # first day of year
36
+ @strftime ||= @period < 10 ? '%Y-W%m-%q' : '%Y-W%m-%d'
37
+ @engine ||= 'Gregorian'
38
+ @engine = When.Calendar(@engine)
39
+ @indices ||= [
40
+ When.Index('WeekDate::week'),
41
+ When::Coordinates::DefaultDayIndex
42
+ ]
43
+ @rule_table ||= _generate_rule
44
+ raise ArgumentError, 'Too many weeks in a year' if @rule_table.keys.max / @period >= 100
45
+ super
46
+ end
47
+
48
+ # 年初の通日
49
+ #
50
+ # @param [Array<Numeric>] date ( 年 )
51
+ #
52
+ # @return [Integer] 年初の通日
53
+ #
54
+ def _sdn_(date)
55
+ year = +date[0] - @engine.origin_of_MSC
56
+ sdn0 = @margin + @engine._coordinates_to_number(year, 0, 0)
57
+ sdn1 = @first + @period * sdn0.div(@period)
58
+ sdn1 -= @period if sdn1 > sdn0
59
+ sdn1
60
+ end
61
+
62
+ # @private
63
+ def _generate_rule
64
+ hash = {}
65
+ _week_number_range.each do |length|
66
+ hash[@period * length] = {'Length'=>[@period] * length}
67
+ end
68
+ hash
69
+ end
70
+
71
+ # @private
72
+ def _week_number_range
73
+ return 52..53 if @engine.kind_of?(When::CalendarTypes::Christian)
74
+ starts = (0..19).to_a.map {|year| @engine._coordinates_to_number(year, 0, 0)}
75
+ lengths = (0..18).to_a.map {|year| starts[year+1] - starts[year]}
76
+ (lengths.min / @period)..((lengths.max + @period - 1) / @period)
77
+ end
78
+ end
79
+ end
80
+ end
@@ -1,175 +1,175 @@
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
- World = [self, [
13
- "locale:[=en:, ja=ja:, alias]",
14
- "names:[World=]",
15
- "[World=en:The_World_Calendar, 世界暦]"
16
- ]]
17
- end
18
-
19
- #
20
- # 世界暦の暦週
21
- #
22
- class CalendarNote::WorldWeek < CalendarNote::Week
23
-
24
- #
25
- # 暦注要素の定義
26
- #
27
- Notes = [When::BasicTypes::M17n, [
28
- "locale:[=en:, ja=ja:, alias]",
29
- "names:[World]",
30
-
31
- # 年の暦注 ----------------------------
32
- [When::BasicTypes::M17n,
33
- "names:[year]"
34
- ],
35
-
36
- # 月の暦注 ----------------------------
37
- [When::BasicTypes::M17n,
38
- "names:[month]",
39
- [When::BasicTypes::M17n,
40
- "names:[Month]"
41
- ]
42
- ],
43
-
44
- # 日の暦注 ----------------------------
45
- [When::BasicTypes::M17n,
46
- "names:[day]",
47
- [When::BasicTypes::M17n,
48
- "names:[Week]",
49
- [DayOfWeek, "label:[Sunday, 日曜日]", {'delta'=>7}],
50
- [DayOfWeek, "label:[Monday, 月曜日]", {'delta'=>7}],
51
- [DayOfWeek, "label:[Tuesday, 火曜日]", {'delta'=>7}],
52
- [DayOfWeek, "label:[Wednesday, 水曜日]", {'delta'=>7}],
53
- [DayOfWeek, "label:[Thursday, 木曜日]", {'delta'=>7}],
54
- [DayOfWeek, "label:[Friday, 金曜日]", {'delta'=>7}],
55
- [DayOfWeek, "label:[Saturday, 土曜日]", {'delta'=>7}],
56
- [DayOfWeek, "label:[Worldsday, 無曜日]", {'delta'=>183}],
57
- ],
58
-
59
- "[Standard_Week]"
60
- ]
61
- ]]
62
-
63
- # @private
64
- FirstDayOfWeek = [0, 3, 5] * 4
65
-
66
- # @private
67
- ExtraDayInYear = {
68
- [ 6, 31] => 7,
69
- [12, 31] => 7
70
- }
71
-
72
- # @private
73
- WeekLength = {
74
- [ 6, 30] => 7,
75
- [ 6, 31] => 8,
76
- [12, 30] => 8,
77
- [12, 31] => 8
78
- }
79
-
80
- # 当日または直前の worldsday の日
81
- # @param [When::TM::TemporalPosition] date
82
- # @param [nil] parameter 未使用
83
- # @return [When::TM::TemporalPosition]
84
- #
85
- def worldsday(date, parameter=nil)
86
- event_name = 'worldsday'
87
- date = When.Calendar('World').jul_trans(date, {:events=>event_name})
88
- y,m,d = date.cal_date
89
- h, m = (m-1).divmod(6)
90
- return date if m == 5 && d == 31
91
- dow = [0, 31, 61, 91, 122, 152][m] + d
92
- dow += 182 if h == 1 && When.Calendar('World')._sum([y]) == 365
93
- date += When::TM::PeriodDuration.new([0,0,-dow])
94
- date.events = [event_name]
95
- date
96
- end
97
-
98
- # 当日または直前の week_day の日
99
- # @method week_day(date, parameter=nil)
100
- # @param [When::TM::TemporalPosition] date
101
- # @param [nil] parameter 未使用
102
- # @return [When::TM::TemporalPosition]
103
- # @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。
104
-
105
- # @private
106
- 7.times do |k|
107
- name = When.CalendarNote('WorldWeek/Notes::day::Week')[k].to_s.downcase
108
- module_eval %Q{
109
- def #{name}(date, parameter=nil)
110
- event_name = 'from_#{name}'
111
- date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
112
- y,m,d = date.cal_date
113
- dow = (m % 6 == 0 && d == 31) ? 7-#{k} : ([4,6,2][m % 3] + d - #{k}) % 7
114
- return date if dow == 0
115
- dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366)
116
- date += When::TM::PeriodDuration.new([0,0,-dow])
117
- date.events = [event_name]
118
- date
119
- end
120
- }
121
- end
122
-
123
- #
124
- # この日は何曜?
125
- #
126
- # @param [When::TM::TemporalPosition] date
127
- # @param [When::TM::CalDate] base (not used)
128
- #
129
- # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
130
- #
131
- def week(date, base=nil)
132
- date = _to_date_for_note(date)
133
- y, m, d = date.cal_date
134
- index = ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7
135
- length = WeekLength[[m, date.length(When::MONTH)]] || 7
136
- {:value=>@days_of_week[index], :position=>[index, length]}
137
- end
138
-
139
- #
140
- # 暦日を当該暦注計算用クラスに変換
141
- #
142
- # @private
143
- def _to_date_for_note(date)
144
- date = When::World ^ date unless date.frame.equal?(When::World)
145
- date
146
- end
147
-
148
- private
149
-
150
- # オブジェクトの正規化
151
- # @private
152
- def _normalize(args=[], options={})
153
- @event ||= 'sunday'
154
- super
155
- end
156
- end
157
-
158
- module CalendarTypes
159
- #
160
- # World calendar based on Gregorian calendar
161
- #
162
- World = [CyclicTableBased, {
163
- 'label' => 'World::World',
164
- 'origin_of_LSC' => 1721060,
165
- 'rule_table' => {
166
- 'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']},
167
- 'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24},
168
- 'LC' => {'Rule' =>[366, 365, 365, 365]*25},
169
- 365 => {'Length'=>[31,30,30]*3 + [31,30,31]},
170
- 366 => {'Length'=>[31,30,30,31,30,31] *2}
171
- },
172
- 'note' => 'WorldWeek'
173
- }]
174
- end
175
- 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
+ World = [self, [
13
+ "locale:[=en:, ja=ja:, alias]",
14
+ "names:[World=]",
15
+ "[World=en:The_World_Calendar, 世界暦]"
16
+ ]]
17
+ end
18
+
19
+ #
20
+ # 世界暦の暦週
21
+ #
22
+ class CalendarNote::WorldWeek < CalendarNote::Week
23
+
24
+ #
25
+ # 暦注要素の定義
26
+ #
27
+ Notes = [When::BasicTypes::M17n, [
28
+ "locale:[=en:, ja=ja:, alias]",
29
+ "names:[World]",
30
+
31
+ # 年の暦注 ----------------------------
32
+ [When::BasicTypes::M17n,
33
+ "names:[year]"
34
+ ],
35
+
36
+ # 月の暦注 ----------------------------
37
+ [When::BasicTypes::M17n,
38
+ "names:[month]",
39
+ [When::BasicTypes::M17n,
40
+ "names:[Month]"
41
+ ]
42
+ ],
43
+
44
+ # 日の暦注 ----------------------------
45
+ [When::BasicTypes::M17n,
46
+ "names:[day]",
47
+ [When::BasicTypes::M17n,
48
+ "names:[Week]",
49
+ [DayOfWeek, "label:[Sunday, 日曜日]", {'delta'=>7}],
50
+ [DayOfWeek, "label:[Monday, 月曜日]", {'delta'=>7}],
51
+ [DayOfWeek, "label:[Tuesday, 火曜日]", {'delta'=>7}],
52
+ [DayOfWeek, "label:[Wednesday, 水曜日]", {'delta'=>7}],
53
+ [DayOfWeek, "label:[Thursday, 木曜日]", {'delta'=>7}],
54
+ [DayOfWeek, "label:[Friday, 金曜日]", {'delta'=>7}],
55
+ [DayOfWeek, "label:[Saturday, 土曜日]", {'delta'=>7}],
56
+ [DayOfWeek, "label:[Worldsday, 週外日]", {'delta'=>183}],
57
+ ],
58
+
59
+ "[Common_Week]"
60
+ ]
61
+ ]]
62
+
63
+ # @private
64
+ FirstDayOfWeek = [0, 3, 5] * 4
65
+
66
+ # @private
67
+ ExtraDayInYear = {
68
+ [ 6, 31] => 7,
69
+ [12, 31] => 7
70
+ }
71
+
72
+ # @private
73
+ WeekLength = {
74
+ [ 5, 31] => 8,
75
+ [ 6, 31] => 8,
76
+ [11, 31] => 8,
77
+ [12, 31] => 8
78
+ }
79
+
80
+ # 当日または直前の worldsday の日
81
+ # @param [When::TM::TemporalPosition] date
82
+ # @param [nil] parameter 未使用
83
+ # @return [When::TM::TemporalPosition]
84
+ #
85
+ def worldsday(date, parameter=nil)
86
+ event_name = 'worldsday'
87
+ date = When.Calendar('World').jul_trans(date, {:events=>event_name})
88
+ y,m,d = date.cal_date
89
+ h, m = (m-1).divmod(6)
90
+ return date if m == 5 && d == 31
91
+ dow = [0, 31, 61, 91, 122, 152][m] + d
92
+ dow += 182 if h == 1 && When.Calendar('World')._sum([y]) == 365
93
+ date += When::TM::PeriodDuration.new([0,0,-dow])
94
+ date.events = [event_name]
95
+ date
96
+ end
97
+
98
+ # 当日または直前の week_day の日
99
+ # @method week_day(date, parameter=nil)
100
+ # @param [When::TM::TemporalPosition] date
101
+ # @param [nil] parameter 未使用
102
+ # @return [When::TM::TemporalPosition]
103
+ # @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。
104
+
105
+ # @private
106
+ 7.times do |k|
107
+ name = When.CalendarNote('WorldWeek/Notes::day::Week')[k].to_s.downcase
108
+ module_eval %Q{
109
+ def #{name}(date, parameter=nil)
110
+ event_name = 'from_#{name}'
111
+ date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY})
112
+ y,m,d = date.cal_date
113
+ dow = (m % 6 == 0 && d == 31) ? 7-#{k} : ([4,6,2][m % 3] + d - #{k}) % 7
114
+ return date if dow == 0
115
+ dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366)
116
+ date += When::TM::PeriodDuration.new([0,0,-dow])
117
+ date.events = [event_name]
118
+ date
119
+ end
120
+ }
121
+ end
122
+
123
+ #
124
+ # この日は何曜?
125
+ #
126
+ # @param [When::TM::TemporalPosition] date
127
+ # @param [When::TM::CalDate] base
128
+ #
129
+ # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
130
+ #
131
+ def week(date, base=nil)
132
+ date = _to_date_for_note(date)
133
+ y, m, d = date.cal_date
134
+ index = ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7
135
+ length = WeekLength[[m, (base||date).length(When::MONTH)]] || 7
136
+ {:value=>@days_of_week[index], :position=>[index, length]}
137
+ end
138
+
139
+ #
140
+ # 暦日を当該暦注計算用クラスに変換
141
+ #
142
+ # @private
143
+ def _to_date_for_note(date)
144
+ date = When::World ^ date unless date.frame.equal?(When::World)
145
+ date
146
+ end
147
+
148
+ private
149
+
150
+ # オブジェクトの正規化
151
+ # @private
152
+ def _normalize(args=[], options={})
153
+ @event ||= 'sunday'
154
+ super
155
+ end
156
+ end
157
+
158
+ module CalendarTypes
159
+ #
160
+ # World calendar based on Gregorian calendar
161
+ #
162
+ World = [CyclicTableBased, {
163
+ 'label' => 'World::World',
164
+ 'origin_of_LSC' => 1721060,
165
+ 'rule_table' => {
166
+ 'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']},
167
+ 'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24},
168
+ 'LC' => {'Rule' =>[366, 365, 365, 365]*25},
169
+ 365 => {'Length'=>[31,30,30]*3 + [31,30,31]},
170
+ 366 => {'Length'=>[31,30,30,31,30,31] *2}
171
+ },
172
+ 'note' => 'WorldWeek'
173
+ }]
174
+ end
175
+ end