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