when_exe 0.2.100 → 0.3.1

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 (193) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/irb.rc +5 -0
  4. data/bin/locales.rb +2 -2
  5. data/bin/when.rb +16 -0
  6. data/bin/when.rb.config +7 -0
  7. data/lib/when_exe.rb +616 -14
  8. data/lib/when_exe/basictypes.rb +615 -0
  9. data/lib/when_exe/calendartypes.rb +1700 -0
  10. data/lib/when_exe/coordinates.rb +1936 -0
  11. data/lib/when_exe/core/compatibility.rb +54 -0
  12. data/lib/when_exe/core/duration.rb +72 -72
  13. data/lib/when_exe/core/extension.rb +382 -0
  14. data/lib/when_exe/ephemeris.rb +1845 -0
  15. data/lib/when_exe/googlecalendar.rb +140 -0
  16. data/lib/when_exe/icalendar.rb +1587 -0
  17. data/lib/when_exe/inspect.rb +1237 -0
  18. data/lib/when_exe/locales/af.rb +90 -0
  19. data/lib/when_exe/locales/ar.rb +145 -0
  20. data/lib/when_exe/locales/az.rb +90 -0
  21. data/lib/when_exe/locales/bg.rb +90 -0
  22. data/lib/when_exe/locales/bn.rb +94 -0
  23. data/lib/when_exe/locales/bs.rb +121 -0
  24. data/lib/when_exe/locales/ca.rb +92 -0
  25. data/lib/when_exe/locales/cs.rb +107 -0
  26. data/lib/when_exe/locales/cy.rb +150 -0
  27. data/lib/when_exe/locales/da.rb +84 -0
  28. data/lib/when_exe/locales/de.rb +92 -0
  29. data/lib/when_exe/locales/de_AT.rb +92 -0
  30. data/lib/when_exe/locales/de_CH.rb +92 -0
  31. data/lib/when_exe/locales/el.rb +93 -0
  32. data/lib/when_exe/locales/en.rb +88 -0
  33. data/lib/when_exe/locales/en_AU.rb +88 -0
  34. data/lib/when_exe/locales/en_CA.rb +88 -0
  35. data/lib/when_exe/locales/en_GB.rb +88 -0
  36. data/lib/when_exe/locales/en_IN.rb +88 -0
  37. data/lib/when_exe/locales/en_NZ.rb +88 -0
  38. data/lib/when_exe/locales/eo.rb +89 -0
  39. data/lib/when_exe/locales/es.rb +84 -0
  40. data/lib/when_exe/locales/es_419.rb +84 -0
  41. data/lib/when_exe/locales/es_AR.rb +84 -0
  42. data/lib/when_exe/locales/es_CL.rb +84 -0
  43. data/lib/when_exe/locales/es_CO.rb +84 -0
  44. data/lib/when_exe/locales/es_MX.rb +84 -0
  45. data/lib/when_exe/locales/es_PE.rb +85 -0
  46. data/lib/when_exe/locales/es_VE.rb +84 -0
  47. data/lib/when_exe/locales/et.rb +94 -0
  48. data/lib/when_exe/locales/eu.rb +95 -0
  49. data/lib/when_exe/locales/fa.rb +80 -0
  50. data/lib/when_exe/locales/fi.rb +89 -0
  51. data/lib/when_exe/locales/fr.rb +88 -0
  52. data/lib/when_exe/locales/fr_CA.rb +88 -0
  53. data/lib/when_exe/locales/fr_CH.rb +88 -0
  54. data/lib/when_exe/locales/gl.rb +81 -0
  55. data/lib/when_exe/locales/he.rb +84 -0
  56. data/lib/when_exe/locales/hi.rb +80 -0
  57. data/lib/when_exe/locales/hi_IN.rb +84 -0
  58. data/lib/when_exe/locales/hr.rb +128 -0
  59. data/lib/when_exe/locales/hu.rb +84 -0
  60. data/lib/when_exe/locales/id.rb +89 -0
  61. data/lib/when_exe/locales/is.rb +89 -0
  62. data/lib/when_exe/locales/it.rb +87 -0
  63. data/lib/when_exe/locales/it_CH.rb +87 -0
  64. data/lib/when_exe/locales/ja.rb +78 -0
  65. data/lib/when_exe/locales/kn.rb +86 -0
  66. data/lib/when_exe/locales/ko.rb +78 -0
  67. data/lib/when_exe/locales/links.rb +2342 -0
  68. data/lib/when_exe/locales/lo.rb +123 -0
  69. data/lib/when_exe/locales/locales.rb +91 -0
  70. data/lib/when_exe/locales/lt.rb +111 -0
  71. data/lib/when_exe/locales/lv.rb +118 -0
  72. data/lib/when_exe/locales/mk.rb +93 -0
  73. data/lib/when_exe/locales/mn.rb +80 -0
  74. data/lib/when_exe/locales/nb.rb +81 -0
  75. data/lib/when_exe/locales/ne.rb +81 -0
  76. data/lib/when_exe/locales/nl.rb +92 -0
  77. data/lib/when_exe/locales/nn.rb +73 -0
  78. data/lib/when_exe/locales/or.rb +84 -0
  79. data/lib/when_exe/locales/pl.rb +128 -0
  80. data/lib/when_exe/locales/pt.rb +88 -0
  81. data/lib/when_exe/locales/pt_BR.rb +88 -0
  82. data/lib/when_exe/locales/rm.rb +143 -0
  83. data/lib/when_exe/locales/ro.rb +105 -0
  84. data/lib/when_exe/locales/ru.rb +128 -0
  85. data/lib/when_exe/locales/sk.rb +109 -0
  86. data/lib/when_exe/locales/sl.rb +122 -0
  87. data/lib/when_exe/locales/sr.rb +122 -0
  88. data/lib/when_exe/locales/sv.rb +83 -0
  89. data/lib/when_exe/locales/sw.rb +89 -0
  90. data/lib/when_exe/locales/th.rb +78 -0
  91. data/lib/when_exe/locales/tl.rb +99 -0
  92. data/lib/when_exe/locales/tr.rb +96 -0
  93. data/lib/when_exe/locales/uk.rb +128 -0
  94. data/lib/when_exe/locales/uz.rb +128 -0
  95. data/lib/when_exe/locales/vi.rb +94 -0
  96. data/lib/when_exe/locales/wo.rb +82 -0
  97. data/lib/when_exe/locales/zh_CN.rb +77 -0
  98. data/lib/when_exe/locales/zh_HK.rb +77 -0
  99. data/lib/when_exe/locales/zh_TW.rb +77 -0
  100. data/lib/when_exe/mini_application.rb +252 -0
  101. data/lib/when_exe/parts/enumerator.rb +472 -0
  102. data/lib/when_exe/parts/geometric_complex.rb +379 -0
  103. data/lib/when_exe/parts/locale.rb +513 -0
  104. data/lib/when_exe/parts/method_cash.rb +207 -0
  105. data/lib/when_exe/parts/resource.rb +806 -0
  106. data/lib/when_exe/parts/timezone.rb +182 -0
  107. data/lib/when_exe/region/bahai.rb +145 -0
  108. data/lib/when_exe/region/balinese.rb +627 -0
  109. data/lib/when_exe/region/chinese.rb +896 -0
  110. data/lib/when_exe/region/chinese_calendar.rb +919 -0
  111. data/lib/when_exe/region/chinese_epoch.rb +1245 -0
  112. data/lib/when_exe/region/christian.rb +644 -0
  113. data/lib/when_exe/region/far_east.rb +192 -0
  114. data/lib/when_exe/region/french.rb +66 -0
  115. data/lib/when_exe/region/geologicalage.rb +639 -0
  116. data/lib/when_exe/region/indian.rb +1066 -0
  117. data/lib/when_exe/region/iranian.rb +66 -0
  118. data/lib/when_exe/region/islamic.rb +105 -0
  119. data/lib/when_exe/region/japanese.rb +851 -0
  120. data/lib/when_exe/region/japanese_notes.rb +964 -0
  121. data/lib/when_exe/region/japanese_residues.rb +1149 -0
  122. data/lib/when_exe/region/javanese.rb +228 -0
  123. data/lib/when_exe/region/jewish.rb +127 -0
  124. data/lib/when_exe/region/korean.rb +267 -0
  125. data/lib/when_exe/region/m17n.rb +115 -0
  126. data/lib/when_exe/region/martian.rb +215 -0
  127. data/lib/when_exe/region/mayan.rb +122 -0
  128. data/lib/when_exe/region/moon.rb +333 -0
  129. data/lib/when_exe/region/nihon_shoki.rb +73 -0
  130. data/lib/when_exe/region/planets.rb +585 -0
  131. data/lib/when_exe/region/pope.rb +298 -0
  132. data/lib/when_exe/region/residue.rb +229 -0
  133. data/lib/when_exe/region/roman.rb +325 -0
  134. data/lib/when_exe/region/ryukyu.rb +98 -0
  135. data/lib/when_exe/region/shire.rb +254 -0
  136. data/lib/when_exe/region/sun.rb +210 -0
  137. data/lib/when_exe/region/thai.rb +227 -0
  138. data/lib/when_exe/region/tibetan.rb +233 -0
  139. data/lib/when_exe/region/v50.rb +111 -0
  140. data/lib/when_exe/region/vietnamese.rb +173 -0
  141. data/lib/when_exe/region/world.rb +197 -0
  142. data/lib/when_exe/timestandard.rb +547 -0
  143. data/lib/when_exe/tmduration.rb +330 -330
  144. data/lib/when_exe/tmobjects.rb +1295 -0
  145. data/lib/when_exe/tmposition.rb +1955 -0
  146. data/lib/when_exe/tmreference.rb +1547 -0
  147. data/lib/when_exe/version.rb +10 -3
  148. data/link_to_online_documents +4 -0
  149. data/test/examples/JapanHolidays.ics +456 -0
  150. data/test/examples/Millennium.ics +17 -0
  151. data/test/examples/NewYork.ics +61 -0
  152. data/test/examples/Residue.m17n +135 -0
  153. data/test/examples/Spatial.m17n +179 -0
  154. data/test/examples/Terms.m17n +39 -0
  155. data/test/examples/Test.ics +53 -0
  156. data/test/examples/USA-DST.ics +61 -0
  157. data/test/examples/geometric_complex.rb +41 -0
  158. data/test/examples/sample.xml +14 -0
  159. data/test/examples/today.rb +61 -0
  160. data/test/test.rb +54 -19
  161. data/test/test.rb.config +1 -0
  162. data/test/test/basictypes.rb +368 -0
  163. data/test/test/calendartypes.rb +57 -0
  164. data/test/test/coordinates.rb +380 -0
  165. data/test/test/ephemeris.rb +127 -0
  166. data/test/test/googlecalendar.rb +167 -0
  167. data/test/test/icalendar.rb +848 -0
  168. data/test/test/inspect.rb +115 -0
  169. data/test/test/parts.rb +480 -0
  170. data/test/test/region/chinese.rb +161 -0
  171. data/test/test/region/french.rb +33 -0
  172. data/test/test/region/geologicalage.rb +14 -0
  173. data/test/test/region/indian.rb +55 -0
  174. data/test/test/region/iran.rb +54 -0
  175. data/test/test/region/islamic.rb +18 -0
  176. data/test/test/region/japanese.rb +62 -0
  177. data/test/test/region/jewish.rb +61 -0
  178. data/test/test/region/m17n.rb +181 -0
  179. data/test/test/region/mayan.rb +78 -0
  180. data/test/test/region/moon.rb +14 -0
  181. data/test/test/region/planets.rb +14 -0
  182. data/test/test/region/residue.rb +123 -0
  183. data/test/test/region/sun.rb +14 -0
  184. data/test/test/region/thai.rb +94 -0
  185. data/test/test/region/tibetan.rb +30 -0
  186. data/test/test/tmobjects.rb +356 -57
  187. data/test/test/tmposition.rb +237 -0
  188. data/test/test/tmreference.rb +95 -0
  189. data/when_exe.gemspec +2 -2
  190. metadata +187 -7
  191. data/doc/COPYING +0 -31
  192. data/doc/COPYING.ja +0 -25
  193. data/doc/document_url +0 -1
