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,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