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
@@ -0,0 +1,209 @@
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,50 +1,50 @@
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
- Symmetry = [self, [
13
- "locale:[=en:, ja]",
14
- "names:[Symmetry=]",
15
- "[Sym454=en:Symmetry454, 対称454暦=]",
16
- "[Sym010=http://individual.utoronto.ca/kalendis/classic.htm, 対称010暦=]"
17
- ]]
18
- end
19
-
20
- module CalendarTypes
21
-
22
- _pattern = (0...293).to_a.map {|year| (52 * year + 146) % 293 < 52 ? 371 : 364}
23
-
24
- #
25
- # Symmetry 454 Calendar
26
- #
27
- Sym454 = [CyclicTableBased, {
28
- 'label' => 'Symmetry::Sym454',
29
- 'origin_of_LSC' => 1721062,
30
- 'rule_table' => {
31
- 'T' => {'Rule' =>_pattern},
32
- 364 => {'Length'=>[28,35,28] * 4},
33
- 371 => {'Length'=>[28,35,28] * 3 + [28,35,35]}
34
- }
35
- }]
36
-
37
- #
38
- # Symmetry 010 Calendar
39
- #
40
- Sym010 = [CyclicTableBased, {
41
- 'label' => 'Symmetry::Sym010',
42
- 'origin_of_LSC' => 1721062,
43
- 'rule_table' => {
44
- 'T' => {'Rule' =>_pattern},
45
- 364 => {'Length'=>[30,31,30] * 4},
46
- 371 => {'Length'=>[30,31,30] * 3 + [30,31,37]}
47
- }
48
- }]
49
- end
50
- 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
+ Symmetry = [self, [
13
+ "locale:[=en:, ja]",
14
+ "names:[Symmetry=]",
15
+ "[Sym454=en:Symmetry454, 対称454暦=]",
16
+ "[Sym010=http://individual.utoronto.ca/kalendis/classic.htm, 対称010暦=]"
17
+ ]]
18
+ end
19
+
20
+ module CalendarTypes
21
+
22
+ _pattern = (0...293).to_a.map {|year| (52 * year + 146) % 293 < 52 ? 371 : 364}
23
+
24
+ #
25
+ # Symmetry 454 Calendar
26
+ #
27
+ Sym454 = [CyclicTableBased, {
28
+ 'label' => 'Symmetry::Sym454',
29
+ 'origin_of_LSC' => 1721062,
30
+ 'rule_table' => {
31
+ 'T' => {'Rule' =>_pattern},
32
+ 364 => {'Length'=>[28,35,28] * 4},
33
+ 371 => {'Length'=>[28,35,28] * 3 + [28,35,35]}
34
+ }
35
+ }]
36
+
37
+ #
38
+ # Symmetry 010 Calendar
39
+ #
40
+ Sym010 = [CyclicTableBased, {
41
+ 'label' => 'Symmetry::Sym010',
42
+ 'origin_of_LSC' => 1721062,
43
+ 'rule_table' => {
44
+ 'T' => {'Rule' =>_pattern},
45
+ 364 => {'Length'=>[30,31,30] * 4},
46
+ 371 => {'Length'=>[30,31,30] * 3 + [30,31,37]}
47
+ }
48
+ }]
49
+ end
50
+ end
@@ -1,335 +1,336 @@
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
- Thai = [self, [
12
- "locale:[=en:, ja=ja:, alias]",
13
- "names:[Thai=]",
14
- "[ThaiLuniSolar=en:Thai_lunar_calendar, タイ太陰太陽暦=ja:%%<チャントラカティ>]",
15
-
16
- [self,
17
- "names:[IntercalaryMonth=en:Intercalation, 閏月]",
18
- "[%s Śuklapakṣa=, %s 白分=, _IAST_]",
19
- "[%s Kṛṣṇapakṣa=, %s 黒分=, _IAST_]",
20
- "[adhika %s Śuklapakṣa=, 閏%s 白分=, _IAST_]",
21
- "[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, _IAST_]"
22
- ],
23
-
24
- [self,
25
- "names:[LunarMonth=, 太陰月=ja:%%<月_(暦)>]",
26
- "[Mārgaśīra=en:Margashirsha, マールガシールシャ=, _IAST_]",
27
- "[Pauṣa=en:Pausha, パウシャ=, _IAST_]",
28
- "[Māgha=en:Maagha, マーガ=, _IAST_]",
29
- "[Phālguna=en:Phalguna, パールグナ=, _IAST_]",
30
- "[Caitra=en:Chaitra, チャイトラ=, _IAST_]",
31
- "[Vaiśākha=en:Vaisakha, ヴァイシャーカ=, _IAST_]",
32
- "[Jyaiṣṭha=en:Jyeshta, ジャイシュタ=, _IAST_]",
33
- "[Āṣāḍha=en:Aashaadha, アーシャーダ=, _IAST_]",
34
- "[Śrāvaṇa=en:Shraavana, シュラーヴァナ=, _IAST_]",
35
- "[Bhādrapada=en:Bhadrapada, バードラパダ=, _IAST_]",
36
- "[Āśvina=en:Ashwin, アーシュヴィナ=, _IAST_]",
37
- "[Kārttika=en:Kartika_(month), カールッティカ=, _IAST_]"
38
- ]
39
- ]]
40
- end
41
-
42
- module CalendarTypes
43
-
44
- #
45
- # ソンクラーンとタイ暦の暦定数
46
- #
47
- module Songkran
48
-
49
- # ソンクラーン - 太陽の白羊宮入り
50
- #
51
- # @param [Integer] y 年
52
- #
53
- # @return [Integer] ソンクラーンのユリウス日
54
- #
55
- def songkran_(y)
56
- e = _eph(y)
57
- return @origin_of_LSC - 1 + e['H'][0]
58
- end
59
-
60
- # y で指定した年の暦定数を返します。
61
- #
62
- # @param [Integer] y 年
63
- #
64
- # @return [Hash]
65
- #
66
- def _eph(y) # C
67
- h = (y+4).divmod(9)[0] # y
68
- h = (y-h).divmod(3)[0] # z
69
- h = (y+1-h).divmod(2)[0] # r (2 => h?)
70
- h = (36525876*y+149049-h).divmod(100000) # s
71
- a = (h[0]*11+633-((h[0]+7368).divmod(8878))[0]).divmod(692)
72
- m = (h[0]+a[0]+0).divmod(30)
73
- return {'H'=>h, 'A'=>a, 'M'=>m}
74
- end
75
- end
76
-
77
- #
78
- # The Calendar of Thai (Prototype)
79
- #
80
- class ThaiP < TableBased
81
-
82
- include Lunar
83
- include Songkran
84
-
85
- # 月番号
86
- _intercalary_month = When.Resource('_m:Thai::IntercalaryMonth::*')
87
- Indices = [
88
- When.Index('Thai::LunarMonth', {:branch=>{0 => _intercalary_month[0],
89
- 0.5 => _intercalary_month[1],
90
- -1.5 => _intercalary_month[2],
91
- -1 => _intercalary_month[3]}}),
92
- When::Coordinates::DefaultDayIndex
93
- ]
94
-
95
- # 月の大小と閏
96
- _NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
97
- _LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9&,9*,9,9<,10,10<,11,11<,12,12<'
98
- RuleTable = {
99
- 354 => {'Length'=>[15,15,15,14]*6, 'IDs' => _NormalIDs},
100
- 355 => {'Length'=>[15,15,15,14]*3 + [15]*4 + [15,15,15,14]*2, 'IDs' => _NormalIDs},
101
- 384 => {'Length'=>[15,15,15,14]*4 + [15]*2 + [15,15,15,14]*2, 'IDs' => _LeapIDs}
102
- }
103
-
104
- private
105
-
106
- # オブジェクトの正規化
107
- # @private
108
- def _normalize(args=[], options={})
109
- @label ||= 'Thai::ThaiLuniSolar'
110
-
111
- Rational
112
- @mean_month ||= 29 + Rational( 373, 703)
113
- @mean_year ||= 365 + Rational(25876, 100000)
114
- @epoch_in_CE ||= 638
115
- @origin_of_MSC ||= 0 # 638 + 543
116
- @origin_of_LSC ||= 1954168
117
- @origin_of_MSC = @origin_of_MSC.to_i
118
- @origin_of_LSC = @origin_of_LSC.to_i
119
- @indices ||= Indices
120
- @rule_table ||= RuleTable
121
- super
122
- end
123
-
124
- # 年初の通日
125
- #
126
- # @param [Array<Numeric>] date ( 年 )
127
- #
128
- # @return [Integer] 年初の通日
129
- #
130
- def _sdn_(date)
131
- y = +date[0]
132
- e0 = _thai(y, 0)[0]
133
- e1 = _thai(y+1,0)[0]
134
- case e1['T']-e0['T']
135
- when 353,383 ; e0['T'] -= 1
136
- when 385 ; e0['T'] += 1
137
- end
138
- return @origin_of_LSC - 1 + e0['T'] - 30*3 - 29*2
139
- end
140
-
141
- # y で指定した年の平閏、8月の大小を判定します。
142
- #
143
- # @param [Integer] y 年
144
- # @param [Integer] dir 前後の閏状態を表すコード
145
- #
146
- # @return [Array<Hash, String>]
147
- #
148
- def _thai(y,dir)
149
- # 諸元の計算
150
- e = _eph(y)
151
- k = 800*125 - e['H'][1]
152
- t = e['M'][1]
153
-
154
- # Jyaistha 大の判定
155
- b = ((e['A'][1]<126) && (k<=207*125)) || ((e['A'][1]<137) && (k> 207*125))
156
-
157
- # 閏年の判定
158
- c = ((t<6) || (t>24))
159
- c = true if ((t==24) && (_thai(y+1,+1)[1]< 'C'))
160
- c = false if ((t==25) && (_thai(y+1,+1)[1]>='C'))
161
-
162
- # Caitra 月 0 日
163
- e['T'] = e['H'][0] - t
164
- e['T'] -= 1 if (t==0)
165
- e['T'] -= 29 if (c && (t<=6))
166
- e['b'] = b
167
- e['c'] = c
168
- e['t'] = t
169
- return e,' '
170
- end
171
- end
172
-
173
- #
174
- # The Calendar of Thai people in China (Calculation)
175
- #
176
- class ThaiC < ThaiP
177
-
178
- # オブジェクトの正規化
179
- # @private
180
- def _normalize(args=[], options={})
181
- super
182
- @thoreshold = (@mean_month * 13) % 1
183
- @eoch_new_moon = (@origin_of_LSC - 18.90409 + 12 * @mean_month / 19)
184
- end
185
-
186
- # 年初の通日
187
- #
188
- # @param [Array<Numeric>] date ( 年 )
189
- #
190
- # @return [Integer] 年初の通日
191
- #
192
- def _sdn_(date)
193
- year = +date[0]
194
- prev = _meton(year-1)
195
- this = _meton(year)
196
- this += 1 if this.floor - prev.floor > 360 && this % 1 > @thoreshold
197
- this.floor
198
- end
199
-
200
- private
201
-
202
- def _meton(year)
203
- (((year + 9) * 235 / 19) - 111) * @mean_month + @eoch_new_moon
204
- end
205
- end
206
-
207
- #
208
- # The Calendar of Thai people in China (Table based)
209
- #
210
- class ThaiT < CyclicTableBased
211
-
212
- include Lunar
213
- include Songkran
214
-
215
- Pattern = %w(
216
- B A C A C B A C A B C A A C B C A A C B A C A C B A C A A C
217
- B A C A C A B C A A C B C A A C B A C A C B A C A B C A A C
218
- B C A A C B A C A C B A C A B C A A C A C B A C A B C A A C
219
- A C B B C A A C A C A A C B A C A B C A C A B C A A C B C A
220
- A C B A C A A C B C A A C B A C A C B A C A A C B A C A C B
221
- A C A B C A C A B C A A C A B C A C A B C A A C B C A A C B
222
- A C A A C B C A A C B A C A C B A C A A C B A C A C B A C A)
223
-
224
- # オブジェクトの正規化
225
- # @private
226
- def _normalize(args=[], options={})
227
- @origin_of_LSC = 2393198
228
- @origin_of_MSC = 1202
229
- @epoch_in_CE = 1840
230
- @indices = ThaiP::Indices
231
- pattern = Pattern.dup
232
- if @patch
233
- @patch.scan(/\d+[ABC]/i) do |patch|
234
- pattern[patch[0..-2].to_i-@epoch_in_CE] = patch[-1..-1].upcase
235
- end
236
- end
237
- @rule_table = {
238
- 'T' => {'Rule' => pattern},
239
- 'A' => {'Rule' => [354]},
240
- 'B' => {'Rule' => [355]},
241
- 'C' => {'Rule' => [384]}}.merge(ThaiP::RuleTable)
242
- super
243
- end
244
- end
245
-
246
- #
247
- # The Calendar of central Thailand
248
- #
249
- class Thai < ThaiP
250
-
251
- # 年の朔閏パターン
252
- YEAR_TYPE = {'A'=>354, 'B'=>355, 'C'=>384, 'D'=>384, 'E'=>384}
253
-
254
- # 月の大小と閏
255
- _NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
256
- _LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8&,8*,8,8<,9,9<,10,10<,11,11<,12,12<'
257
- RuleTable = {
258
- 354 => {'Length'=>[15,14,15,15]*6, 'IDs' => _NormalIDs},
259
- 355 => {'Length'=>[15,14,15,15]*3 + [15]*4 + [15,14,15,15]*2, 'IDs' => _NormalIDs},
260
- 384 => {'Length'=>[15,14,15,15]*4 + [15]*2 + [15,14,15,15]*2, 'IDs' => _LeapIDs }
261
- }
262
-
263
- private
264
-
265
- # オブジェクトの正規化
266
- #
267
- def _normalize(args=[], options={})
268
- @rule_table ||= RuleTable
269
- super
270
- end
271
-
272
- # 年初の通日
273
- #
274
- # @param [Array<Numeric>] date ( 年 )
275
- #
276
- # @return [Integer] 年初の通日
277
- #
278
- def _sdn_(date)
279
- y = +date[0]
280
- e0,dir0 = _thai(y, 0)
281
- e1,dir1 = _thai(y+1,0)
282
- e0['T'] -= 1 if (e1['T'] - e0['T'] < YEAR_TYPE[dir0])
283
- return @origin_of_LSC + e0['T'] - 29*2 - 30*2
284
- end
285
-
286
- # y で指定した年の暦定数を返します。
287
- #
288
- # @param [Integer] y 年
289
- #
290
- # @return [Hash]
291
- #
292
- def _eph(y) # C
293
- h = (y*292207+373+800*1).divmod(800)
294
- # u = (h[0]+2611).divmod(3232)
295
- a = (h[0]*11+650).divmod(692)
296
- m = (h[0]+a[0]+0).divmod(30)
297
- h[1] *= 125
298
- return {'H'=>h, 'A'=>a, 'M'=>m}
299
- end
300
-
301
- # y で指定した年の平閏、8月の大小を判定します。
302
- #
303
- # @param [Integer] y 年
304
- # @param [Integer] dir 前後の閏状態を表すコード
305
- #
306
- # @return [Array<Hash, String>]
307
- #
308
- def _thai(y,dir)
309
- # 諸元の計算
310
- e,w = super(y,dir)
311
-
312
- # カレンダーのタイプ
313
- if (e['c'])
314
- if (!e['b'])
315
- return e,'C' # 普通の閏年
316
- elsif ((0<e['t']) && (e['t']<6))
317
- return e,'D' # 前年大の閏年
318
- else
319
- return e,'E' # 翌年大の閏年
320
- end
321
- else
322
- if (e['b'])
323
- return e,'B' # 大の平年
324
- elsif ((dir != -1) && (_thai(y+1,+1)[1]=='D'))
325
- return e,'B' # 大の平年
326
- elsif ((dir != +1) && (_thai(y-1,-1)[1]=='E'))
327
- return e,'B' # 大の平年
328
- else
329
- return e,'A' # 小の平年
330
- end
331
- end
332
- end
333
- end
334
- end
335
- 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
+ class BasicTypes::M17n
10
+
11
+ Thai = [self, [
12
+ "locale:[=en:, ja=ja:, alias]",
13
+ "names:[Thai=]",
14
+ "[ThaiLuniSolar=en:Thai_lunar_calendar, タイ太陰太陽暦=ja:%%<チャントラカティ>]",
15
+
16
+ [self,
17
+ "names:[IntercalaryMonth=en:Intercalation, 閏月]",
18
+ "[%s Śuklapakṣa=, %s 白分=, _IAST_]",
19
+ "[%s Kṛṣṇapakṣa=, %s 黒分=, _IAST_]",
20
+ "[adhika %s Śuklapakṣa=, 閏%s 白分=, _IAST_]",
21
+ "[adhika %s Kṛṣṇapakṣa=, 閏%s 黒分=, _IAST_]"
22
+ ],
23
+
24
+ [self,
25
+ "names:[LunarMonth=, 太陰月=ja:%%<月_(暦)>]",
26
+ "[Mārgaśīra=en:Margashirsha, マールガシールシャ=, _IAST_]",
27
+ "[Pauṣa=en:Pausha, パウシャ=, _IAST_]",
28
+ "[Māgha=en:Maagha, マーガ=, _IAST_]",
29
+ "[Phālguna=en:Phalguna, パールグナ=, _IAST_]",
30
+ "[Caitra=en:Chaitra, チャイトラ=, _IAST_]",
31
+ "[Vaiśākha=en:Vaisakha, ヴァイシャーカ=, _IAST_]",
32
+ "[Jyaiṣṭha=en:Jyeshta, ジャイシュタ=, _IAST_]",
33
+ "[Āṣāḍha=en:Aashaadha, アーシャーダ=, _IAST_]",
34
+ "[Śrāvaṇa=en:Shraavana, シュラーヴァナ=, _IAST_]",
35
+ "[Bhādrapada=en:Bhadrapada, バードラパダ=, _IAST_]",
36
+ "[Āśvina=en:Ashwin, アーシュヴィナ=, _IAST_]",
37
+ "[Kārttika=en:Kartika_(month), カールッティカ=, _IAST_]"
38
+ ]
39
+ ]]
40
+ end
41
+
42
+ module CalendarTypes
43
+
44
+ #
45
+ # ソンクラーンとタイ暦の暦定数
46
+ #
47
+ module Songkran
48
+
49
+ # ソンクラーン - 太陽の白羊宮入り
50
+ #
51
+ # @param [Integer] y 年
52
+ #
53
+ # @return [Integer] ソンクラーンのユリウス日
54
+ #
55
+ def songkran_(y)
56
+ e = _eph(y)
57
+ return @origin_of_LSC - 1 + e['H'][0]
58
+ end
59
+
60
+ # y で指定した年の暦定数を返します。
61
+ #
62
+ # @param [Integer] y 年
63
+ #
64
+ # @return [Hash]
65
+ #
66
+ def _eph(y) # C
67
+ h = (y+4).divmod(9)[0] # y
68
+ h = (y-h).divmod(3)[0] # z
69
+ h = (y+1-h).divmod(2)[0] # r (2 => h?)
70
+ h = (36525876*y+149049-h).divmod(100000) # s
71
+ a = (h[0]*11+633-((h[0]+7368).divmod(8878))[0]).divmod(692)
72
+ m = (h[0]+a[0]+0).divmod(30)
73
+ return {'H'=>h, 'A'=>a, 'M'=>m}
74
+ end
75
+ end
76
+
77
+ #
78
+ # The Calendar of Thai (Prototype)
79
+ #
80
+ class ThaiP < TableBased
81
+
82
+ include Lunar
83
+ include Songkran
84
+
85
+ # 月番号
86
+ _intercalary_month = When.Resource('_m:Thai::IntercalaryMonth::*')
87
+ Indices = [
88
+ When.Index('Thai::LunarMonth', {:branch=>{0 => _intercalary_month[0],
89
+ 0.5 => _intercalary_month[1],
90
+ -1.5 => _intercalary_month[2],
91
+ -1 => _intercalary_month[3]}}),
92
+ When::Coordinates::DefaultDayIndex
93
+ ]
94
+
95
+ # 月の大小と閏
96
+ _NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
97
+ _LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9&,9*,9,9<,10,10<,11,11<,12,12<'
98
+ RuleTable = {
99
+ 354 => {'Length'=>[15,15,15,14]*6, 'IDs' => _NormalIDs},
100
+ 355 => {'Length'=>[15,15,15,14]*3 + [15]*4 + [15,15,15,14]*2, 'IDs' => _NormalIDs},
101
+ 384 => {'Length'=>[15,15,15,14]*4 + [15]*2 + [15,15,15,14]*2, 'IDs' => _LeapIDs}
102
+ }
103
+
104
+ private
105
+
106
+ # オブジェクトの正規化
107
+ # @private
108
+ def _normalize(args=[], options={})
109
+ @label ||= 'Thai::ThaiLuniSolar'
110
+
111
+ Rational
112
+ @mean_month ||= 29 + Rational( 373, 703)
113
+ @mean_year ||= 365 + Rational(25876, 100000)
114
+ @epoch_in_CE ||= 638
115
+ @origin_of_MSC ||= 0 # 638 + 543
116
+ @origin_of_LSC ||= 1954168
117
+ @origin_of_MSC = @origin_of_MSC.to_i
118
+ @origin_of_LSC = @origin_of_LSC.to_i
119
+ @indices ||= Indices
120
+ @rule_table ||= RuleTable
121
+ super
122
+ end
123
+
124
+ # 年初の通日
125
+ #
126
+ # @param [Array<Numeric>] date ( 年 )
127
+ #
128
+ # @return [Integer] 年初の通日
129
+ #
130
+ def _sdn_(date)
131
+ y = +date[0]
132
+ e0 = _thai(y, 0)[0]
133
+ e1 = _thai(y+1,0)[0]
134
+ case e1['T']-e0['T']
135
+ when 353,383 ; e0['T'] -= 1
136
+ when 385 ; e0['T'] += 1
137
+ end
138
+ return @origin_of_LSC - 1 + e0['T'] - 30*3 - 29*2
139
+ end
140
+
141
+ # y で指定した年の平閏、8月の大小を判定します。
142
+ #
143
+ # @param [Integer] y 年
144
+ # @param [Integer] dir 前後の閏状態を表すコード
145
+ #
146
+ # @return [Array<Hash, String>]
147
+ #
148
+ def _thai(y,dir)
149
+ # 諸元の計算
150
+ e = _eph(y)
151
+ k = 800*125 - e['H'][1]
152
+ t = e['M'][1]
153
+
154
+ # Jyaistha 大の判定
155
+ b = ((e['A'][1]<126) && (k<=207*125)) || ((e['A'][1]<137) && (k> 207*125))
156
+
157
+ # 閏年の判定
158
+ c = ((t<6) || (t>24))
159
+ c = true if ((t==24) && (_thai(y+1,+1)[1]< 'C'))
160
+ c = false if ((t==25) && (_thai(y+1,+1)[1]>='C'))
161
+
162
+ # Caitra 月 0 日
163
+ e['T'] = e['H'][0] - t
164
+ e['T'] -= 1 if (t==0)
165
+ e['T'] -= 29 if (c && (t<=6))
166
+ e['b'] = b
167
+ e['c'] = c
168
+ e['t'] = t
169
+ return e,' '
170
+ end
171
+ end
172
+
173
+ #
174
+ # The Calendar of Thai people in China (Calculation)
175
+ #
176
+ class ThaiC < ThaiP
177
+
178
+ # オブジェクトの正規化
179
+ # @private
180
+ def _normalize(args=[], options={})
181
+ super
182
+ @thoreshold = (@mean_month * 13) % 1
183
+ @epoch_new_moon = (@origin_of_LSC - 18.90409 + 12 * @mean_month / 19)
184
+ end
185
+
186
+ # 年初の通日
187
+ #
188
+ # @param [Array<Numeric>] date ( 年 )
189
+ #
190
+ # @return [Integer] 年初の通日
191
+ #
192
+ def _sdn_(date)
193
+ year = +date[0]
194
+ prev = _meton(year-1)
195
+ this = _meton(year)
196
+ this += 1 if this.floor - prev.floor > 360 && this % 1 > @thoreshold
197
+ this.floor - 148
198
+ end
199
+
200
+ private
201
+
202
+ def _meton(year)
203
+ (((year + 9) * 235 / 19) - 111) * @mean_month + @epoch_new_moon
204
+ end
205
+ end
206
+
207
+ #
208
+ # The Calendar of Thai people in China CE1840..2049 (Table based)
209
+ #
210
+ class ThaiT < CyclicTableBased
211
+
212
+ include Lunar
213
+ include Songkran
214
+
215
+ Pattern = %w(C
216
+ B A C A C B A C A B C A A C B C A A C B A C A C B A C A A C
217
+ B A C A C A B C A A C B C A A C B A C A C B A C A B C A A C
218
+ B C A A C B A C A C B A C A B C A A C A C B A C A B C A A C
219
+ A C B B C A A C A C A A C B A C A B C A C A B C A A C B C A
220
+ A C B A C A A C B C A A C B A C A C B A C A A C B A C A C B
221
+ A C A B C A C A B C A A C A B C A C A B C A A C B C A A C B
222
+ A C A A C B C A A C B A C A C B A C A A C B A C A C B A C A)
223
+
224
+ # オブジェクトの正規化
225
+ # @private
226
+ def _normalize(args=[], options={})
227
+ @origin_of_LSC ||= 2392666
228
+ @origin_of_MSC ||= 1201
229
+ @epoch_in_CE ||= 1839
230
+ @before = @after = 'ThaiC'
231
+ @indices ||= ThaiP::Indices
232
+ pattern ||= Pattern.dup
233
+ if @patch
234
+ @patch.scan(/(\d+)([ABC])/i) do |year,type|
235
+ pattern[year.to_i-@epoch_in_CE] = type.upcase
236
+ end
237
+ end
238
+ @rule_table = {
239
+ 'T' => {'Rule' => pattern},
240
+ 'A' => {'Rule' => [354]},
241
+ 'B' => {'Rule' => [355]},
242
+ 'C' => {'Rule' => [384]}}.merge(ThaiP::RuleTable)
243
+ super
244
+ end
245
+ end
246
+
247
+ #
248
+ # The Calendar of central Thailand
249
+ #
250
+ class Thai < ThaiP
251
+
252
+ # 年の朔閏パターン
253
+ YEAR_TYPE = {'A'=>354, 'B'=>355, 'C'=>384, 'D'=>384, 'E'=>384}
254
+
255
+ # 月の大小と閏
256
+ _NormalIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<,10,10<,11,11<,12,12<'
257
+ _LeapIDs = '1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8&,8*,8,8<,9,9<,10,10<,11,11<,12,12<'
258
+ RuleTable = {
259
+ 354 => {'Length'=>[15,14,15,15]*6, 'IDs' => _NormalIDs},
260
+ 355 => {'Length'=>[15,14,15,15]*3 + [15]*4 + [15,14,15,15]*2, 'IDs' => _NormalIDs},
261
+ 384 => {'Length'=>[15,14,15,15]*4 + [15]*2 + [15,14,15,15]*2, 'IDs' => _LeapIDs }
262
+ }
263
+
264
+ private
265
+
266
+ # オブジェクトの正規化
267
+ #
268
+ def _normalize(args=[], options={})
269
+ @rule_table ||= RuleTable
270
+ super
271
+ end
272
+
273
+ # 年初の通日
274
+ #
275
+ # @param [Array<Numeric>] date ( 年 )
276
+ #
277
+ # @return [Integer] 年初の通日
278
+ #
279
+ def _sdn_(date)
280
+ y = +date[0]
281
+ e0,dir0 = _thai(y, 0)
282
+ e1,dir1 = _thai(y+1,0)
283
+ e0['T'] -= 1 if (e1['T'] - e0['T'] < YEAR_TYPE[dir0])
284
+ return @origin_of_LSC + e0['T'] - 29*2 - 30*2
285
+ end
286
+
287
+ # y で指定した年の暦定数を返します。
288
+ #
289
+ # @param [Integer] y 年
290
+ #
291
+ # @return [Hash]
292
+ #
293
+ def _eph(y) # C
294
+ h = (y*292207+373+800*1).divmod(800)
295
+ # u = (h[0]+2611).divmod(3232)
296
+ a = (h[0]*11+650).divmod(692)
297
+ m = (h[0]+a[0]+0).divmod(30)
298
+ h[1] *= 125
299
+ return {'H'=>h, 'A'=>a, 'M'=>m}
300
+ end
301
+
302
+ # y で指定した年の平閏、8月の大小を判定します。
303
+ #
304
+ # @param [Integer] y 年
305
+ # @param [Integer] dir 前後の閏状態を表すコード
306
+ #
307
+ # @return [Array<Hash, String>]
308
+ #
309
+ def _thai(y,dir)
310
+ # 諸元の計算
311
+ e,w = super(y,dir)
312
+
313
+ # カレンダーのタイプ
314
+ if (e['c'])
315
+ if (!e['b'])
316
+ return e,'C' # 普通の閏年
317
+ elsif ((0<e['t']) && (e['t']<6))
318
+ return e,'D' # 前年大の閏年
319
+ else
320
+ return e,'E' # 翌年大の閏年
321
+ end
322
+ else
323
+ if (e['b'])
324
+ return e,'B' # 大の平年
325
+ elsif ((dir != -1) && (_thai(y+1,+1)[1]=='D'))
326
+ return e,'B' # 大の平年
327
+ elsif ((dir != +1) && (_thai(y-1,-1)[1]=='E'))
328
+ return e,'B' # 大の平年
329
+ else
330
+ return e,'A' # 小の平年
331
+ end
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end