@@ -0,0 +1,182 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2013 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
+ #
9
+ # 本ライブラリのための諸々の部品
10
+ #
11
+ module When::Parts
12
+
13
+ #
14
+ # TZInfo::Timezone クラスを本ライブラリから使用するためのラッパークラス
15
+ #
16
+ class Timezone
17
+
18
+ class << self
19
+ include Resource::Pool
20
+
21
+ # @private
22
+ alias :_get :[]
23
+
24
+ # オブジェクト参照
25
+ #
26
+ # @param [String] label 識別名 ( "America/New_York" など)
27
+ #
28
+ # @return [When::Parts::Timezone] 時間帯オブジェクト
29
+ #
30
+ def [](label)
31
+ ref = _get(label)
32
+ return ref if ref
33
+ self[label] = self.new(label)
34
+ end
35
+ alias :get :[]
36
+
37
+ # TZInfo でサポートしている Timezone の連想配列
38
+ #
39
+ # @return [Hash] { String => TZInfo::CountryTimezone }
40
+ # [ String - 時間帯ID ]
41
+ # [ TZInfo::CountryTimezone - 時間帯オブジェクト(proxy for autoload) ]
42
+ #
43
+ def tz_info
44
+ zones = {}
45
+ TZInfo::Country.all.each do |c|
46
+ c.zone_info.each do |z|
47
+ zones[z.identifier] ||= {}
48
+ zones[z.identifier][c.code] = z
49
+ end
50
+ end
51
+
52
+ list = {}
53
+ zones.each_pair do |id, hash|
54
+ if hash.keys.size == 1
55
+ list[id] = hash[hash.keys[0]]
56
+ else
57
+ hash.each_pair do |c, z|
58
+ list["#{id}(#{c})"] = z
59
+ end
60
+ end
61
+ end
62
+ list
63
+ end
64
+ end
65
+
66
+ # ラップしている TZInfo::Timezone インスタンス
67
+ # @return [TZInfo::Timezone]
68
+ attr_reader :timezone
69
+
70
+ # 標準時間帯の時計
71
+ # @return [When::TM::Clock]
72
+ attr_reader :standard
73
+
74
+ # 夏時間帯の時計
75
+ # @return [When::TM::Clock]
76
+ attr_reader :daylight
77
+
78
+ # 夏時間帯と標準時間帯の時間差
79
+ # @return [When::TM:IntervalLength]
80
+ attr_reader :difference
81
+
82
+ # ユニーク識別名
83
+ # @return [String]
84
+ def label
85
+ @timezone.identifier
86
+ end
87
+
88
+ # 時分秒のインデクス
89
+ # @return [Array<When::Coordinates::Index>]
90
+ attr_reader :indices
91
+
92
+ # オブジェクト生成
93
+ #
94
+ # @param [String] identifier 識別名 ( "America/New_York" など)
95
+ #
96
+ def initialize(identifier)
97
+ @timezone = TZInfo::Timezone.get(identifier)
98
+ unless TZInfo::TimeOrDateTime.method_defined?(:_to_datetime)
99
+ if TZInfo::RubyCoreSupport.respond_to?(:datetime_new)
100
+ TZInfo::TimeOrDateTime.class_eval %Q{
101
+ alias :_to_datetime :to_datetime
102
+ ::Rational
103
+ def to_datetime
104
+ unless @datetime
105
+ u = usec
106
+ s = u == 0 ? sec : Rational(sec * 1000000 + u, 1000000)
107
+ @datetime = TZInfo::RubyCoreSupport.datetime_new(year, mon, mday, hour, min, s, 0, Date::GREGORIAN)
108
+ end
109
+ @datetime
110
+ end
111
+ }
112
+ else
113
+ TZInfo::TimeOrDateTime.class_eval %Q{
114
+ alias :_to_datetime :to_datetime
115
+ def to_datetime
116
+ @datetime ||= DateTime.new(year, mon, mday, hour, min, sec, 0, Date::GREGORIAN)
117
+ end
118
+ }
119
+ end
120
+ end
121
+ std, dst = _offsets(Time.now.to_i)
122
+ @standard = When::TM::Clock.new({:zone=>std, :tz_prop=>self})
123
+ if std == dst
124
+ @daylight = @standard
125
+ @difference = 0
126
+ else
127
+ @daylight = When::TM::Clock.new({:zone=>dst, :tz_prop=>self})
128
+ @difference = @standard.universal_time - @daylight.universal_time
129
+ end
130
+ @indices = When::Coordinates::DefaultTimeIndex
131
+ end
132
+
133
+ # @private
134
+ def _daylight(zdate=nil)
135
+ if block_given?
136
+ zdate = yield(@standard.dup.tap{|clock| clock.tz_prop = nil})
137
+ now = zdate.to_time.to_i
138
+ clocks = _offsets(now).map {|clock| When::TM::Clock.new({:zone=>clock, :tz_prop=>self})}
139
+ flags = clocks.map {|z| @timezone.period_for_utc(yield(z.dup.tap{|clock| clock.tz_prop = nil}).to_time.to_i).dst? }
140
+ return nil if flags[0] && !flags[1]
141
+ (flags[0] || flags[1]) ? clocks[1] : clocks[0]
142
+ else
143
+ now = zdate.to_time.to_i
144
+ period = @timezone.period_for_utc(now)
145
+ unless period.dst?
146
+ offset = _offsets(now)
147
+ period = @timezone.period_for_utc(now-(offset[1]-offset[0]))
148
+ end
149
+ When::TM::Clock.new({:zone=>period.utc_total_offset, :tz_prop=>self})
150
+ end
151
+ end
152
+
153
+ # @private
154
+ def _need_validate
155
+ true
156
+ end
157
+
158
+ private
159
+
160
+ def _offsets(time)
161
+ now = @timezone.period_for_utc(time)
162
+ past = @timezone.period_for_utc(now.utc_start-1) if now.utc_start
163
+ future = @timezone.period_for_utc(now.utc_end) if now.utc_end
164
+ std = now.utc_offset
165
+ dst = now.utc_total_offset
166
+ [past, future].each do |period|
167
+ next unless period
168
+ std = period.utc_offset if std > period.utc_offset
169
+ dst = period.utc_total_offset if dst < period.utc_total_offset
170
+ end
171
+ [std, dst]
172
+ end
173
+
174
+ # その他のメソッド
175
+ # When::Parts::GeometricComplex で定義されていないメソッドは
176
+ # 処理を first (type: When::TM::(Temporal)Position) に委譲する
177
+ #
178
+ def method_missing(name, *args, &block)
179
+ timezone.send(name.to_sym, *args, &block)
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,145 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2013 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
+ BahaiTerms = [self, [
12
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/, ar=http://ar.wikipedia.org/wiki/]",
13
+ "locale:[=en:, ar=ar:, alias=en:]",
14
+ "names:[BahaiTerms]",
15
+ "[Bahai=en:Bah%C3%A1%27%C3%AD_calendar, ja:バハーイー暦=ja:%E3%83%90%E3%83%8F%E3%83%BC%E3%82%A4%E3%83%BC%E6%95%99]",
16
+
17
+ [self,
18
+ "names:[Month, 月=ja:%E6%9C%88_(%E6%9A%A6)]",
19
+ "[Bahá=, بهاء=, Splendour= ]", # 1
20
+ "[Jalál=, جلال=, Glory= ]", # 2
21
+ "[Jamál=, جمال=, Beauty= ]", # 3
22
+ "[‘Aẓamat=, عظمة=, Grandeur= ]", # 4
23
+ "[Núr=, نور=, Light= ]", # 5
24
+ "[Raḥmat=, رحمة=, Mercy= ]", # 6
25
+ "[Kalimát=, كلمات=, Words= ]", # 7
26
+ "[Kamál=, كمال=, Perfection= ]", # 8
27
+ "[Asmá’=, اسماء=, Names= ]", # 9
28
+ "[‘Izzat=, عزة=, Might= ]", # 10
29
+ "[Mashíyyat=, عزة=, Will= ]", # 11
30
+ "[‘Ilm=, علم=, Knowledge= ]", # 12
31
+ "[Qudrat=, قدرة=, Power= ]", # 13
32
+ "[Qawl=, قول=, Speech= ]", # 14
33
+ "[Masá’il=, مسائل=, Questions= ]", # 15
34
+ "[Sharaf=, شرف=, Honour= ]", # 16
35
+ "[Sulṭán=, سلطان=, Sovereignty=]", # 17
36
+ "[Mulk=, ملك=, Dominion= ]", # 18
37
+ "[‘Alá’=, علاء=, Loftiness= ]", # 19
38
+ "[%0sAyyám-i-Há=en:Ayy%C3%A1m-i-H%C3%A1, %0sايام الهاء=, %0sThe Days of Há=]" # Intercalary days
39
+ ]
40
+ ]]
41
+ end
42
+
43
+ module Coordinates
44
+
45
+ # Bahai years
46
+ Bahai = [When::BasicTypes::M17n, [
47
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/, ar=http://ar.wikipedia.org/wiki/]",
48
+ "locale:[=en:, ar=ar:, alias=en:]",
49
+ "names:[Bahai]",
50
+
51
+ [Residue,
52
+ "label:[YearName]", "divisor:19", "year:1",
53
+ [Residue, "label:[Alif=, ألف=, A= ]", "remainder: 0"],
54
+ [Residue, "label:[Bá=, باء=, B= ]", "remainder: 1"],
55
+ [Residue, "label:[Ab=, أب=, Father= ]", "remainder: 2"],
56
+ [Residue, "label:[Dál=, دﺍﻝ=, D= ]", "remainder: 3"],
57
+ [Residue, "label:[Báb=, باب=, Gate= ]", "remainder: 4"],
58
+ [Residue, "label:[Váv=, وﺍو=, V= ]", "remainder: 5"],
59
+ [Residue, "label:[Abad=, أبد=, Eternity= ]", "remainder: 6"],
60
+ [Residue, "label:[Jád=, جاد=, Generosity= ]", "remainder: 7"],
61
+ [Residue, "label:[Bahá'=, بهاء=, Splendour= ]", "remainder: 8"],
62
+ [Residue, "label:[Ḥubb=, حب=, Love= ]", "remainder: 9"],
63
+ [Residue, "label:[Bahháj=, بهاج=, Delightful= ]", "remainder: 10"],
64
+ [Residue, "label:[Javáb=, جواب=, Answer= ]", "remainder: 11"],
65
+ [Residue, "label:[Aḥad=, احد=, Single= ]", "remainder: 12"],
66
+ [Residue, "label:[Vahháb=, بهاء=, Bountiful= ]", "remainder: 13"],
67
+ [Residue, "label:[Vidád=, وداد=, Affection= ]", "remainder: 14"],
68
+ [Residue, "label:[Badí‘=, بدیع=, Beginning= ]", "remainder: 15"],
69
+ [Residue, "label:[Bahí=, بهي=, Luminous= ]", "remainder: 16"],
70
+ [Residue, "label:[Abhá=, ابهى=, Most Luminous=]", "remainder: 17"],
71
+ [Residue, "label:[Váḥid=, واحد=, Unity= ]", "remainder: 18"]
72
+ ]
73
+ ]]
74
+ end
75
+
76
+ module CalendarTypes
77
+
78
+ #
79
+ # Bahá'í Calendar
80
+ #
81
+ class Bahai < TableBased
82
+
83
+ # 年初の通日 - グレゴリオ暦の3月21日を春分とする
84
+ #
85
+ # @param [Array<Numeric>] date ( 年 )
86
+ #
87
+ # @return [Numeric] 年初の通日
88
+ #
89
+ def gregorian_equinox(date)
90
+ @engine._coordinates_to_number(+date[0], 2, 20)
91
+ end
92
+
93
+ # 年初の通日 - 太陽の天文学的な位置による春分に基づく
94
+ #
95
+ # @param [Array<Numeric>] date ( 年 )
96
+ #
97
+ # @return [Numeric] 年初の通日
98
+ #
99
+ def ephemeris_equinox(date)
100
+ equinox_time = @engine.cn_to_time(+date[0])
101
+ equinox_date = (equinox_time + 0.5 + @engine.long/360.0).floor
102
+ sun_set_time = @engine.sun_set(equinox_date)
103
+ (sun_set_time <= equinox_time) ? equinox_date+1 : equinox_date
104
+ end
105
+
106
+ private
107
+
108
+ ID = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,18=,19'
109
+
110
+ #
111
+ # オブジェクトの正規化
112
+ #
113
+ def _normalize(args=[], options={})
114
+ @label ||= When.Resource('_m:BahaiTerms::Bahai')
115
+
116
+ @indices ||= [
117
+ When::Coordinates::Index.new({:unit =>19}),
118
+ When::Coordinates::Index.new({:unit =>19}),
119
+ When::Coordinates::Index.new({:trunk=>When.Resource('_m:BahaiTerms::Month::*'),
120
+ :branch=>{+1=>When.Resource('_m:BahaiTerms::Month::*')[19]}}),
121
+ When::Coordinates::Index.new
122
+ ]
123
+ @index_of_MSC ||= 2
124
+ @origin_of_MSC ||= -1844 + 19*19
125
+ @rule_table ||= {
126
+ 365 => {'Length'=>[19] * 18 + [4, 19], 'IDs'=>ID},
127
+ 366 => {'Length'=>[19] * 18 + [5, 19], 'IDs'=>ID}
128
+ }
129
+ @note ||= 'BahaiNotes'
130
+
131
+ super
132
+
133
+ @engine ||= @location ?
134
+ When::Ephemeris::Formula.new({:formula=>'1S', :location=>@location}) :
135
+ When.Calendar('Gregorian')
136
+
137
+ case @engine
138
+ when When::Ephemeris::Formula; instance_eval('class << self; alias :_sdn_ :ephemeris_equinox; end')
139
+ when When::TM::Calendar ; instance_eval('class << self; alias :_sdn_ :gregorian_equinox; end')
140
+ else ; raise ArgumentError, 'Engine not specified'
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,627 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2013 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
+ BalineseTerms = [self, [
12
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
13
+ "locale:[=en:, ja=ja:, alias]",
14
+ "names:[BalineseTerms]",
15
+ "[BalineseLuniSolar=, バリ・サカ暦=]",
16
+ "[Tenganan=, テンガナン暦=]",
17
+
18
+ [self,
19
+ "names:[IntercalaryMonth=en:Intercalation, 閏月]",
20
+ "[%s Suklapaksa=, %s 白分= ]",
21
+ "[%s Krsnapaksa=, %s 黒分= ]",
22
+ "[Mala %s Suklapaksa=, 閏%s 白分=]",
23
+ "[Mala %s Krsnapaksa=, 閏%s 黒分=]"
24
+ ],
25
+
26
+ [self,
27
+ "names:[IntercalaryDay=en:Intercalation, 閏日=ja:%E9%96%8F]",
28
+ "[Double %s=, 欠= ]"
29
+ ],
30
+
31
+ [self,
32
+ "names:[HinduMonth=, ヒンドゥ月=]",
33
+ "[Kelima=, 5月=]",
34
+ "[Kenem=, 6月=]",
35
+ "[Kepitu=, 7月=]",
36
+ "[Kewulu=, 8月=]",
37
+ "[Kesanga=, 9月=]",
38
+ "[Kedasa=, 10月=]",
39
+ "[Jiyestha=, 11月=]",
40
+ "[Sadha=, 12月=]",
41
+ "[Kasa=, 1月=]",
42
+ "[Karo=, 2月=]",
43
+ "[Ketiga=, 3月=]",
44
+ "[Kapat=, 4月=]"
45
+ ],
46
+
47
+ [self,
48
+ "names:[TengananMonth=, テンガナン月=]",
49
+ "[Kelima=, 5月=]",
50
+ "[Kanem=, 6月=]",
51
+ "[Kepitu=, 7月=]",
52
+ "[Kolu=, 8月=]",
53
+ "[Kesanga=, 9月=]",
54
+ "[Kedasa=, 10月=]",
55
+ "[Desta=, 11月=]",
56
+ "[Sadda=, 12月=]",
57
+ "[Kasa=, 1月=]",
58
+ "[Karo=, 2月=]",
59
+ "[Ketiga=, 3月=]",
60
+ "[Kapat=, 4月=]",
61
+ "[Kapat Sep=, 閏4月=]"
62
+ ]
63
+ ]]
64
+ end
65
+
66
+ module Coordinates
67
+
68
+ # Balinese Residues
69
+
70
+ #
71
+ # ウク周期
72
+ #
73
+ class Wuku < Residue
74
+ # 2日週
75
+ Dwiwara = [ 0, 1, 1, 1, 1, 1, 0,
76
+ 1, 0, 0, 0, 1, 0, 1,
77
+ 0, 1, 0, 1, 0, 1, 0,
78
+ 0, 0, 1, 0, 1, 1, 1,
79
+ 1, 1, 0, 0, 0, 0, 0]
80
+ # 10日週
81
+ Dasawara = [ 0, 1, 2, 3, 4, 3, 5,
82
+ 6, 7, 8, 5, 3, 9, 2,
83
+ 9, 4, 9, 1, 5, 1, 8,
84
+ 7, 8, 1, 7, 2, 4, 4,
85
+ 4, 6, 7, 0, 7, 0, 0]
86
+ # Watek
87
+ Watek = [ 0, 1, 2, 3, 4, 3, 5,
88
+ 6, 7, 8, 5, 3, 9,10,
89
+ 9, 4, 9, 1, 5, 1,11,
90
+ 7, 8, 1, 7,10, 4, 4,
91
+ 4, 6, 7, 0, 7, 0, 0]
92
+
93
+ # 2日週
94
+ # @return [When::BasicTypes::M17n]
95
+ def dwiwara
96
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['Dwiwara'][Dwiwara[@remainder % 35]]
97
+ end
98
+
99
+ # 4日週
100
+ # @return [When::BasicTypes::M17n]
101
+ def tjaturwara
102
+ index = (@remainder + 137) % 210
103
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['Tjaturwara'][index >= 208 ? 2 : (index-1) % 4]
104
+ end
105
+
106
+ # 8日週
107
+ # @return [When::BasicTypes::M17n]
108
+ def astawara
109
+ index = (@remainder + 137) % 210
110
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['Astawara'][index >= 208 ? 6 : (index-1) % 8]
111
+ end
112
+
113
+ # 9日週
114
+ # @return [When::BasicTypes::M17n]
115
+ def sangawara
116
+ index = @remainder - 3
117
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['Sangawara'][index < 0 ? 0 : index % 9]
118
+ end
119
+
120
+ # 10日週
121
+ # @return [When::BasicTypes::M17n]
122
+ def dasawara
123
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['Dasawara'][Dasawara[@remainder % 35]]
124
+ end
125
+
126
+ # Watek
127
+ # @return [When::BasicTypes::M17n]
128
+ def watek
129
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['Watek'][Watek[@remainder % 35]]
130
+ end
131
+ end
132
+ end
133
+
134
+ class TM::CalendarEra
135
+
136
+ #
137
+ # バリのサカ暦
138
+ #
139
+ Balinese = [self, [
140
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
141
+ "locale:[=en:, ja=ja:, alias]",
142
+ "period:[BalineseLuniSolar=, バリ・サカ暦=]",
143
+ ["[BSE=, サカ暦=, alias:Balinese_Saka_Era]1886-07<13", "Calendar Epoch", "1886-07<13^BalineseLuniSolar1965",
144
+ "1892-07-04^BalineseLuniSolar1971",
145
+ "1914-07-08^BalineseLuniSolar1993",
146
+ "1921-06<10^BalineseLuniSolar2000",
147
+ "1924-07<14^BalineseLuniSolar2003", '+Infinity']
148
+ ]]
149
+ end
150
+
151
+ module CalendarTypes
152
+
153
+ #
154
+ # Balinese Luni-Solar Calendar
155
+ #
156
+ class BalineseLuniSolar < HinduLuniSolar
157
+
158
+ # protected
159
+
160
+ # 朔望日 -> 年・月・日
161
+ #
162
+ # @param [Numeric] tithi 朔望日(月の位相 / (CIRCLE/30))
163
+ #
164
+ # @return [Array<Numeric>] ( y, m, d )
165
+ # [ y - 年(Integer) ]
166
+ # [ m - 月(When::Coordinates::Pair) ]
167
+ # [ d - 日(Integer) ]
168
+ #
169
+ def _tithi_to_coordinates(tithi)
170
+ @tabular._encode(@tabular._number_to_coordinates(tithi.to_i))
171
+ end
172
+
173
+ # 日時要素の翻訳表の取得
174
+ #
175
+ # @overload _ids_(date)
176
+ # @param [Array<Numeric>] date ( 年 )
177
+ # @return [Array<When::Coordinates::Pair>] 1年の月の配置の翻訳表
178
+ #
179
+ # @overload _ids_(date)
180
+ # @param [Array<Numeric>] date ( 年 月 )
181
+ # @return [Array<When::Coordinates::Pair>] 1月の日の配置の翻訳表
182
+ # @note 月は 0 始まりの通番
183
+ #
184
+ def _ids_(date)
185
+ y, m = date
186
+ m ? super : @tabular._ids(date)
187
+ end
188
+
189
+ private
190
+
191
+ # オブジェクトの正規化
192
+ #
193
+ # @tabular = 19年7閏のパターンを与える tithi に対する Calendar
194
+ # @formula[-1] = 位相の計算に用いる月の Ephemeris
195
+ #
196
+ def _normalize(args=[], options={})
197
+
198
+ intercalary_month = When.Resource('_m:BalineseTerms::IntercalaryMonth::*')
199
+ intercalary_day = When.Resource('_m:BalineseTerms::IntercalaryDay::*')
200
+ month_index = Coordinates::Index.new({:branch=>{ 0 => intercalary_month[0], # 白分
201
+ +0.5 => intercalary_month[1], # 黒分
202
+ +1 => intercalary_month[2], # 閏白分
203
+ +1.5 => intercalary_month[3]}, # 閏黒分
204
+ :trunk=>When.Resource('_m:BalineseTerms::HinduMonth::*'),
205
+ :shift=>+8})
206
+
207
+ @tabular = CyclicTableBased.new({
208
+ 'indices' => [month_index, Coordinates::Index.new],
209
+ 'rule_table' => @rule_table
210
+ })
211
+
212
+ @formula = [Ephemeris::MeanLunation.new(
213
+ {
214
+ 'day_epoch' => @day_epoch,
215
+ 'longitude_shift' => '-1/12', # 雨水
216
+ 'long' => 360.0 / 63 * @day_border.to_i,
217
+ 'formula' => '2L',
218
+ 'year_length' => '222075/608',
219
+ 'lunation_length' => '945/32'
220
+ })]
221
+
222
+ @indices = [month_index, Coordinates::Index.new({:branch=>{-2=>intercalary_day[0]}})]
223
+
224
+ @note = When.CalendarNote(@note || 'BalineseNote')
225
+
226
+ @timezone ||= 0
227
+ super
228
+ end
229
+ end
230
+
231
+ intercalary_pattern_1 = {# 17 18 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
232
+ 'T' => {'Rule' =>[ 'N','N','D','N','N','S','N','N','D','N','S','N','N','D','N','N','S','N','S']},
233
+ 'N' => {'Length' =>[15]*24, 'IDs' => '10,10<,11,11<,12,12<,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
234
+ 'D' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,11=,11>,12,12<,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
235
+ 'S' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,12,12<,12=,12>,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'}
236
+ }
237
+
238
+ intercalary_pattern_2 = {# 17 18 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
239
+ 'T' => {'Rule' =>[ 'N','S','N','N','D','N','3','N','N','1','N','N','D','N','N','K','N','2','N']},
240
+ 'N' => {'Length' =>[15]*24, 'IDs' => '10,10<,11,11<,12,12<,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
241
+ 'K' => {'Length' =>[15]*26, 'IDs' => '10,10<,10=,10>,11,11<,12,12<,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
242
+ 'D' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,11=,11>,12,12<,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
243
+ 'S' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,12,12<,12=,12>,1,1<,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
244
+ '1' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,12,12<,1,1<,1=,1>,2,2<,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
245
+ '2' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,12,12<,1,1<,2,2<,2=,2>,3,3<,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'},
246
+ '3' => {'Length' =>[15]*26, 'IDs' => '10,10<,11,11<,12,12<,1,1<,2,2<,3,3<,3=,3>,4,4<,5,5<,6,6<,7,7<,8,8<,9,9<'}
247
+ }
248
+
249
+ BalineseLuniSolar1965 = [BalineseLuniSolar, {
250
+ 'day_epoch' => 1749594, # CE78-02-16
251
+ 'day_border' => 0, # Friday
252
+ 'rule_table' => intercalary_pattern_1
253
+ }]
254
+
255
+ BalineseLuniSolar1971 = [BalineseLuniSolar, {
256
+ 'day_epoch' => 1749594, # CE78-02-16
257
+ 'day_border' => -23, # Wednesday
258
+ 'rule_table' => intercalary_pattern_1
259
+ }]
260
+
261
+ BalineseLuniSolar1993 = [BalineseLuniSolar, {
262
+ 'day_epoch' => 1749594, # CE78-02-16
263
+ 'day_border' => -23, # Wednesday
264
+ 'rule_table' => intercalary_pattern_2
265
+ }]
266
+
267
+ BalineseLuniSolar2000 = [BalineseLuniSolar, {
268
+ 'day_epoch' => 1749593, # CE78-02-15
269
+ 'day_border' => -23, # Tuesday
270
+ 'rule_table' => intercalary_pattern_2
271
+ }]
272
+
273
+ BalineseLuniSolar2003 = [BalineseLuniSolar, {
274
+ 'day_epoch' => 1749593, # CE78-02-15
275
+ 'day_border' => -23, # Tuesday
276
+ 'rule_table' => intercalary_pattern_1
277
+ }]
278
+
279
+ #
280
+ # Tenganan Calendar
281
+ #
282
+ Tenganan = [CyclicTableBased, {
283
+ 'label' => When.Resource('_m:BalineseTerms::Tenganan'),
284
+ 'origin_of_LSC' => 1095 * 1573 - 381,
285
+ 'origin_of_MSC' => 1,
286
+ 'indices' => [
287
+ When::Coordinates::Index.new({:trunk=>When.Resource('_m:BalineseTerms::TengananMonth::*')}),
288
+ When::Coordinates::Index.new
289
+ ],
290
+ 'rule_table' => {
291
+ 'T' => {'Rule' =>[360, 379, 356]},
292
+ 360 => {'Length'=>[30] * 12},
293
+ 379 => {'Length'=>[30] * 6 + [26] * 2 + [30] * 4 + [27]},
294
+ 356 => {'Length'=>[30] * 6 + [28] * 2 + [30] * 4 }
295
+ }
296
+ }]
297
+
298
+ #
299
+ # バリ暦の暦注
300
+ #
301
+ class CalendarNote::BalineseNote < CalendarNote
302
+
303
+ NoteObjects = [When::BasicTypes::M17n, [
304
+ "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]",
305
+ "locale:[=en:, ja=ja:, alias]",
306
+ "names:[Balinese]",
307
+
308
+ # 年の暦注 ----------------------------
309
+ [When::BasicTypes::M17n,
310
+ "names:[year]"
311
+ ],
312
+
313
+ # 月の暦注 ----------------------------
314
+ [When::BasicTypes::M17n,
315
+ "names:[month]",
316
+ [When::BasicTypes::M17n,
317
+ "names:[Month]"
318
+ ]
319
+ ],
320
+
321
+ # 日の暦注 ----------------------------
322
+ [When::BasicTypes::M17n,
323
+ "names:[day]",
324
+
325
+ [When::BasicTypes::M17n,
326
+ "names:[Hari=, 日名=]",
327
+
328
+ [When::BasicTypes::M17n,
329
+ "names:[Suklapaksa=, 白分=]",
330
+ "[Lidi= ]",
331
+ "[Kuda= ]",
332
+ "[Kidang= ]",
333
+ "[Macan= ]",
334
+ "[Kucing= ]",
335
+ "[Sampi= ]",
336
+ "[Kerbau= ]",
337
+ "[Tikus= ]",
338
+ "[Debu= ]",
339
+ "[Anjing= ]",
340
+ "[Naga= ]",
341
+ "[Kambing=]",
342
+ "[Mayang= ]",
343
+ "[Gajah= ]",
344
+ "[Singa= ]"
345
+ ],
346
+
347
+ [When::BasicTypes::M17n,
348
+ "names:[Krsnapaksa=, 黒分=]",
349
+ "[Ikan= ]",
350
+ "[Lilin= ]",
351
+ "[Ulung= ]",
352
+ "[Kelapa= ]",
353
+ "[Banteng=]",
354
+ "[Hantu= ]",
355
+ "[Areng= ]",
356
+ "[Udang= ]",
357
+ "[Semudra=]",
358
+ "[Pare= ]",
359
+ "[Madu= ]",
360
+ "[Kala= ]",
361
+ "[Ular= ]",
362
+ "[Padi= ]",
363
+ "[Ulat= ]"
364
+ ]
365
+ ],
366
+
367
+ [When::BasicTypes::M17n,
368
+ "names:[Dwiwara=, 2日週=]",
369
+ "[Menga=]", # 0
370
+ "[Pepet=]" # 1
371
+ ],
372
+
373
+ [When::Coordinates::Residue,
374
+ "label:[Triwara=, 3日週=]", "divisor:3", "day:2",
375
+ [When::Coordinates::Residue, "label:[Pasah= ]", "remainder: 0"],
376
+ [When::Coordinates::Residue, "label:[Gelang Tegeh=]", "remainder: 1"],
377
+ [When::Coordinates::Residue, "label:[Kajeng= ]", "remainder: 2"]
378
+ ],
379
+
380
+ [When::BasicTypes::M17n,
381
+ "names:[Tjaturwara=, 4日週=]",
382
+ "[Sri= ]",
383
+ "[Laba= ]",
384
+ "[Jaya= ]",
385
+ "[Menala=]"
386
+ ],
387
+
388
+ [When::Coordinates::Residue,
389
+ "label:[Pantjawara=, 5日週=]", "divisor:5", "day:1",
390
+ [When::Coordinates::Residue, "label:[Paing= ]", "remainder: 0"],
391
+ [When::Coordinates::Residue, "label:[Pon= ]", "remainder: 1"],
392
+ [When::Coordinates::Residue, "label:[Wage= ]", "remainder: 2"],
393
+ [When::Coordinates::Residue, "label:[Kliwon=]", "remainder: 3"],
394
+ [When::Coordinates::Residue, "label:[Umanis=]", "remainder: 4"]
395
+ ],
396
+
397
+ [When::Coordinates::Residue,
398
+ "label:[Perinkelan=, 六曜=]", "divisor:6", "day:2",
399
+ [When::Coordinates::Residue, "label:[Tungleh=]", "remainder: 0"],
400
+ [When::Coordinates::Residue, "label:[Aryang= ]", "remainder: 1"],
401
+ [When::Coordinates::Residue, "label:[Urukung=]", "remainder: 2"],
402
+ [When::Coordinates::Residue, "label:[Paniron=]", "remainder: 3"],
403
+ [When::Coordinates::Residue, "label:[Was= ]", "remainder: 4"],
404
+ [When::Coordinates::Residue, "label:[Maulu= ]", "remainder: 5"]
405
+ ],
406
+
407
+ [When::Coordinates::Residue,
408
+ "label:[Sadwara=, 6日週=]", "divisor:6", "day:2",
409
+ [When::Coordinates::Residue, "label:[Mina= ]", "remainder: 0"],
410
+ [When::Coordinates::Residue, "label:[Taru= ]", "remainder: 1"],
411
+ [When::Coordinates::Residue, "label:[Sato= ]", "remainder: 2"],
412
+ [When::Coordinates::Residue, "label:[Patra=]", "remainder: 3"],
413
+ [When::Coordinates::Residue, "label:[Wong= ]", "remainder: 4"],
414
+ [When::Coordinates::Residue, "label:[Paksi=]", "remainder: 5"]
415
+ ],
416
+
417
+ [When::Coordinates::Residue,
418
+ "label:[Septawara=, 7日週=]", "divisor:7", "day:6",
419
+ [When::Coordinates::Residue, "label:[Reditē= ]", "remainder: 0"],
420
+ [When::Coordinates::Residue, "label:[Coma= ]", "remainder: 1"],
421
+ [When::Coordinates::Residue, "label:[Anggara= ]", "remainder: 2"],
422
+ [When::Coordinates::Residue, "label:[Buda= ]", "remainder: 3"],
423
+ [When::Coordinates::Residue, "label:[Wraspati= ]", "remainder: 4"],
424
+ [When::Coordinates::Residue, "label:[Sukra= ]", "remainder: 5"],
425
+ [When::Coordinates::Residue, "label:[Saniscara=]", "remainder: 6"]
426
+ ],
427
+
428
+ [When::BasicTypes::M17n,
429
+ "names:[Astawara=, 8日週=]",
430
+ "[Sri= ]",
431
+ "[Indra= ]",
432
+ "[Guru= ]",
433
+ "[Yama= ]",
434
+ "[Ludra= ]",
435
+ "[Brahma=]",
436
+ "[Kala= ]",
437
+ "[Uma= ]"
438
+ ],
439
+
440
+ [When::BasicTypes::M17n,
441
+ "names:[Sangawara=, 9日週=]",
442
+ "[Dangu= ]",
443
+ "[Jangur= ]",
444
+ "[Gigis= ]",
445
+ "[Nohan= ]",
446
+ "[Ogan= ]",
447
+ "[Erangan=]",
448
+ "[Urungan=]",
449
+ "[Tulus= ]",
450
+ "[Dadi= ]"
451
+ ],
452
+
453
+ [When::BasicTypes::M17n,
454
+ "names:[Dasawara=, 10日週=]",
455
+ "[Sri ]", # 0
456
+ "[Pati ]", # 1
457
+ "[Raja ]", # 2
458
+ "[Manuh ]", # 3
459
+ "[Duka ]", # 4
460
+ "[Manusa ]", # 5
461
+ "[Raksasa]", # 6
462
+ "[Suka ]", # 7
463
+ "[Dewa ]", # 8
464
+ "[Pandita]" # 9
465
+ ],
466
+
467
+ [When::Coordinates::Residue,
468
+ "label:[Ingkel=]", "divisor:42", "day:20",
469
+ [When::Coordinates::Residue, "label:[Wong= ]", "remainder: 0"],
470
+ [When::Coordinates::Residue, "label:[Sato= ]", "remainder: 7"],
471
+ [When::Coordinates::Residue, "label:[Mina= ]", "remainder: 14"],
472
+ [When::Coordinates::Residue, "label:[Manuk=]", "remainder: 21"],
473
+ [When::Coordinates::Residue, "label:[Taru= ]", "remainder: 28"],
474
+ [When::Coordinates::Residue, "label:[Buku= ]", "remainder: 35"]
475
+ ],
476
+
477
+ [When::BasicTypes::M17n,
478
+ "names:[Watek=]",
479
+ "[Suku-Gajah= ]", # 0
480
+ "[Gajah-Lembu= ]", # 1
481
+ "[Watu-Lembu= ]", # 2
482
+ "[Wong-Lembu= ]", # 3
483
+ "[Buta-Uler= ]", # 4
484
+ "[Gajah-Lintah=]", # 5
485
+ "[Suku-Uler= ]", # 6
486
+ "[Watu-Lintah= ]", # 7
487
+ "[Buta-Lintah= ]", # 8
488
+ "[Wong-Gajah= ]", # 9
489
+ "[Watu-Uler= ]", # 10
490
+ "[Buta-Gajah= ]" # 11
491
+ ],
492
+
493
+ [When::Coordinates::Residue,
494
+ "label:[Lintang=]", "divisor:35", "day:6",
495
+ [When::Coordinates::Residue, "label:[Gajah= ]", "remainder: 0"],
496
+ [When::Coordinates::Residue, "label:[Kiriman= ]", "remainder: 1"],
497
+ [When::Coordinates::Residue, "label:[Jong Sarat= ]", "remainder: 2"],
498
+ [When::Coordinates::Residue, "label:[Tiwa-Tiwa= ]", "remainder: 3"],
499
+ [When::Coordinates::Residue, "label:[Sangkatikel= ]", "remainder: 4"],
500
+ [When::Coordinates::Residue, "label:[Bubu bolong= ]", "remainder: 5"],
501
+ [When::Coordinates::Residue, "label:[Sungenge= ]", "remainder: 6"],
502
+ [When::Coordinates::Residue, "label:[Uluku= ]", "remainder: 7"],
503
+ [When::Coordinates::Residue, "label:[Pedati= ]", "remainder: 8"],
504
+ [When::Coordinates::Residue, "label:[Kuda= ]", "remainder: 9"],
505
+ [When::Coordinates::Residue, "label:[Gajah-Mina= ]", "remainder: 10"],
506
+ [When::Coordinates::Residue, "label:[Bade= ]", "remainder: 11"],
507
+ [When::Coordinates::Residue, "label:[Maglut= ]", "remainder: 12"],
508
+ [When::Coordinates::Residue, "label:[Paglangan= ]", "remainder: 13"],
509
+ [When::Coordinates::Residue, "label:[Kala Sungsang= ]", "remainder: 14"],
510
+ [When::Coordinates::Residue, "label:[Kukus= ]", "remainder: 15"],
511
+ [When::Coordinates::Residue, "label:[Asu= ]", "remainder: 16"],
512
+ [When::Coordinates::Residue, "label:[Kartika= ]", "remainder: 17"],
513
+ [When::Coordinates::Residue, "label:[Naga= ]", "remainder: 18"],
514
+ [When::Coordinates::Residue, "label:[Banyakangrem= ]", "remainder: 19"],
515
+ [When::Coordinates::Residue, "label:[Ru= ]", "remainder: 20"],
516
+ [When::Coordinates::Residue, "label:[Patrem= ]", "remainder: 21"],
517
+ [When::Coordinates::Residue, "label:[Lembu= ]", "remainder: 22"],
518
+ [When::Coordinates::Residue, "label:[Dpat= ]", "remainder: 23"],
519
+ [When::Coordinates::Residue, "label:[Tangis= ]", "remainder: 24"],
520
+ [When::Coordinates::Residue, "label:[Salar Ukur= ]", "remainder: 25"],
521
+ [When::Coordinates::Residue, "label:[Prahu Pgat= ]", "remainder: 26"],
522
+ [When::Coordinates::Residue, "label:[Pwuhu atarung= ]", "remainder: 27"],
523
+ [When::Coordinates::Residue, "label:[Lawean= ]", "remainder: 28"],
524
+ [When::Coordinates::Residue, "label:[Kelapa= ]", "remainder: 29"],
525
+ [When::Coordinates::Residue, "label:[Yuyu= ]", "remainder: 30"],
526
+ [When::Coordinates::Residue, "label:[Lumbung= ]", "remainder: 31"],
527
+ [When::Coordinates::Residue, "label:[Kumba= ]", "remainder: 32"],
528
+ [When::Coordinates::Residue, "label:[Udang= ]", "remainder: 33"],
529
+ [When::Coordinates::Residue, "label:[Bgoong= ]", "remainder: 34"]
530
+ ],
531
+
532
+ [When::Coordinates::Wuku,
533
+ "label:[Wuku=]", "divisor:210", "day:146",
534
+ [When::Coordinates::Wuku, "label:[Sinta= ]", "remainder: 0"],
535
+ [When::Coordinates::Wuku, "label:[Landep= ]", "remainder: 7"],
536
+ [When::Coordinates::Wuku, "label:[Ukir= ]", "remainder: 14"],
537
+ [When::Coordinates::Wuku, "label:[Kurantir= ]", "remainder: 21"],
538
+ [When::Coordinates::Wuku, "label:[Tulu= ]", "remainder: 28"],
539
+ [When::Coordinates::Wuku, "label:[Gumbreg= ]", "remainder: 35"],
540
+ [When::Coordinates::Wuku, "label:[Wariga= ]", "remainder: 42"],
541
+ [When::Coordinates::Wuku, "label:[Warigadian= ]", "remainder: 49"],
542
+ [When::Coordinates::Wuku, "label:[Julungwangi= ]", "remainder: 56"],
543
+ [When::Coordinates::Wuku, "label:[Sungsang= ]", "remainder: 63"],
544
+ [When::Coordinates::Wuku, "label:[Dunggulan= ]", "remainder: 70"],
545
+ [When::Coordinates::Wuku, "label:[Kuningan= ]", "remainder: 77"],
546
+ [When::Coordinates::Wuku, "label:[Langkir= ]", "remainder: 84"],
547
+ [When::Coordinates::Wuku, "label:[Medangsiya= ]", "remainder: 91"],
548
+ [When::Coordinates::Wuku, "label:[Pujut= ]", "remainder: 98"],
549
+ [When::Coordinates::Wuku, "label:[Pahang= ]", "remainder:105"],
550
+ [When::Coordinates::Wuku, "label:[Krulut= ]", "remainder:112"],
551
+ [When::Coordinates::Wuku, "label:[Merakih= ]", "remainder:119"],
552
+ [When::Coordinates::Wuku, "label:[Tambir= ]", "remainder:126"],
553
+ [When::Coordinates::Wuku, "label:[Medangkungan=]", "remainder:133"],
554
+ [When::Coordinates::Wuku, "label:[Matal= ]", "remainder:140"],
555
+ [When::Coordinates::Wuku, "label:[Uye= ]", "remainder:147"],
556
+ [When::Coordinates::Wuku, "label:[Menail= ]", "remainder:154"],
557
+ [When::Coordinates::Wuku, "label:[Prangbakat= ]", "remainder:161"],
558
+ [When::Coordinates::Wuku, "label:[Bala= ]", "remainder:168"],
559
+ [When::Coordinates::Wuku, "label:[Ugu= ]", "remainder:175"],
560
+ [When::Coordinates::Wuku, "label:[Wayang= ]", "remainder:182"],
561
+ [When::Coordinates::Wuku, "label:[Kelawu= ]", "remainder:189"],
562
+ [When::Coordinates::Wuku, "label:[Dukut= ]", "remainder:196"],
563
+ [When::Coordinates::Wuku, "label:[Watugunung= ]", "remainder:203"]
564
+ ]
565
+ ]
566
+ ]]
567
+
568
+ #
569
+ # When::Coordinates::Residue へ処理を委譲する暦注
570
+ #
571
+ # @private
572
+ When.CalendarNote('BalineseNote/NoteObjects')['day::*'].each do |cood|
573
+ case cood
574
+ when Coordinates::Residue
575
+ module_eval %Q{
576
+ def #{cood.label.to_s.downcase}(date, parameter=nil)
577
+ When.CalendarNote('BalineseNote/NoteObjects')['day']['#{cood.label.to_s}'] % date
578
+ end
579
+ }
580
+ when BasicTypes::M17n
581
+ module_eval %Q{
582
+ def #{cood.to_s.downcase}(date, parameter=nil)
583
+ (When.CalendarNote('BalineseNote/NoteObjects')['day']['Wuku'] % date).#{cood.to_s.downcase}
584
+ end
585
+ }
586
+ end
587
+ end
588
+
589
+ #
590
+ # 任意の暦をバリ暦日に変換
591
+ #
592
+ # @private
593
+ def _to_date_for_note(date)
594
+ return date if date.frame.kind_of?(When::CalendarTypes::BalineseLuniSolar)
595
+ (date ^ When.era(:period=>'BalineseLuniSolar')).each do |list|
596
+ return list[0] if list[0]
597
+ end
598
+ nil
599
+ end
600
+
601
+ # バリ暦日の「日名」
602
+ #
603
+ # @param [When::TM::TemporalPosition] date 「日名」を求める日付
604
+ # @param [nil] parameter 未使用
605
+ #
606
+ # @return [When::BasicTypes::M17n] 「日名」(欠日の場合は2日分を'/'で連結)
607
+ #
608
+ def hari(date, parameter=nil)
609
+ y, m, d = _to_date_for_note(date).cal_date
610
+ thiti = [d * 1 - 1]
611
+ thiti[0] += 15 unless [0,1,nil].include?(m * 0)
612
+ thiti << (thiti[0] + 1) % 30 if d * 0 == -2
613
+ table = When.CalendarNote('BalineseNote/NoteObjects')['day']['Hari']
614
+ thiti.map {|t| table[t / 15][t % 15]}.join('/')
615
+ end
616
+
617
+ private
618
+
619
+ # オブジェクトの正規化
620
+ def _normalize(args=[], options={})
621
+ @event = 'hari'
622
+ @prime ||= [%w(Month), %w(Pantjawara Perinkelan Septawara Wuku)]
623
+ super
624
+ end
625
+ end
626
+ end
627
+ end