when_exe 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +210 -171
  3. data/bin/irb.rc +1 -0
  4. data/lib/when_exe.rb +78 -53
  5. data/lib/when_exe/basictypes.rb +27 -8
  6. data/lib/when_exe/calendarnote.rb +848 -805
  7. data/lib/when_exe/calendartypes.rb +110 -240
  8. data/lib/when_exe/coordinates.rb +2440 -2175
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +13 -11
  11. data/lib/when_exe/core/extension.rb +38 -45
  12. data/lib/when_exe/ephemeris.rb +43 -14
  13. data/lib/when_exe/ephemeris/eclipse.rb +149 -0
  14. data/lib/when_exe/ephemeris/notes.rb +39 -7
  15. data/lib/when_exe/icalendar.rb +2 -6
  16. data/lib/when_exe/inspect.rb +1408 -1399
  17. data/lib/when_exe/parts/enumerator.rb +486 -477
  18. data/lib/when_exe/parts/resource.rb +1101 -1069
  19. data/lib/when_exe/parts/timezone.rb +6 -5
  20. data/lib/when_exe/region/babylonian.rb +405 -405
  21. data/lib/when_exe/region/bahai.rb +21 -61
  22. data/lib/when_exe/region/chinese/epochs.rb +81 -81
  23. data/lib/when_exe/region/chinese/twins.rb +51 -51
  24. data/lib/when_exe/region/christian.rb +7 -2
  25. data/lib/when_exe/region/coptic.rb +1 -1
  26. data/lib/when_exe/region/discordian.rb +9 -16
  27. data/lib/when_exe/region/french.rb +1 -1
  28. data/lib/when_exe/region/hanke_henry.rb +57 -0
  29. data/lib/when_exe/region/indian.rb +41 -73
  30. data/lib/when_exe/region/international_fixed.rb +97 -0
  31. data/lib/when_exe/region/iranian.rb +203 -203
  32. data/lib/when_exe/region/japanese.rb +13 -13
  33. data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
  34. data/lib/when_exe/region/japanese/notes.rb +1482 -1383
  35. data/lib/when_exe/region/japanese/residues.rb +726 -721
  36. data/lib/when_exe/region/japanese/twins.rb +37 -37
  37. data/lib/when_exe/region/jewish.rb +2 -2
  38. data/lib/when_exe/region/pax.rb +60 -0
  39. data/lib/when_exe/region/positivist.rb +100 -0
  40. data/lib/when_exe/region/roman.rb +333 -334
  41. data/lib/when_exe/region/shire.rb +3 -20
  42. data/lib/when_exe/region/thai.rb +2 -2
  43. data/lib/when_exe/region/tibetan.rb +3 -3
  44. data/lib/when_exe/region/tranquility.rb +208 -0
  45. data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
  46. data/lib/when_exe/region/vietnamese.rb +4 -4
  47. data/lib/when_exe/region/world.rb +9 -13
  48. data/lib/when_exe/region/world_season.rb +89 -0
  49. data/lib/when_exe/region/zoroastrian.rb +4 -2
  50. data/lib/when_exe/tmobjects.rb +14 -4
  51. data/lib/when_exe/tmposition.rb +239 -81
  52. data/lib/when_exe/tmreference.rb +57 -28
  53. data/lib/when_exe/version.rb +1 -1
  54. data/link_to_online_documents +6 -3
  55. data/test/examples/today.rb +1 -1
  56. data/test/scripts.rb +23 -0
  57. data/test/scripts/2.ext.rb +169 -0
  58. data/test/scripts/2.rb +169 -0
  59. data/test/scripts/3.ext.rb +133 -0
  60. data/test/scripts/3.rb +134 -0
  61. data/test/scripts/4.ext.rb +112 -0
  62. data/test/scripts/4.min.rb +65 -0
  63. data/test/scripts/4.rb +136 -0
  64. data/test/scripts/5.ext.rb +78 -0
  65. data/test/scripts/5.rb +81 -0
  66. data/test/scripts/6.gcal.rb +131 -0
  67. data/test/scripts/6.rb +205 -0
  68. data/test/scripts/6.tz.rb +105 -0
  69. data/test/scripts/7.phase.rb +109 -0
  70. data/test/scripts/7.rb +95 -0
  71. data/test/scripts/7.term.rb +128 -0
  72. data/test/scripts/7.week.rb +84 -0
  73. data/test/scripts/8.ext.rb +61 -0
  74. data/test/scripts/8.rb +62 -0
  75. data/test/scripts/9.ext.rb +131 -0
  76. data/test/scripts/9.rb +130 -0
  77. data/test/scripts/chinese-luni-solar.rb +52 -0
  78. data/test/{examples → scripts}/geometric_complex.rb +41 -41
  79. data/test/scripts/geometric_complex.txt +18 -0
  80. data/test/scripts/korea.rb +59 -0
  81. data/test/scripts/thai-reviewed.txt +211 -0
  82. data/test/scripts/thai.rb +36 -0
  83. data/test/scripts/thai.txt +210 -0
  84. data/test/test.rb +7 -0
  85. data/test/test/basictypes.rb +22 -0
  86. data/test/test/coordinates.rb +2 -1
  87. data/test/test/ephemeris.rb +34 -2
  88. data/test/test/icalendar.rb +12 -0
  89. data/test/test/inspect.rb +37 -1
  90. data/test/test/parts.rb +4 -3
  91. data/test/test/region/armenian.rb +20 -0
  92. data/test/test/region/bahai.rb +58 -0
  93. data/test/test/region/chinese.rb +14 -3
  94. data/test/test/region/christian.rb +16 -35
  95. data/test/test/region/discordian.rb +20 -0
  96. data/test/test/region/indian.rb +30 -2
  97. data/test/test/region/japanese.rb +24 -0
  98. data/test/test/region/jewish.rb +2 -0
  99. data/test/test/region/m17n.rb +9 -0
  100. data/test/test/region/reforms.rb +121 -0
  101. data/test/test/region/residue.rb +17 -11
  102. data/test/test/region/shire.rb +58 -0
  103. data/test/test/region/swedish.rb +45 -0
  104. data/test/test/region/zoroastrian.rb +58 -0
  105. data/test/test/tmobjects.rb +74 -0
  106. data/test/test/tmposition.rb +468 -397
  107. data/when_exe.gemspec +2 -2
  108. metadata +49 -6
@@ -1,1383 +1,1482 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2012-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
- require 'when_exe/ephemeris/notes'
9
- require 'when_exe/region/japanese/residues'
10
-
11
- class When::CalendarNote
12
-
13
- #
14
- # 日本暦注
15
- #
16
- class Japanese < self
17
-
18
- #
19
- # 日本暦注が使用する暦法
20
- #
21
- # @private
22
- class Cal4Note
23
- def initialize(calendar, solar)
24
- @calendar = calendar
25
- @solar = solar
26
- end
27
- end
28
-
29
- #
30
- # 日本暦注の要素
31
- #
32
- # @private
33
- class Note < When::CalendarNote::NoteElement
34
- end
35
-
36
- #
37
- # 日本暦注の要素
38
- #
39
- Notes = [When::BasicTypes::M17n, [
40
- "locale:[=ja:, en=en:]",
41
- "names:[日本暦注]",
42
-
43
- # 年の暦注 ----------------------------
44
- [When::BasicTypes::M17n,
45
- "names:[年]",
46
- [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
47
- # [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
48
- # 'position:共通'], #
49
- # [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
50
- # 'position:共通'], #
51
- [Note, 0x3800, "label:[廿八宿=ja:%%<二十八宿>]",
52
- 'position:共通'], # 1: 廿八宿
53
- [Note, 0x3FFC, "label:[大歳壇=]", 'position:暦序'], # 2: 干支
54
- [Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
55
- [Note, 0xFFFC, "label:[納音]", 'position:暦序', 'suffix:是'], # 4: 干支
56
- [Note, 0xFFFF, "label:[大歳=ja:%%<太歳神>]",
57
- 'position:暦序', 'suffix:在'], # 5: 干支
58
- [Note, 0xFFFF, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
59
- 'position:暦序', 'suffix:在'], # 6:
60
- [Note, 0xFFFF, "label:[大陰=ja:%%<太陰神>]",
61
- 'position:暦序', 'suffix:在'], # 7: 支
62
- [Note, 0xFFFF, "label:[歳徳=ja:%%<歳徳神>]",
63
- 'position:暦序', 'suffix:在'], # 8:
64
- [Note, 0xFFFF, "label:[歳刑=ja:%%<歳刑神>]",
65
- 'position:暦序', 'suffix:在'], # 9:
66
- [Note, 0xFFFF, "label:[歳破=ja:%%<歳破神>]",
67
- 'position:暦序', 'suffix:在'], # 10: 支
68
- [Note, 0xFFFF, "label:[歳煞=ja:%%<歳煞神>]",
69
- 'position:暦序', 'suffix:在'], # 11: 支
70
- [Note, 0xFFFF, "label:[黄幡=ja:%%<黄幡神>]",
71
- 'position:暦序', 'suffix:在'], # 12: 支
72
- [Note, 0xFFFF, "label:[豹尾=ja:%%<豹尾神>]",
73
- 'position:暦序', 'suffix:在'], # 13: 支
74
- [Note, 0x0003, "label:[天道=]", 'position:暦序', 'suffix:-'], # 14: 支
75
- [Note, 0x0003, "label:[人道=]", 'position:暦序', 'suffix:-'], # 15: 支
76
- [Note, 0x3FFC, "label:[歳次=]", 'position:暦序', 'suffix:-'], # 16: 支
77
- [Note, 0xF800, "label:[金神]", 'position:仮名暦', 'suffix:在'], # 17:
78
- [Note, 0xFFFF, "label:[大小]", 'position:暦序'] # 18: 朔閏表
79
- ],
80
-
81
- # 月の暦注 ----------------------------
82
- [When::BasicTypes::M17n,
83
- "names:[月]",
84
- [Note, 0xFFFF, "label:[月名=ja:%%<月_(暦)>#%.<日本の和風月名>, Month]",
85
- 'position:月建'], # 0: 月の和名
86
- # [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 干支
87
- # [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
88
- # 'position:共通'], #
89
- # [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
90
- # 'position:共通'], #
91
- [Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
92
- 'position:共通'], # 1: 廿八宿
93
- [Note, 0xFFFC, "label:[月建=]", 'position:月建', 'suffix:-' ], # 2: 年の十干と暦月
94
- [Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
95
- [Note, 0x0003, "label:[天氣=]", 'position:月建', 'suffix:-' ], # 4: 暦月
96
- [Note, 0x3FFF, "label:[天道=]", 'position:月建', 'suffix:-' ], # 5: 暦月
97
- [Note, 0x0003, "label:[人道=]", 'position:月建', 'suffix:-' ], # 6: 暦月
98
- [Note, 0x0003, "label:[月破=]", 'position:月建', 'suffix:在'], # 7: 暦月
99
- [Note, 0x3FFC, "label:[天徳=]", 'position:月建', 'suffix:在'], # 8: 暦月
100
- [Note, 0x3FFF, "label:[月煞=]", 'position:月建', 'suffix:在'], # 9: 暦月
101
- [Note, 0x3FFF, "label:[用時=]", 'position:月建', 'suffix:-' ], # 10: 暦月
102
- [Note, 0x3FFF, "label:[月徳=]", 'position:月建', 'suffix:在'], # 11: 暦月
103
- [Note, 0x3FFC, "label:[月徳合=]", 'position:月建', 'suffix:在'], # 12: 暦月
104
- [Note, 0x3FFC, "label:[月空=]", 'position:月建', 'suffix:在'], # 13: 暦月
105
- [Note, 0x3FFF, "label:[三鏡=]", 'position:月建', 'suffix:-' ], # 14: 暦月
106
- [Note, 0x3FFF, "label:[土府=]", 'position:月建', 'suffix:在'], # 15: 暦月
107
- [Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
108
- 'position:月建', 'suffix:在'], # 16: 暦月
109
- [Note, 0xFFFF, "label:[大小]", 'position:月建'] # 17: 朔閏表
110
- ],
111
-
112
- # 日の暦注 ----------------------------
113
- [When::BasicTypes::M17n,
114
- "names:[日]",
115
- [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
116
- # [Note, 0x, "label:[干=ja:%%<十干>]",
117
- # 'position:共通'], #
118
- # [Note, 0x, "label:[支=ja:%%<十二支>]",
119
- # 'position:共通'], #
120
- [Note, 0x3FFF, "label:[納音]", 'position:共通', 'suffix:是'], # 1: 干支
121
- [Note, 0xFFFF, "label:[十二直]", 'position:共通'], # 2: 節月
122
- [Note, 0xFFFF, "label:[七曜]", 'position:共通'], # 3: 七曜
123
- [Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
124
- 'position:共通'], # 4: 廿八宿
125
- [Note, 0x07F8, "label:[廿七宿=ja:%%<二十八宿>]",
126
- 'position:共通'], # 5: 暦月 暦日
127
- [Note, 0xC000, "label:[九星]", 'position:民間'], # 6: 九星
128
- [Note, 0x8000, "label:[六曜]", 'position:民間'], # 7: 暦月 暦日
129
- [Note, 0xE000, "label:[祝祭日]", 'position:祝祭日'], # 8: 暦月 暦日 (七曜)
130
- [Note, 0xFFFF, "label:[廿四節気=ja:%%<二十四節気>]",
131
- 'position:時候'], # 9: 太陽黄経
132
- [Note, 0xFFFF, "label:[節中=]", 'position:時候'], # 10: 太陽黄経
133
- [Note, 0xFFFC, "label:[七十二候]", 'position:時候'], # 11: 太陽黄経
134
- [Note, 0x3FFC, "label:[六十卦=]", 'position:時候'], # 12: 太陽黄経
135
- [Note, 0xF800, "label:[節分]", 'position:雑節'], # 13: 立春からの日数
136
- [Note, 0xF800, "label:[初午]", 'position:雑節'], # 14: 支 節月 or 暦月
137
- [Note, 0xF800, "label:[八十八夜]", 'position:雑節'], # 15: 立春からの日数
138
- [Note, 0xF800, "label:[入梅]", 'position:雑節'], # 16: 太陽黄経
139
- [Note, 0xF800, "label:[半夏生]", 'position:雑節'], # 17: 干 太陽黄経
140
- [Note, 0xF800, "label:[二百十日]", 'position:雑節'], # 18: 立春からの日数
141
- [Note, 0xF800, "label:[二百廿日]", 'position:雑節'], # 19: 立春からの日数
142
-
143
- [Note, 0x3FFC, "label:[大禍=ja:%%<暦注下段>#%.<大禍日>]",
144
- 'position:上段 上段 欄外 欄外', 'suffix:日'], # 20: 支 節月
145
- [Note, 0x3FFC, "label:[滅門=ja:%%<暦注下段>#%.<滅門日>]",
146
- 'position:上段 上段 欄外 欄外', 'suffix:日'], # 21: 支 節月
147
- [Note, 0x3FFC, "label:[狼藉=ja:%%<暦注下段>#%.<狼藉日>]",
148
- 'position:上段 上段 欄外 欄外', 'suffix:日'], # 22: 支 節月
149
-
150
- [Note, 0x07F8, "label:[甘露=]", 'position:上段 上段 上段 上段', 'suffix:日'], # 23: 七曜 廿七宿
151
- [Note, 0x07F8, "label:[金剛峯=]", 'position:上段 上段 上段 上段'], # 24: 七曜 廿七宿
152
- [Note, 0x07F8, "label:[羅刹=]", 'position:上段 上段 上段 上段'], # 25: 七曜 廿七宿
153
-
154
- [Note, 0x3FFC, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
155
- 'position:上段 上段 上段 上段', 'suffix:-'], # 26: 干支 節年
156
- [Note, 0xFFFC, "label:[天一=ja:%%<天一神>]",
157
- 'position:上段 上段 上段 上段', 'suffix:-'], # 27: 干支
158
- [Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
159
- 'position:上段 上段 上段 上段', 'suffix:-'], # 28: 干支
160
- [Note, 0x3FFC, "label:[歳下食=ja:%%<暦注下段>#%.<歳下食>]",
161
- 'position:上段 上段 上段 上段'], # 29: 干支 節年
162
- [Note, 0x3FFC, "label:[忌遠行=]", 'position:上段 上段 上段 上段'], # 30: 支 節月
163
- [Note, 0x3FFC, "label:[忌夜行=]", 'position:上段 上段 上段 上段'], # 31: 節月
164
- [Note, 0x3FFC, "label:[下食時=ja:%%<暦注下段>#%.<時下食>]",
165
- 'position:上段 上段 上段 上段', 'suffix:-'], # 32: 支 節月 貞享暦で一部廃止
166
- [Note, 0x3FFC, "label:[天間=]", 'position:上段 上段 上段 中段上'], # 33: 干支 節月
167
- [Note, 0x3FFC, "label:[不視病=]", 'position:上段 上段 上段 上段'], # 34:
168
- [Note, 0x3FFC, "label:[不問疾=]", 'position:上段 上段 上段 上段'], # 35:
169
- [Note, 0x3FFC, "label:[不弔人=]", 'position:上段 上段 上段 上段'], # 36:
170
- [Note, 0xFFFC, "label:[彼岸]", 'position:仮名暦'], # 37: 太陽黄経
171
- [Note, 0xFFFF, "label:[社=ja:%%<社日>]",
172
- 'position:中段 中段 中段 中段', 'suffix:日'], # 38: 太陽黄経
173
- [Note, 0xFFFF, "label:[三伏]", 'position:中段 中段 中段 中段'], # 39: 干 太陽黄経
174
- [Note, 0x3FFC, "label:[除手足甲=]", 'position:中段 中段 中段 中段'], # 40: 晦(除手足甲)、支(片方のみ), 没滅凶会日×
175
- [Note, 0x3FFC, "label:[沐浴=]", 'position:中段 中段 中段 中段'], # 41: 没滅凶会日×
176
- [Note, 0x3FFD, "label:[臘=ja:%%<臘日>]",
177
- 'position:中段 中段 中段 中段', 'suffix:日'], # 42: 支 太陽黄経
178
- [Note, 0x3FFC, "label:[伐=]", 'position:中段 中段 中段 中段上', 'suffix:日'], # 43: 干支
179
- [Note, 0x3FFC, "label:[五墓=ja:%%<暦注下段>#%.<五墓日>]",
180
- 'position:中段 中段 中段 中段下', 'suffix:日'], # 44: 干支
181
- [Note, 0x3FFC, "label:[六蛇=]", 'position:中段 中段 中段 中段上'], # 45: 干支 節月
182
- [Note, 0x3FFC, "label:[七鳥=]", 'position:中段 中段 中段 中段上'], # 46: 干支 節月
183
- [Note, 0x3FFC, "label:[八龍=]", 'position:中段 中段 中段 中段上'], # 47: 干支 節月
184
- [Note, 0x3FFC, "label:[九虎=]", 'position:中段 中段 中段 中段上'], # 48: 干支 節月
185
- [Note, 0x07FF, "label:[没=ja:%%<没日>]",
186
- 'position:中段 中段 中段 中段', 'suffix:日'], # 49: 太陽黄経
187
- [Note, 0xFFF8, "label:[日食]", 'position:中段 中段 中段 中段'], # 50: 日食表
188
- [Note, 0x07FC, "label:[滅=ja:%%<滅日]",
189
- 'position:中段 中段 中段 中段', 'suffix:日'], # 51: 月の位相
190
- [Note, 0xFFF8, "label:[月食]", 'position:中段 中段 中段 中段'], # 52: 月食表
191
- [Note, 0xC7FD, "label:[月相]", 'position:中段 中段 中段 中段'], # 53: 月の位相
192
- [Note, 0xFFFF, "label:[土用事=ja:%%<土用>]",
193
- 'position:中段 中段 中段 中段'], # 54: 太陽黄経
194
- [Note, 0x3FF0, "label:[伏龍=]", 'position:上段 上段 下段 下段', 'suffix:在'], # 55: 太陽黄経
195
-
196
- [Note, 0x3FFF, "label:[凶会=ja:%%<暦注下段>#%.<凶会日>]",
197
- 'position:下段 下段 下段 下段', 'suffix:日'], # 56: 干支 節月(宣明暦以前)/暦月(貞享暦以降)
198
- [Note, 0x3FFF, "label:[大小歳=]", 'position:下段 下段 下段 下段'], # 57: 干支 節月
199
- [Note, 0x3FFC, "label:[歳徳=ja:%%<歳徳神>]",
200
- 'position:下段 下段 下段 下段'], # 58: 節年 凶会日× ~合も
201
- [Note, 0x0003, "label:[天倉=]", 'position:古注'], # 59: 干支 節月
202
- # [Note, 0x0003, "label:[天李=]", 'position:古注'], # 干支 節月?
203
- [Note, 0x37FF, "label:[天恩=ja:%%<暦注下段>#%.<天恩日>]",
204
- 'position:下段 下段 下段 下段', 'suffix:日'], # 60: 干支 節月 凶会日×
205
- [Note, 0xFFFF, "label:[天赦=ja:%%<暦注下段>#%.<天赦日>]",
206
- 'position:下段 下段 下段 下段'], # 61: 干支 節月
207
- [Note, 0x37FF, "label:[母倉=ja:%%<暦注下段>#%.<母倉日>]",
208
- 'position:下段 下段 下段 下段', 'suffix:日'], # 62: 節月 凶会日×
209
- [Note, 0x37FC, "label:[月徳=]", 'position:下段 下段 下段 下段'], # 63: 干 節月 凶会日× ~合も
210
- [Note, 0x3FFF, "label:[九坎=]", 'position:下段 下段 下段 下段'], # 64: 支 節月
211
- [Note, 0x3FFF, "label:[歸忌=ja:%%<暦注下段>#%.<帰忌日>]",
212
- 'position:下段 下段 下段 下段', 'suffix:日'], # 65: 支 節月
213
- [Note, 0x3FFF, "label:[血忌=ja:%%<暦注下段>#%.<血忌日>]",
214
- 'position:下段 下段 下段 下段', 'suffix:日'], # 66: 支 節月
215
- [Note, 0x3FFC, "label:[無翹=]", 'position:下段 下段 下段 下段'], # 67: 支 節月
216
- [Note, 0x3FFF, "label:[厭=]", 'position:下段 下段 下段 下段'], # 68: 支 節月
217
- [Note, 0x3FFC, "label:[重=ja:%%<暦注下段>#%.<重日>]",
218
- 'position:下段 下段 下段 下段', 'suffix:日'], # 69: 支
219
- [Note, 0x3FFD, "label:[復=ja:%%<暦注下段>#%.<復日>]",
220
- 'position:下段 下段 下段 下段', 'suffix:日'], # 70: 干 節月
221
- [Note, 0x3FFC, "label:[月煞=]", 'position:下段 下段 下段 下段'], # 71: 支 節月
222
- [Note, 0x3FFF, "label:[往亡=ja:%%<暦注下段>#%.<往亡日>]",
223
- 'position:下段 下段 下段 下段', 'suffix:日'], # 72: 太陽黄経
224
- [Note, 0x3FFF, "label:[日遊=ja:%%<日遊神>]",
225
- 'position:最下段', 'suffix:在'], # 73: 干支
226
- [Note, 0x07FF, "label:[人神配当=]", 'position:最下段孟月', 'suffix:-'], # 74: 暦日
227
-
228
- [Note, 0x3E00, "label:[受死=ja:%%<暦注下段>#%.<受死日>]",
229
- 'position:仮名暦', 'suffix:日'], # 75: 支 節月
230
- [Note, 0xFFF0, "label:[八專]", 'position:仮名暦'], # 76: 干支
231
- [Note, 0x3E00, "label:[八專間日=ja:%%<八専>]",
232
- 'position:仮名暦'], # 77: 干支
233
- [Note, 0xC000, "label:[金神間日=ja:%%<金神>#%.<金神の遊行・間日>]",
234
- 'position:仮名暦'], # 78: 支 節月
235
- [Note, 0xC000, "label:[金神遊行=ja:%%<金神>#%.<金神の遊行・間日>]",
236
- 'position:仮名暦'], # 79: 支 節月
237
- [Note, 0x3FF0, "label:[天火=ja:%%<暦注下段>#%.<天火日>]",
238
- 'position:仮名暦', 'suffix:日'], # 80: 支 節月
239
- [Note, 0x3FF0, "label:[地火=ja:%%<暦注下段>#%.<地火日>]",
240
- 'position:仮名暦', 'suffix:日'], # 81: 支 節月
241
- [Note, 0x3800, "label:[人火=]", 'position:仮名暦'], # 82: 支 節月
242
- [Note, 0x3800, "label:[雷火=]", 'position:仮名暦'], # 83: 支 節月
243
- [Note, 0x3FF0, "label:[赤舌=ja:%%<赤舌日>]",
244
- 'position:仮名暦', 'suffix:日'], # 84: 暦月 暦日
245
- [Note, 0x3E00, "label:[十死=ja:%%<暦注下段>#%.<十死日>]",
246
- 'position:仮名暦', 'suffix:日'], # 85: 節月
247
- [Note, 0x3E00, "label:[道虚=]", 'position:仮名暦', 'suffix:日'], # 86: 暦日
248
- [Note, 0x3E00, "label:[大明=ja:%%<暦注下段>#%.<大明日>]",
249
- 'position:仮名暦', 'suffix:日'], # 87: 干支
250
- [Note, 0x0600, "label:[大赤=ja:%%<赤口日>]",
251
- 'position:仮名暦', 'suffix:日'], # 88: 暦月 暦日
252
- [Note, 0xF800, "label:[甲子待=ja:%%<甲子>]",
253
- 'position:仮名暦'], # 89: 干支
254
- [Note, 0xC000, "label:[己巳]", 'position:仮名暦'], # 90: 干支
255
- [Note, 0xF800, "label:[庚申待]", 'position:仮名暦'], # 91: 干支
256
- [Note, 0x3800, "label:[犯土]", 'position:仮名暦'], # 92: 干支
257
- [Note, 0xF800, "label:[十方暮]", 'position:仮名暦'], # 93: 干支
258
- [Note, 0xF800, "label:[一粒万倍=ja:%%<一粒万倍日>]",
259
- 'position:仮名暦', 'suffix:日'], # 94: 支 節月
260
- [Note, 0x3800, "label:[天福=]", 'position:仮名暦'], # 95: 支 節月
261
- [Note, 0x3800, "label:[地福=]", 'position:仮名暦'], # 96: 支 節月
262
- [Note, 0x3800, "label:[地五福=]", 'position:仮名暦'], # 97: 支 節月
263
- [Note, 0xB800, "label:[三隣亡]", 'position:仮名暦'], # 98: 支 節月
264
- [Note, 0xF800, "label:[不成就=ja:%%<不成就日>]",
265
- 'position:仮名暦', 'suffix:日'], # 99: 暦月 暦日/晦日
266
- [Note, 0x3800, "label:[鬼宿]", 'position:仮名暦'], #100: 廿八宿
267
- [Note, 0x3800, "label:[金性=]", 'position:仮名暦'], #101: 節月 支 節年
268
- [Note, 0x3FFF, "label:[三寶吉=ja:%%<三宝吉>]",
269
- 'position:上段 上段 上段 上段'], #102: 干支 節月
270
- [Note, 0x3FFF, "label:[神吉=ja:%%<暦注下段>#%.<神日>]",
271
- 'position:上段 上段 中段 中段上', 'suffix:日'], #103: 干支 節月
272
- [Note, 0x3FFF, "label:[雑事吉=]", 'position:雑事吉'], #104: 干支 節月
273
- [Note, 0x3FFF, "label:[小字注=]", 'position:下段小字 下段小字 下段小字 下段小字'],#105: 干支 節月
274
- ]
275
- ]]
276
-
277
- #
278
- # 日本暦注の時代変遷
279
- #
280
- # @private
281
- NoteTypes = (2...When::TM::CalendarEra::JapaneseSolar[1].size).to_a.map {|i|
282
- calendars =
283
- [When::TM::CalendarEra::JapaneseLuniSolar[1][i][2],
284
- When::TM::CalendarEra::JapaneseSolar[1][i][2]].map {|epoch|
285
- epoch =~ /\A(-?\d+)-(\d+)-(\d+)\^(.+)\z/
286
- $4
287
- }
288
- [$2 == '01' ? $1.to_i : $1.to_i+1, Cal4Note.new(*calendars)]
289
- }.reverse
290
-
291
- # @private
292
- NoteRange = [
293
- # 開始 具注暦 七十二候 index mask
294
- [-660, 0, 0], # ~ 696 0 : 0001
295
- [ 697, 0, 0], # 763 1 : 0002
296
- [ 764, 0, 2], # ~ 800 2 : 0004
297
- [ 801, 0, 2], # ~ 900 3 : 0008
298
- [ 901, 0, 2], # ~1003 4 : 0010
299
- [1004, 1, 2], # ~1047 5 : 0020
300
- [1048, 1, 2], # ~1100 6 : 0040
301
- [1101, 1, 2], # ~1184 7 : 0080
302
- [1185, 2, 2], # ~1300 8 : 0100
303
- [1301, 2, 2], # ~1337 9 : 0200
304
- [1338, 3, 2], # ~1684 10 : 0400
305
- [1685, 3, 3], # ~1754 11 : 0800
306
- [1755, 3, 4], # ~1867 12 : 1000
307
- [1868, 3, 4], # ~1872 13 : 2000
308
- [1873, 3, 4], # ~1873 14 : 4000
309
- [1874, 3, 5] # ~ 15 : 8000
310
- ]
311
-
312
- # @private
313
- NoteFocused = (0...NoteRange.size).to_a.map {|range|
314
- (2..4).to_a.map {|cord|
315
- notes = Notes[1][cord]
316
- (2...notes.size).to_a.inject([]) {|focused,note|
317
- focused << notes[note][2][/\[.+?[=\]]/][1..-2] if notes[note][1][range] == 1
318
- focused
319
- }
320
- }
321
- }
322
-
323
- #
324
- # 月の大小
325
- #
326
- # @private
327
- MonthPattern = {
328
- 29 => '小',
329
- 30 => '大',
330
- -28 => '',
331
- -29 => '',
332
- -30 => '',
333
- -31 => ''
334
- }
335
-
336
- #
337
- # 日本暦注に対応するインデックス(整数値)
338
- #
339
- # @private
340
- module Index
341
- # @private
342
- [[2,'Y'], [3,'M'], [4,'D']].map {|cord|
343
- index, initial = cord
344
- notes = Notes[1][index]
345
- (notes.size-2).times {|no|
346
- name = initial + notes[no+2][2][/\[.+?[=\]]/][1..-2]
347
- mask = 'M' + name
348
- const_set(name, no)
349
- const_set(mask, 1<<no)
350
- }
351
- }
352
- end
353
-
354
- #
355
- # 日本暦注が使用する暦法
356
- #
357
- # @private
358
- class Cal4Note
359
- attr_reader :calendar, :solar
360
-
361
- def l_calendar
362
- @l_calendar ||= When.Calendar(@calendar)
363
- end
364
-
365
- def s_calendar
366
- @s_calendar ||= When.Calendar(@solar)
367
- end
368
-
369
- def l_phases
370
- @l_phases ||= Japanese::LunarPhases.new('formula'=>l_calendar.formula[-1])
371
- end
372
-
373
- def s_terms
374
- @s_terms ||= Japanese::SolarTerms.new('formula'=>s_calendar.formula[0])
375
- end
376
-
377
- def doyo
378
- s_calendar.doyo
379
- end
380
- end
381
-
382
- #
383
- # 日本暦注用の Notes の要素のための内部クラス
384
- #
385
- # @private
386
- class Note
387
-
388
- attr_reader :label, :position, :suffix
389
-
390
- def to_note_hash(note, dates=nil)
391
- {
392
- :note => self,
393
- :value => case @suffix
394
- when '是' ; [@label + '是-', note[/.\z/]]
395
- when '在' ; [@label + '在-', note]
396
- when '-' ; [@label + '-', note]
397
- else ; note
398
- end,
399
- :position => @position[@position.size == 1 ? 0 : dates.index_g]
400
- }
401
- end
402
-
403
- private
404
- # オブジェクトの正規化
405
- #
406
- def _normalize(args=[], options={})
407
- @position = @position.split(/ /)
408
- end
409
- end
410
-
411
- #
412
- # 日本暦注計算に必要となる暦日や暦法をまとめた内部クラス
413
- #
414
- # @private
415
- class Dates
416
-
417
- attr_reader :year, :precision, :cal4note, :range, :index_g, :index_s, :o_date, :l_date, :m_date, :s_date
418
-
419
- # 初期設定
420
- def initialize(date, year=date.most_significant_coordinate, precision=date.precision, cal4note=nil)
421
-
422
- # 暦注パターン
423
- if cal4note
424
- # 年代による判定
425
- (1...NoteRange.size).to_a.reverse.each do |i|
426
- if year >= NoteRange[i][0]
427
- @range = i
428
- break
429
- end
430
- end
431
- @range ||= 0
432
- else
433
- # 暦法による判定
434
- cal4note = Cal4Note.new(date.frame, date.frame.twin)
435
- @range =
436
- case cal4note.l_calendar.formula[-1]
437
- when When::Ephemeris::ChineseTrueLunation::JujiMethods ; 11 # 江戸時代の暦
438
- when When::Ephemeris::ChineseTrueLunation
439
- date.frame.twin =~ /戊寅|麟徳/ ? 1 : 10 # 唐代定朔暦(儀鳳暦 or 宣明暦)
440
- when When::Ephemeris::MeanLunation ; 0 # 唐代以前平朔暦(元嘉暦)
441
- else ; 15 # 現代の旧暦
442
- end
443
- end
444
-
445
- # 具注暦の配置
446
- @index_g = NoteRange[@range][1]
447
-
448
- # 七十二候
449
- @index_s = NoteRange[@range][2]
450
-
451
- # その他の属性
452
- @year = year
453
- @precision = precision
454
- @cal4note = cal4note
455
- @o_date = date
456
- @l_date = @cal4note.l_calendar ^ date
457
- @m_date = date.frame.kind_of?(When::CalendarTypes::Christian) ? @l_date : @o_date
458
- @s_date = @cal4note.s_calendar ^ date
459
- end
460
- end
461
-
462
- NoteMethods = [:year_notes, :month_notes, :day_notes]
463
-
464
- # 暦注の計算
465
- #
466
- # @param [When::TM::TemporalPosition] date 暦注を計算する日時
467
- # (date が When::TM::TemporalPosition でない場合、When::TM::TemporalPosition に変換して使用する)
468
- # @param [Hash] options
469
- # :indices, :notes およびその他のキー => {When::CalendarNote#notes} を参照
470
- #
471
- # @return [Hash] :notes が String の場合
472
- # @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合
473
- # @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合
474
- # @note return 値の [Hash] の要素は下記の通り
475
- # :note => 暦注要素 (When::CalendarTypes::Japanese::Note)
476
- # :value => 暦注の値 (String or When::BasicTypes::M17n または、その Array)
477
- # :position => 具注暦でのその暦注の配置場所(String)
478
- #
479
- def notes(date, options={})
480
- dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
481
- NotesContainer.register(indices.map {|i|
482
- next [] unless i <= dates.precision
483
- send(NoteMethods[i-1], dates, notes[i-1], conditions)
484
- }, persistence, date.to_i)
485
- end
486
-
487
- # 太陽の位置 => 日時
488
- #
489
- # @param [When::TM::TemporalPosition] date 探す基準とする日時
490
- # @param [Array<Numeric>] parameter 太陽の位置の分子と分母( num, den)
491
- #
492
- # num 分子 (デフォルト 0 : 基準日時直後の春分)
493
- #
494
- # den 分母 (デフォルト 360 : 検索範囲の長さ)
495
- #
496
- # @param [String] parameter 太陽の位置の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(春分))
497
- # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
498
- #
499
- # @return [When::TM::CalDate] date またはその直後に太陽の位置が指定の値になる日時
500
- #
501
- def term(date, parameter=nil, precision=date.precision)
502
- dates = _to_date_for_note(date)
503
- result = dates.cal4note.s_terms.term(date, parameter)
504
- patch = SolarTerms::Patch[result.to_i]
505
- return result unless patch
506
- num, den = parameter.kind_of?(String) ? parameter.split('/', 2) : parameter
507
- num = (num || 0).to_f
508
- den = (den || 360).to_f
509
- diff = (num - patch[0] + 1) % den - 1
510
- return result if diff == 0
511
- patched = result + When::P1D * diff
512
- result.cal_date[0..-2] = patched.cal_date[0..-2]
513
- result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
514
- result
515
- end
516
-
517
- # 月の位相 => 日時
518
- #
519
- # @param [When::TM::TemporalPosition] date 探す基準とする日時
520
- # @param [Array<Numeric>] parameter 月の位相の分子と分母( num, den)
521
- #
522
- # num 分子 (デフォルト 0 : 基準日時直後の朔)
523
- #
524
- # den 分母 (デフォルト 30 : 検索範囲の長さ)
525
- #
526
- # @param [String] parameter 月の位相の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(朔))
527
- # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
528
- #
529
- # @return [When::TM::CalDate] date またはその直後に月の位相が指定の値になる日時
530
- #
531
- def phase(date, parameter=nil, precision=date.precision)
532
- dates = _to_date_for_note(date)
533
- note = dates.cal4note.l_phases
534
- result = note.phase(date, parameter)
535
- return result if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
536
-
537
- time = note.phase(date, parameter, When::SYSTEM)
538
- cn = note.formula.time_to_cn(time) % 1
539
- case cn
540
- when 0..0.0001, 0.9999..1 # 朔
541
- return result if result.cal_date[-1] == 1
542
- diff = result.cal_date[-1] < 15 ? -1 : +1
543
- when 0.2..0.8 # 弦、望
544
- return result unless note.formula.kind_of?(When::Ephemeris::ChineseTrueLunation)
545
- return result if time.clk_time.universal_time >= When::TM::Duration::DAY/4 # 午前6時以降
546
- diff = -1
547
- else # その他
548
- return result
549
- end
550
-
551
- patched = result + When::P1D * diff
552
- result.cal_date[0..-2] = patched.cal_date[0..-2]
553
- result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
554
- result
555
- end
556
-
557
- private
558
-
559
- # オブジェクトの正規化
560
- def _normalize(args=[], options={})
561
- @prime ||= [%w(干支), %w(月名), %w(七曜 干支 六曜 廿四節気 祝祭日)]
562
- super
563
- end
564
-
565
- # 年の暦注
566
- def year_notes(dates, notes, conditions={})
567
- _note_values(dates, notes, _all_keys[-3], _elements[-3]) do |dates, focused_notes, notes_hash|
568
-
569
- focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-3]
570
- root = When.Resource('_co:Common')
571
-
572
- # 干支
573
- residue = (dates.precision < When::DAY ? dates.o_date : dates.s_date).most_significant_coordinate - 4
574
- notes_hash['干支'] = root['干支'][residue % 60]
575
- notes_hash['干'] = root['干' ][residue % 10]
576
- notes_hash['支'] = root['支' ][residue % 12]
577
-
578
- # 廿八宿
579
- notes_hash['廿八宿'] ||= root['宿'][(residue+18) % 28]
580
-
581
- # 九星
582
- notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.year(residue)]
583
-
584
- # 大小
585
- unless notes_hash['大小']
586
- year = dates.o_date.floor(When::YEAR)
587
- month = year.floor(When::MONTH)
588
- pattern = ''
589
- while year == month
590
- length = month.length(When::MONTH)
591
- length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
592
- pattern += '' if month[When::MONTH] * 0 == 1
593
- pattern += MonthPattern[length] || '改'
594
- month += When::P1M
595
- end
596
- notes_hash['大小'] = "#{pattern}(#{year.length(When::YEAR)})"
597
- end
598
-
599
- # その他
600
- [notes_hash['干支'], notes_hash['干'], notes_hash['']].each do |note|
601
- note._year_notes(notes_hash, dates, conditions)
602
- end
603
- notes_hash
604
- end
605
- end
606
-
607
- # 月の暦注
608
- def month_notes(dates, notes, conditions={})
609
- _note_values(dates, notes, _all_keys[-2], _elements[-2]) do |dates, focused_notes, notes_hash|
610
-
611
- focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-2]
612
- root = When.Resource('_co:Common')
613
-
614
- # 干支
615
- residue = month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.m_date)
616
- notes_hash['干支'] = root['干支'][residue % 60]
617
- notes_hash['干'] = root['干' ][residue % 10]
618
- notes_hash['支'] = root['支' ][residue % 12]
619
-
620
- # 廿八宿
621
- notes_hash['廿八宿'] ||= root['宿'][(residue+6) % 28]
622
-
623
- # 九星
624
- notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.month(
625
- month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.s_date))]
626
-
627
- # 大小
628
- unless notes_hash['大小']
629
- length = dates.o_date.length(When::MONTH)
630
- length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
631
- notes_hash['大小'] = "#{dates.o_date[When::MONTH]*0==1 ? '' : ''}#{MonthPattern[length] || '改'}(#{length.abs})"
632
- end
633
-
634
- # その他
635
- [notes_hash['干支'], notes_hash[''], notes_hash['支'], JapaneseLuniSolarNote].each do |note|
636
- note._month_notes(notes_hash, dates, conditions)
637
- end
638
- notes_hash
639
- end
640
- end
641
-
642
- # 日の暦注
643
- def day_notes(dates, notes, conditions={})
644
- _note_values(dates, notes, _all_keys[-1], _elements[-1]) do |dates, focused_notes, notes_hash|
645
-
646
- focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-1]
647
- root = When.Resource('_co:Common')
648
-
649
- # 干支
650
- residue = dates.s_date.to_i-11
651
- notes_hash['干支'] = root['干支'][residue % 60]
652
- notes_hash['干'] = root['干' ][residue % 10]
653
- notes_hash['支'] = root['支' ][residue % 12]
654
-
655
- # その他
656
- [SolarTerms, LunarPhases, notes_hash['干支'], notes_hash['干'], notes_hash['支'],
657
- JapaneseLuniSolarNote, JapaneseSolarNote].each do |note|
658
- note._day_notes(notes_hash, dates, conditions)
659
- end
660
-
661
- # 七曜
662
- notes_hash['七曜'] ||= root['Week'][dates.s_date.to_i % 7]
663
-
664
- # 廿七宿
665
- notes_hash['廿七宿'] = _residue27(notes_hash['廿七宿'], root)
666
-
667
- # 廿八宿 / 鬼宿
668
- notes_hash['廿八宿'] ||= root['宿'][(dates.s_date.to_i+11) % 28]
669
- notes_hash['鬼宿'] ||= /鬼/ =~ notes_hash['廿八宿'].to_s ? '鬼宿' : nil
670
-
671
- # 九星
672
- notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.day(dates.s_date, dates.cal4note.s_terms)]
673
-
674
- notes_hash
675
- end
676
- end
677
-
678
- #
679
- # 日本暦日情報オブジェクトの生成
680
- #
681
- # @note 対となる太陽暦のある太陰太陽暦はそのまま(太陰太陽暦,太陽暦)の対
682
- # そうでなければ、採用する対を年代により選択する
683
- #
684
- def _to_date_for_note(date)
685
- if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
686
- return Dates.new(date) if date.frame.twin
687
- o_date = date
688
- else
689
- o_date = self.class._to_japanese_date(date)
690
- return nil unless o_date
691
- end
692
- year = o_date.most_significant_coordinate
693
- NoteTypes.each do |line|
694
- return Dates.new(o_date, year, date.precision, line[1]) if year >= line[0]
695
- end
696
- nil
697
- end
698
-
699
- #
700
- # 任意の暦を日本年号付暦日に変換
701
- #
702
- def self._to_japanese_date(date)
703
- return date if date._attr[:query] && date._attr[:query]['area'].to_s =~ /日本/
704
- (date^ When.era(:area=>'日本')).each do |list|
705
- return list[0] if list[0]
706
- end
707
- nil
708
- end
709
-
710
- #
711
- # 廿七宿を Resudue
712
- #
713
- def _residue27(index, root)
714
- return index unless index.kind_of?(Integer)
715
- root['宿'][index]
716
- end
717
-
718
- #
719
- # 月の干支
720
- #
721
- def month_stem_branch(date)
722
- date.most_significant_coordinate*12+(date.cal_date[1] * 1) +
723
- (date.frame.kind_of?(When::CalendarTypes::Christian) ? 12 : 13)
724
- end
725
- end
726
-
727
- #
728
- # 太陽暦の暦注・祝祭日
729
- #
730
- class JapaneseSolarNote < self
731
-
732
- #
733
- # 祝祭日一覧
734
- #
735
- NotesList = {
736
- [ 1, 1] => [[1868..1872, '元旦'], [1874..1948, '四方拝'], [1949..2100, '元日']],
737
- [ 1, 3] => [[1874..1948, '元始祭']],
738
- [ 1, 5] => [[1874..1948, '新年宴会']],
739
- [ 1,-2] => [[2000..2100, '成人の日']],
740
- [ 1,15] => [[1868..1872, '小正月'], [1949..1999, '成人の日']],
741
- [ 1,29] => [[1873..1873, '神武天皇即位日']],
742
- [ 1,30] => [[1874..1912, '孝明天皇祭']],
743
- [ 2,11] => [[1874..1948, '紀元節'], [1967..2100, '建国記念の日']],
744
- [ 2,24] => [[1989..1989, '昭和天皇の大喪の礼']],
745
- [ 3, 3] => [[1868..1872, '弥生節句']],
746
- [ 3, 0] => [[1879..1948, '春季皇霊祭'], [1949..2100, '春分の日']],
747
- [ 4, 3] => [[1874..1948, '神武天皇祭']],
748
- [ 4,10] => [[1959..1959, '皇太子明仁親王の結婚の儀']],
749
- [ 4,29] => [[1927..1948, '天長節'], [1949..1988, '天皇誕生日'], [1989..2006, 'みどりの日'], [2007..2100, '昭和の日']],
750
- [ 5, 3] => [[1949..2100, '憲法記念日']],
751
- [ 5, 4] => [[2007..2100, 'みどりの日']],
752
- [ 5, 5] => [[1868..1872, '端午節句'], [1949..2100, 'こどもの日']],
753
- [ 6, 9] => [[1993..1993, '皇太子徳仁親王の結婚の儀']],
754
- [ 7, 7] => [[1868..1872, '七夕節句']],
755
- [ 7,15] => [[1868..1872, 'お盆']],
756
- [ 7,20] => [[1996..2002, '海の日']],
757
- [ 7,-3] => [[2003..2100, '海の日']],
758
- [ 7,30] => [[1913..1926, '明治天皇祭']],
759
- [ 8, 1] => [[1868..1872, '田実節句']],
760
- [ 8,11] => [[2016..2100, '山の日']],
761
- [ 8,31] => [[1913..1926, '天長節']],
762
- [ 9, 9] => [[1868..1872, '重陽節句']],
763
- [ 9,15] => [[1966..2002, '敬老の日']],
764
- [ 9,-3] => [[2003..2100, '敬老の日']],
765
- [ 9,17] => [[1874..1878, '神嘗祭']],
766
- [ 9, 0] => [[1878..1947, '秋季皇霊祭'], [1948..2100, '秋分の日']],
767
- [10,10] => [[1966..1999, '体育の日']],
768
- [10,-2] => [[2000..2100, '体育の日']],
769
- [10,17] => [[1879..1947, '神嘗祭']],
770
- [10,31] => [[1913..1926, '天長節祝日']],
771
- [11, 3] => [[1873..1911, '天長節'], [1927..1947, '明治節'], [1948..2100, '文化の日']],
772
- [11,10] => [[1915..1915, '即位の礼'], [1928..1928, '即位の礼']],
773
- [11,12] => [[1990..1990, '即位の礼正殿の儀']],
774
- [11,14] => [[1915..1915, '大嘗祭'], [1928..1928, '大嘗祭']],
775
- [11,16] => [[1915..1915, '大饗第1日'], [1928..1928, '大饗第1日']],
776
- [11,23] => [[1873..1947, '新嘗祭'], [1948..2100, '勤労感謝の日']],
777
- [12,23] => [[1989..2100, '天皇誕生日']],
778
- [12,25] => [[1927..1947, '大正天皇祭']]
779
- }
780
-
781
- # @private
782
- Long = {3=>0, 9=>180}
783
-
784
- class << self
785
-
786
- # 日の暦注 - 祝祭日の計算
787
- # @private
788
- def _day_notes(notes, dates, conditions={})
789
- # 明治維新以降の実暦日のみ扱う
790
- return notes if dates.o_date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
791
- year = dates.o_date.most_significant_coordinate
792
- return notes unless year >= 1868
793
-
794
- # 春分の日と秋分の日を祝祭日に加える
795
- long = Long[dates.o_date.cal_date[1]] if year >= 1878
796
- if long
797
- date = When.when?(dates.o_date.to_cal_date.to_s,
798
- {:frame=>dates.o_date.frame,
799
- :clock=>dates.s_date.frame.time_basis})
800
- term = dates.cal4note.s_terms.term(date.floor(When::MONTH,
801
- When::DAY), [long,360]).cal_date[1..2]
802
- list = NotesList.dup
803
- list[term] = list[[term[0],0]]
804
- else
805
- list = NotesList
806
- end
807
-
808
- # 「国民の休日」制定以前
809
- notes['祝祭日'] ||= _holiday(list, dates.o_date, '振替休日')
810
- return notes if notes['祝祭日'] || year < 1988
811
-
812
- # 「国民の休日」制定以後
813
- duration = When.Duration('P1D')
814
- [duration, -duration].each do |d|
815
- return notes unless _holiday(list, dates.o_date + d)
816
- end
817
- notes['祝祭日'] = '国民の休日'
818
- return notes
819
- end
820
-
821
- private
822
-
823
- # 振替休日とハッピーマンデーを考慮した祝祭日
824
- def _holiday(list, date, alternate=nil)
825
- y = date.most_significant_coordinate
826
- m, d = date.cal_date[1..2]
827
-
828
- # 「振替休日」制定以前
829
- note = _note(list, y, m, d)
830
- return note if note || y < 1973
831
-
832
- # 「振替休日」制定以降
833
- case date.to_i % 7
834
- when 0 # 月曜
835
- # 振替休日
836
- note = _note(list, y, m, d-1)
837
- return alternate if note
838
- # ハッピーマンデー
839
- note = _note(list, y, m, -((d-1)/7 + 1))
840
- return note if note
841
- when 1,2 # 火曜・水曜
842
- # 振替休日
843
- return alternate if y >= 2007 && m == 5 && d == 6
844
- end
845
- end
846
-
847
- # 振替休日とハッピーマンデーを考慮しない祝祭日
848
- def _note(list, year, month, day)
849
- return nil if day == 0
850
- year = [year, 2100].min
851
- note = list[[month,day]]
852
- return nil unless note
853
- note.each do |range|
854
- return range[1] if range[0].include?(year)
855
- end
856
- return nil
857
- end
858
- end
859
- end
860
-
861
- #
862
- # 太陰太陽暦の暦注
863
- #
864
- class JapaneseLuniSolarNote < self
865
-
866
- # 変換表 月日→27宿
867
- StarMansions = [ # 正 2 3 4 5 6 7 8 9 10 11 12
868
- [11, 13, 15, 17, 19, 21, 24, 0, 2, 4, 7, 9], # 0 : 本月本説 室12奎14胃16畢18參20鬼22張25角00氐02心04斗07虛10
869
- [ 5, 3, 1, 25, 23, 21, 19, 16, 14, 11, 8, 7], # 1 : 本月異説 尾05房03亢01翼26星24鬼22參20昴17婁15室12女09斗07
870
- [14, 16, 18, 20, 22, 24, 0, 3, 5, 7, 10, 12], # 2 : 閏月本説 婁15昴17觜19井21柳23張25角00房03尾05斗07危11壁13
871
- [12, 14, 16, 18, 19, 21, 24, 0, 2, 5, 8, 10], # 3 : 閏月異説 壁13婁15昴17觜19參20鬼22張25角00氐02尾05女09危11
872
- [14, 16, 18, 23, 22, 24, 0, 3, 5, 7, 8, 12] # 4 : 閏月本説(元) (星24) (女09)
873
- ]
874
-
875
- # 変換表 27宿→28宿
876
- StarMansionIndex = (0..7).to_a + (9..27).to_a
877
-
878
- # 七曜と27宿で決まる暦注
879
- WeekDepended = {
880
- # 日 月 火 水 木 金 土
881
- '甘露' => [26, 17, 5, 22, 21, 3, 23], # 軫27 畢18 尾05 柳23 鬼22 房03 星24
882
- '金剛峯' => [ 5, 8, 12, 16, 20, 24, 1], # 尾05 女09 壁13 昴17 井21 張25 亢01
883
- '羅刹' => [15, 21, 25, 19, 2, 13, 22] # 胃16 鬼22 翼26 参20 氐02 奎14 柳23
884
- }
885
-
886
- # 人神配当
887
- HumanBody = %w(足大指 外踝 股内 腰 口 手 内踝 腕 尻 腰背
888
- 鼻柱 髪際 牙歯 胃管 遍身 胸 気街 股内
889
- 足小指 足踝及胸、目下 肝及足 手陽明 足陽明 胸 膝 陰 膝晊 足跌)
890
-
891
- # 月の暦注
892
- # @private
893
- def self._month_notes(notes, dates, conditions={})
894
- # 月名
895
- notes['月名'] ||= dates.o_date.name('month')
896
- end
897
-
898
- # 日の暦注
899
- # @private
900
- def self._day_notes(notes, dates, conditions={})
901
-
902
- # 廿七宿
903
- m, l = [1,0].map {|f| dates.m_date.cal_date[1] * f}
904
- d = (StarMansions[l==1 ? (conditions[:i27]||0) :
905
- (conditions[:n27]||0)][m-1] + dates.m_date.cal_date[2] - 1) % 27
906
- notes['廿七宿'] ||= StarMansionIndex[d]
907
-
908
- # 甘露 / 金剛峯 / 羅刹
909
- w = (dates.m_date.to_i + 1) % 7
910
- ['甘露', '金剛峯', '羅刹'].each do |c|
911
- notes[c] = c if d == WeekDepended[c][w]
912
- end
913
-
914
- # 三寶吉・神吉・雑事吉
915
- notes['神吉'] = notes['雑事吉'] = notes['三寶吉'] = nil if notes['没' ] || notes['滅' ]
916
- notes['神吉'] = notes['雑事吉'] = nil if notes['日食'] || notes['月食'] || notes['往亡']
917
- notes['三寶吉'] = nil if !notes['甘露'] && (notes['羅刹'] || notes['日食'] || notes['月食'])
918
- notes['三寶吉'] = notes['甘露'] ? '三寶吉' : nil if /\+/ =~ notes['三寶吉'].to_s
919
- notes['三寶吉'] = '三吉' if notes['三寶吉'] && dates.range >= 8 # 鎌倉以降
920
-
921
- # 除手足甲 & 道虚・人神配当
922
- y,m0,d0 = dates.m_date.cal_date
923
- misoka = m0 != (dates.m_date + When.Duration('P1D')).cal_date[1] if d0 == 29
924
- notes['除手足甲'] = '除手足甲' if ([6,16,30].include?(d0) || misoka) && !(conditions[:kana] || notes[''] || notes['滅'] || notes['凶会'])
925
- notes['道虚'] = '道虚' if d0 % 6 == 0 || misoka
926
- notes['人神配当'] = HumanBody[d0-1]
927
-
928
- # 仮名暦
929
- notes['赤舌' ] ||= d0 == (m * 5 - 3) % 6 + 1 ? '赤舌' : nil
930
- notes['大赤' ] ||= d0 % 8 == (m * 7 - 3) % 8 ? '大赤' : nil
931
- notes['不成就'] ||= d0 % 8 == [6,3,2,1,4,5][m % 6] || (misoka && m % 6 == 0) ? '不成就' : nil # 『現代こよみ読み解き事典』 for 不成就日
932
- notes['六曜' ] ||= When::RokuyoWeek.rokuyo_value(m, d0)
933
- notes
934
- end
935
- end
936
-
937
- #
938
- # 月の位相による暦注
939
- #
940
- class Japanese::LunarPhases < LunarPhases
941
-
942
- # 日の暦注
943
- # @private
944
- def self._day_notes(notes, dates, conditions={})
945
- date = When.when?(dates.o_date.to_cal_date.to_s,
946
- {:frame=>dates.o_date.frame,
947
- :clock=>dates.l_date.frame.time_basis})
948
- phase, metsu = dates.cal4note.l_phases.position(date)
949
-
950
- #
951
- notes['滅'] = metsu == 2 && dates.range < 11 ? '滅' : nil
952
-
953
- # 月相
954
- unless notes['月相']
955
- # イベントの判定
956
- formula = dates.cal4note.l_phases.formula
957
- clock = formula.kind_of?(When::Ephemeris::ChineseTrueLunation) &&
958
- (5..25).include?(dates.l_date.cal_date[2]) ?
959
- When.Clock(-21600) : # 唐代暦法の望弦は午前6時を日の境界とする
960
- dates.l_date.frame._time_basis[-1] # その他(進朔も考慮した時刻)
961
- odate = When.when?(dates.o_date.to_cal_date.to_s, {:frame=>dates.o_date.frame, :clock=>clock})
962
- phases = formula.phase_range(odate)
963
- thitis = phases.map {|phase| (phase % 1) * 30.0}
964
- note = if thitis[0] >= thitis[1]
965
- dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) || conditions[:shoyo] ? '朔' : nil
966
- else
967
- range = thitis[0]...thitis[1]
968
- range.include?( 7.5) ? '上弦' :
969
- range.include?(15.0) ? '望' :
970
- range.include?(22.5) ? '下弦' : nil
971
- end
972
-
973
- # 結果の反映
974
- if conditions[:shoyo]
975
- # :shoyo true ならイベント時刻も返す
976
- notes['月相'] = if note
977
- etime = formula._to_seed_type(formula.cn_to_time((phases[1] * 4).floor / 4.0), odate)
978
- if formula.respond_to?(:lunation_length) && formula.lunation_length.kind_of?(Rational)
979
- shoyo = etime.clk_time.universal_time
980
- shoyo += When::TM::Duration::DAY if (0...clock.universal_time).include?(shoyo)
981
- shoyo = (shoyo / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
982
- shoyo = shoyo.to_i if shoyo == shoyo.to_i
983
- "#{note}(#{shoyo}/#{formula.denominator})"
984
- else
985
- etime.events = [note]
986
- etime
987
- end
988
- else
989
- nil
990
- end
991
- else
992
- # :shoyo false ならイベン名のみ返す
993
- notes['月相'] = note
994
- end
995
- end
996
-
997
- # 月食
998
- notes['月食'] = nil # 計算できないので、偽としておく
999
- notes
1000
- end
1001
- end
1002
-
1003
- #
1004
- # 太陽黄経による暦注
1005
- #
1006
- class Japanese::SolarTerms < SolarTerms
1007
-
1008
- Notes12 = %w(正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月)
1009
-
1010
- Notes10 = [
1011
- %w(初伏 初伏),
1012
- %w(仲伏 中伏),
1013
- %w(後伏 末伏)]
1014
-
1015
- Notes60_A = [
1016
- # +0
1017
- '侯小過外', # 315 : 正月
1018
- '侯需外', # 345 : 二月
1019
- '侯豫外', # 15 : 三月
1020
- '侯旅外', # 45 : 四月
1021
- '侯大有外', # 75 : 五月
1022
- '侯鼎外', # 105 : 六月
1023
- '侯恆外', # 135 : 七月
1024
- '侯巽外', # 165 : 八月
1025
- '侯歸妹外', # 195 : 九月
1026
- '侯艮外', # 225 : 十月
1027
- '侯未濟外', # 255 : 十一月
1028
- '侯屯外' # 285 : 十二月
1029
- ]
1030
-
1031
- Notes60_B = [
1032
- # +3 +9 +15 +21 +27
1033
- '大夫蒙', '卿益', '公漸', '辟泰', '侯需内', # 315 : 正月
1034
- '大夫随', '卿晋', '公解', '辟大壯', '侯豫内', # 345 : 二月
1035
- '大夫訟', '卿蠱', '公革', '辟夬', '侯旅内', # 15 : 三月
1036
- '大夫師', '卿比', '公小畜', '辟乾', '侯大有内', # 45 : 四月
1037
- '大夫家人', '卿井', '公咸', '辟姤', '侯鼎内', # 75 : 五月
1038
- '大夫豊', '卿渙', '公履', '辟遯', '侯恆内', # 105 : 六月
1039
- '大夫節', '卿同人', '公損', '辟否', '侯巽内', # 135 : 七月
1040
- '大夫萃', '卿大畜', '公賁', '辟観', '侯歸妹内', # 165 : 八月
1041
- '大夫無妄', '卿明夷', '公困', '辟剥', '侯艮内', # 195 : 九月
1042
- '大夫既濟', '卿噬嗑', '公大過', '辟坤', '侯未濟内', # 225 : 十月
1043
- '大不蹇', '卿頤', '公中孚', '辟復', '侯屯内', # 255 : 十一月
1044
- '大夫謙', '卿睽', '公升', '辟臨', '侯小過内' # 285 : 十二月
1045
- ]
1046
-
1047
- Notes72 = [
1048
- # 儀鳳暦 宣明暦(中国) 宣明暦 貞享暦 宝暦暦・寛政暦 略本暦
1049
- # 315 : 正月
1050
- %w(雞始乳 東風解凍 東風解凍 東風解凍 東風解凍 東風解凍),
1051
- %w(東風解凍 蟄始振 蟄虫始振 梅花乃芳 黄鶯睍睆 黄鶯睍睆),
1052
- %w(蟄蟲始振 魚上氷 魚上氷 魚上氷 魚上氷 魚上氷),
1053
- %w(魚上冰 獺祭魚 獺祭魚 土脈潤起 土脈潤起 土脉潤起),
1054
- %w(獺祭魚 鴻雁来 鴻雁来 霞彩碧空 霞始靆 霞始靆),
1055
- %w(鴻雁來 草木萌動 草木萌動 草木萌動 草木萌動 草木萌動),
1056
-
1057
- # 345 : 二月
1058
- %w(始雨水 桃始華 桃始華 蟄虫啓戸 蟄虫啓戸 蟄虫啓戸),
1059
- %w(桃始花 倉庚鳴 倉庚鳴 寒雨間熟 桃始笑 桃始笑),
1060
- %w(倉庚鳴 鷹化爲鳩 鷹化爲鳩 菜虫化蝶 菜虫化蝶 菜虫化蝶),
1061
- %w(鷹化爲鳩 玄鳥至 玄鳥至 雀始巣 雀始巣 雀始巣),
1062
- %w(玄鳥至 雷乃發聲 雷乃發聲 雷乃発声 桜始開 桜始開),
1063
- %w(雷始發聲 始電 始電 桜始開桃始笑 雷乃発声 雷乃発声),
1064
-
1065
- # 15 : 三月
1066
- %w(始雷 桐始華 桐始華 玄鳥至 玄鳥至 玄鳥至),
1067
- %w(蟄蟲咸動 田鼠化爲鴑 田鼠化爲鴑 鴻雁北 鴻雁北 鴻雁北),
1068
- %w(蟄蟲啓戸 虹始見 虹始見 虹始見 虹始見 虹始見),
1069
- %w(桐始華 萍始生 萍始生 葭始生 葭始生 葭始生),
1070
- %w(田鼠化爲鴑 鳴鳩拂其羽 鳴鳩拂其羽 牡丹華 霜止出苗 霜止出苗),
1071
- %w(虹始見 戴勝降于桑 戴勝降于桑 霜止出苗 牡丹華 牡丹華),
1072
-
1073
- # 45 : 四月
1074
- %w(萍始生 螻蟈鳴 螻蟈鳴 鵑始鳴 鼃始鳴 鼃始鳴),
1075
- %w(戴勝降于桑 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出),
1076
- %w(螻蟈鳴 王瓜生 王瓜生 竹笋生 竹笋生 竹笋生),
1077
- %w(蚯蚓出 苦菜秀 苦菜秀 蚕起食桑 蚕起食桑 蚕起食桑),
1078
- %w(王瓜生 靡草死 靡草死 紅花栄 紅花栄 紅花栄),
1079
- %w(苦菜秀 小暑至 小暑至 麦秋至 麦秋至 麦秋至),
1080
-
1081
- # 75 : 五月
1082
- %w(靡草死 螳蜋生 螳蜋生 螳螂生 螳螂生 螳螂生),
1083
- %w(小暑至 鵙始鳴 鵙始鳴 腐草為螢 腐草為螢 腐草為螢),
1084
- %w(螳螂生 反舌無聲 反舌無聲 梅始黄 梅子黄 梅子黄),
1085
- %w(鵙始鳴 鹿角解 鹿角解 乃東枯 乃東枯 乃東枯),
1086
- %w(反舌無聲 蜩始鳴 蜩始鳴 分龍雨 菖蒲華 菖蒲華),
1087
- %w(鹿角解 半夏生 半夏生 半夏生 半夏生 半夏生),
1088
-
1089
- # 105 : 六月
1090
- %w(蟬始鳴 温風至 温風至 温風至 温風至 温風至),
1091
- %w(半夏生 蟋蟀居壁 蟋蟀居壁 蓮始華 蓮始華 蓮始開),
1092
- %w(木槿榮 鷹乃學習 鷹乃學習 鷹乃学習 鷹乃学習 鷹乃学習),
1093
- %w(温風至 腐草爲螢 腐草爲螢 桐始結花 桐始結花 桐始結花),
1094
- %w(蟋蟀居壁 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑),
1095
- %w(鷹乃學習 大雨時行 大雨時行 大雨時行 大雨時行 大雨時行),
1096
-
1097
- # 135 : 七月
1098
- %w(腐草爲螢 涼風至 涼風至 涼風至 涼風至 涼風至),
1099
- %w(土潤溽暑 白露降 白露降 山沢浮雲 寒蝉鳴 寒蝉鳴),
1100
- %w(涼風至 寒蟬鳴 寒蟬鳴 霧色已成 蒙霧升降 蒙霧升降),
1101
- %w(白露降 鷹乃祭鳥 鷹乃祭鳥 寒蝉鳴 綿柎開 綿柎開),
1102
- %w(寒蟬鳴 天地始肅 天地始肅 天地始粛 天地始粛 天地始粛),
1103
- %w(鷹祭鳥 禾乃登 禾乃登 禾乃登 禾乃登 禾乃登),
1104
-
1105
- # 165 : 八月
1106
- %w(天地始肅 鴻雁来 鴻雁来 草露白 草露白 草露白),
1107
- %w(暴風至 玄鳥歸 玄鳥歸 鶺鴒鳴 鶺鴒鳴 鶺鴒鳴),
1108
- %w(鴻雁來 群鳥養羞 群鳥養羞 玄鳥去 玄鳥去 玄鳥去),
1109
- %w(玄鳥歸 雷乃收聲 雷乃收聲 鴻雁来 雷乃収声 雷乃収声),
1110
- %w(羣鳥養羞 蟄蟲坏戸 蟄蟲坏戸 蟄虫坏戸 蟄虫坏戸 蟄虫坏戸),
1111
- %w(雷始收聲 水始涸 水始涸 水始涸 水始涸 水始涸),
1112
-
1113
- # 195 : 九月
1114
- %w(蟄蟲坏戸 鴻雁來賓 鴻雁來賓 棗栗零 鴻雁来 鴻雁来),
1115
- %w(陰氣方盛 雀入大水爲蛤 雀入大水爲蛤 蟋蟀在戸 菊花開 菊花開),
1116
- %w(陽氣始衰 菊有黄花 菊有黄花 菊花開 蟋蟀在戸 蟋蟀在戸),
1117
- %w(水始涸 豺乃祭獸 豺乃祭獸 霜始降 霜始降 霜始降),
1118
- %w(鴻雁來賓 草木黄落 草木黄落 蔦楓紅葉 霎時施 霎時施),
1119
- %w(雀入水爲蛤 蟄蟲咸俯 蟄蟲咸俯 鶯雛鳴 楓蔦黄 楓蔦黄),
1120
-
1121
- # 225 : 十月
1122
- %w(菊有黄花 水始冰 水始冰 山茶始開 山茶始開 山茶始開),
1123
- %w(豺祭獣 地始凍 地始凍 地始凍 地始凍 地始凍),
1124
- %w(水始冰 野雞入大水爲蜃 野雞入大水爲蜃 霎乃降 金盞香 金盞香),
1125
- %w(地始凍 虹藏不見 虹藏不見 虹蔵不見 虹蔵不見 虹蔵不見),
1126
- %w(野雞入水爲蜃 天氣上騰地氣下降 天氣上騰地氣下降 樹葉咸落 朔風払葉 朔風払葉),
1127
- %w(虹藏不見 閉塞而成冬 閉塞而成冬 橘始黄 橘始黄 橘始黄),
1128
-
1129
- # 255 : 十一月
1130
- %w(冰益壯 鶡鳥不鳴 鶡鳥不鳴 閉塞成冬 閉塞成冬 閉塞成冬),
1131
- %w(地始坼 虎始交 虎始交 熊蟄穴 熊蟄穴 熊蟄穴),
1132
- %w(鶡鳥不鳴 茘挺生 茘挺生 水仙開 鱖魚群 鱖魚群),
1133
- %w(虎始交 蚯蚓結 蚯蚓結 乃東生 乃東生 乃東生),
1134
- %w(芒始生 麋角解 麋角解 麋角解 麋角解 麋角解),
1135
- %w(茘挺生 水泉動 水泉動 雪下出麦 雪下出麦 雪下出麦),
1136
-
1137
- # 285 : 十二月
1138
- %w(蚯蚓結 雁北郷 雁北郷 芹乃栄 芹乃栄 芹乃栄),
1139
- %w(麋角解 鵲始巣 鵲始巣 風気乃行 水泉動 水泉動),
1140
- %w(水泉動 野雞始鴝 野雞始鴝 雉始雊 雉始雊 雉始雊),
1141
- %w(雁北郷 雞始乳 雞始乳 款冬華 款冬華 款冬華),
1142
- %w(鵲始巣 鷙鳥厲疾 鷙鳥厲疾 水沢腹堅 水沢腹堅 水沢腹堅),
1143
- %w(雉始雊 水澤腹堅 水澤腹堅 鶏始乳 鶏始乳 鶏始乳)
1144
- ]
1145
-
1146
- # 計算結果の修正
1147
- # @private
1148
- Patch = {
1149
- 2039054 => [149.0, 1], # 貞観12(0870).07.17 [149.0, 0] 没
1150
- 2039055 => [150.0, 0], # 貞観12(0870).07.18 [150.0, 1] 処暑
1151
-
1152
- 2107233 => [ 29.0, 1], # 天喜05(1057).03.10 [ 29.0, 0] 没
1153
- 2107234 => [ 30.0, 0], # 天喜05(1057).03.11 [ 30.0, 1] 穀雨
1154
-
1155
- 2160437 => [269.0, 0], # 建仁02(1202).10=29 [270.0, 1] 冬至
1156
- 2160438 => [270.0, 1], # 建仁02(1202).11.01 [271.0, 1]
1157
- 2160439 => [271.0, 1], # 建仁02(1202).11.02 [272.0, 1]
1158
- 2160440 => [272.0, 1], # 建仁02(1202).11.03 [272.0, 0] 没
1159
-
1160
- 2175412 => [269.0, 1], # 寛元01(1243).11.03 [269.0, 0] 没
1161
- 2175413 => [270.0, 0], # 寛元01(1243).11.04 [270.0, 1] 冬至
1162
-
1163
- 2189200 => [179.0, 0], # 弘安04(1281).07=30 [180.0, 1] 秋分
1164
- 2189201 => [180.0, 1], # 弘安04(1281).08.01 [181.0, 1]
1165
- 2189202 => [181.0, 1], # 弘安04(1281).08.02 [181.0, 0] 没
1166
-
1167
- 2243577 => [136.0, 0], # 永享02(1430).07.11 [136.0, 1] (立秋の翌日)
1168
- 2243578 => [136.0, 1], # 永享02(1430).07.12 [137.0, 1]
1169
- 2243579 => [137.0, 1], # 永享02(1430).07.13 [138.0, 1]
1170
- 2243580 => [138.0, 1], # 永享02(1430).07.14 [139.0, 1]
1171
- 2243581 => [139.0, 1], # 永享02(1430).07.15 [140.0, 1]
1172
- 2243582 => [140.0, 1], # 永享02(1430).07.16 [141.0, 1]
1173
- 2243583 => [141.0, 1], # 永享02(1430).07.17 [142.0, 1]
1174
- 2243584 => [142.0, 1], # 永享02(1430).07.18 [143.0, 1]
1175
- 2243585 => [143.0, 1], # 永享02(1430).07.19 [144.0, 1]
1176
- 2243586 => [144.0, 1], # 永享02(1430).07.20 [145.0, 1]
1177
- 2243587 => [145.0, 1], # 永享02(1430).07.21 [146.0, 1]
1178
- 2243588 => [146.0, 1], # 永享02(1430).07.22 [147.0, 1]
1179
- 2243589 => [147.0, 1], # 永享02(1430).07.23 [148.0, 1]
1180
- 2243590 => [148.0, 1], # 永享02(1430).07.24 [149.0, 1]
1181
- 2243591 => [149.0, 1], # 永享02(1430).07.25 [149.0, 0] 没 (処暑の前日)
1182
-
1183
- 2311770 => [ 29.0, 1], # 元和03(1617).03.18 [ 29.0, 0] 没
1184
- 2311771 => [ 30.0, 0], # 元和03(1617).03.19 [ 30.0, 1] 穀雨
1185
-
1186
- 2396062 => [314.0, 0], # 弘化04(1847).12.30 [315.0, 1] 立春 (計算誤差の補正)
1187
- 2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0]
1188
-
1189
- 2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0]
1190
- 2397584 => [ 16.0, 0] # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
1191
- }
1192
-
1193
- class << self
1194
- # テスト用の属性
1195
- attr_writer :patch
1196
- private :patch=
1197
-
1198
- # 日の暦注
1199
- # @private
1200
- def _day_notes(notes, dates, conditions={})
1201
- date = When.when?(dates.o_date.to_cal_date.to_s,
1202
- {:frame=>dates.o_date.frame,
1203
- :clock=>dates.s_date.frame._time_basis[0]})
1204
- patch = (@patch || Patch)[date.to_i] unless dates.o_date.frame.respond_to?(:twin) &&
1205
- dates.o_date.frame.twin
1206
- longitude, motsu = patch ? patch : dates.cal4note.s_terms.position(date)
1207
-
1208
- # 三伏 -
1209
- #
1210
- # : 夏至から 20..29
1211
- # : 夏至から 30..39
1212
- # : 立秋から 0..9
1213
- if !notes['三伏'] && notes['干'].remainder == 6 # 庚
1214
- index = dates.range >= 11 ? 1 : 0
1215
- if 109 <= longitude && longitude <= 129 # 夏至から
1216
- term = dates.cal4note.s_terms.term(date, [-270,360])
1217
- diff = dates.s_date.to_i - term.to_i
1218
- notes['三伏'] = Notes10[0][index] if 20 <= diff && diff <= 29
1219
- notes['三伏'] = Notes10[1][index] if 30 <= diff && diff <= 39
1220
- elsif longitude == 135 # 立秋
1221
- notes['三伏'] = Notes10[2][index]
1222
- elsif 136 <= longitude && longitude <= 144 # 立秋から
1223
- term = dates.cal4note.s_terms.term(date, [-225,360])
1224
- diff = dates.s_date.to_i - term.to_i
1225
- notes['三伏'] = Notes10[2][index] if 0 < diff && diff <= 9
1226
- end
1227
- end
1228
-
1229
- # 社 - 戊
1230
- #
1231
- # 春秋分から -5..4
1232
- if !notes['社'] && notes['干'].remainder == 4 # 戊
1233
- if (longitude + 5) % 180 < 10 # 春秋分の近傍
1234
- term = dates.cal4note.s_terms.term(date - When.Duration('P5D'), [0,180])
1235
- diff = dates.s_date.to_i - term.to_i
1236
- notes['社'] = '社' if -5 <= diff && diff <= 4
1237
- end
1238
- end
1239
-
1240
- # -
1241
- #
1242
- # 大寒から -6..5
1243
- if !notes['臘'] && notes['支'].remainder == 4 # 辰
1244
- if (longitude - 339) % 360 < 12 # 大寒の近傍
1245
- term = dates.cal4note.s_terms.term(date - When.Duration('P6D'), [345,360])
1246
- diff = dates.s_date.to_i - term.to_i
1247
- notes['臘'] = '臘' if -6 <= diff && diff <= 5
1248
- end
1249
- end
1250
-
1251
- # 土用事
1252
- unless notes['土用事']
1253
- _longitude, _motsu = dates.cal4note.doyo ? dates.cal4note.s_terms.position(date, -dates.cal4note.doyo) :
1254
- [longitude, motsu]
1255
- if _motsu != 0 && _longitude % 90 == 27
1256
- notes['土用事'] =
1257
- begin
1258
- event_name =
1259
- case dates.range
1260
- when 0 ; '土用' # 元嘉暦以前
1261
- when 1 ; '土王' # 麟徳暦
1262
- when 2..10 ; '土用事' # 大衍暦~宣明暦
1263
- else ; '土用入' # 貞享暦以降
1264
- end
1265
- if conditions[:shoyo]
1266
- dates.cal4note.s_terms.event_time(date, event_name, [27-(dates.cal4note.doyo||0), 90])
1267
- else
1268
- event_name
1269
- end
1270
- end
1271
- end
1272
- end
1273
-
1274
- # 入梅 -
1275
- #
1276
- # 貞享2(1685) 芒種から 1..10 日の壬の日
1277
- # 元文5(1740) 芒種から 0..9 日の壬の日
1278
- # 明治9(1876)~ 太陽黄経80度
1279
- unless notes['入梅']
1280
- if dates.year >= 1876
1281
- notes['入梅'] = '入梅' if longitude == 80 && motsu == 1
1282
- elsif notes['干'].remainder == 8 # 壬
1283
- if (longitude - 75) % 360 <= 10 # 芒種の近傍
1284
- term = dates.cal4note.s_terms.term(date - When.Duration('P11D'), [75,360])
1285
- diff = dates.s_date.to_i - term.to_i
1286
- diff += 1 if dates.year >= 1740
1287
- notes['入梅'] = '入梅' if dates.range >= 11 && 1 <= diff && diff <= 10
1288
- end
1289
- end
1290
- end
1291
-
1292
- # 半夏生
1293
- #
1294
- # 太陽黄経100度
1295
- notes['半夏生'] ||= '半夏生' if longitude == 100 && motsu == 1
1296
-
1297
- # 立春を起算日とする雑節
1298
- #
1299
- unless notes['節分'] && notes['八十八夜'] && notes['二百十日'] && notes['二百廿日']
1300
- term = dates.cal4note.s_terms.term(date + When.Duration('P3D'), [-45,360])
1301
- case dates.s_date.to_i - term.to_i
1302
- when -1 ; notes['節分'] ||= '節分'
1303
- when 87 ; notes['八十八夜'] ||= '八十八夜'
1304
- when 209 ; notes['二百十日'] ||= '二百十日'
1305
- when 219 ; notes['二百廿日'] ||= '二百廿日'
1306
- end
1307
- end
1308
-
1309
- # 日食
1310
- notes['日食'] = nil # 計算できないので、偽としておく
1311
-
1312
- #
1313
- if motsu == 0
1314
- notes[''] = dates.range < 11 ? '没' : nil
1315
- return notes unless patch
1316
- else
1317
- notes['没'] = nil
1318
- end
1319
-
1320
- # 廿四節気
1321
- div, mod = longitude.divmod(15)
1322
- if mod == 0
1323
- note = (div - 21) % 24
1324
- div, mod = note.divmod(2)
1325
- notes['節中'] ||= Notes12[div] + %w(節 中)[mod]
1326
- notes['廿四節気'] ||=
1327
- begin
1328
- residue = When.Resource(dates.range == 1 ? '_co:Common?V=0618' : '_co:Common')['二十四節気::*'][(note-3) % 24]
1329
- if conditions[:shoyo]
1330
- dates.cal4note.s_terms.event_time(date, residue.label, [0,15])
1331
- else
1332
- residue
1333
- end
1334
- end
1335
- end
1336
-
1337
- # 七十二候
1338
- div, mod = longitude.divmod(5)
1339
- notes['七十二候'] ||= mod == 0 ? Notes72[(div - 63) % 72][dates.index_s] : nil
1340
-
1341
- # 往亡
1342
- unless notes['往亡'] && notes['神吉']
1343
- month = dates.s_date.cal_date[-2] - 1
1344
- day = dates.s_date.cal_date[-1] - 1
1345
- div, mod = month.divmod(3)
1346
- deg = (div+7)*(mod+1) + month * 30 + 314
1347
- notes['往亡'] = (dates.range < 11 ? (deg - longitude) % 360 == 0 : # 没を含まない
1348
- (deg - 315 ) % 30 == day)? '往亡' : nil # 没を含む
1349
- end
1350
-
1351
- # 伏龍
1352
- notes['伏龍'] ||= {
1353
- 315 => '庭内去堂', 15 => '門内百日', 115 => '東垣六十日',
1354
- 175 => '四隅百日', 275 => '竈内四十日'
1355
- }[longitude]
1356
-
1357
- # 六十卦
1358
- div, mod = longitude.divmod(30)
1359
- notes['六十卦'] ||= mod == 15 ? Notes60_A[(div - 10) % 12] : nil
1360
- div, mod = longitude.divmod(6)
1361
- notes['六十卦'] ||= mod == 0 ? Notes60_B[(div - 53) % 60] : nil
1362
-
1363
- # 彼岸
1364
- unless notes['彼岸']
1365
- if dates.range < 11
1366
- notes['彼岸'] = '彼岸' if longitude % 180 == 2 # 宣明暦以前(没を除いて3日後)
1367
- else
1368
- term = dates.cal4note.s_terms.term(date - When.Duration('P7D'), [0,180]) # 近傍の春秋分
1369
- case dates.s_date.to_i - term.to_i
1370
- when 2 ; notes['彼岸'] = '彼岸' if dates.range == 11 # 貞享暦(没を含めて3日後)
1371
- when -5 ; notes['彼岸'] = '彼岸' if longitude > 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(春-6日前))
1372
- when -1 ; notes['彼岸'] = '彼岸' if longitude <= 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(秋-2日前)
1373
- when -3 ; notes['彼岸'] = '彼岸' if dates.year >= 1844 # 天保暦以降(秋-4日前)
1374
- end
1375
- end
1376
- notes['彼岸'] = nil unless notes['彼岸'] == '彼岸'
1377
- end
1378
-
1379
- notes
1380
- end
1381
- end
1382
- end
1383
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2012-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
+ require 'when_exe/ephemeris/notes'
9
+ require 'when_exe/region/japanese/residues'
10
+
11
+ class When::CalendarNote
12
+
13
+ #
14
+ # 日本暦注
15
+ #
16
+ class Japanese < self
17
+
18
+ autoload :Eclipse, 'when_exe/region/japanese/eclipses'
19
+
20
+ #
21
+ # 日本暦注が使用する暦法
22
+ #
23
+ # @private
24
+ class Cal4Note
25
+ def initialize(calendar, solar)
26
+ @calendar = calendar
27
+ @solar = solar
28
+ end
29
+ end
30
+
31
+ #
32
+ # 日本暦注の要素
33
+ #
34
+ # @private
35
+ class Note < When::CalendarNote::NoteElement
36
+ end
37
+
38
+ #
39
+ # 日本暦注の要素
40
+ #
41
+ Notes = [When::BasicTypes::M17n, [
42
+ "locale:[=ja:, en=en:]",
43
+ "names:[日本暦注]",
44
+
45
+ # 年の暦注 ----------------------------
46
+ [When::BasicTypes::M17n,
47
+ "names:[]",
48
+ [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
49
+ # [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
50
+ # 'position:共通'], #
51
+ # [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
52
+ # 'position:共通'], #
53
+ [Note, 0x3800, "label:[廿八宿=ja:%%<二十八宿>]",
54
+ 'position:共通'], # 1: 廿八宿
55
+ [Note, 0x3FFC, "label:[大歳壇=]", 'position:暦序'], # 2: 干支
56
+ [Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
57
+ [Note, 0xFFFC, "label:[納音]", 'position:暦序', 'suffix:是'], # 4: 干支
58
+ [Note, 0xFFFF, "label:[大歳=ja:%%<太歳神>]",
59
+ 'position:暦序', 'suffix:在'], # 5: 干支
60
+ [Note, 0xFFFF, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
61
+ 'position:暦序', 'suffix:在'], # 6: 支
62
+ [Note, 0xFFFF, "label:[大陰=ja:%%<太陰神>]",
63
+ 'position:暦序', 'suffix:在'], # 7:
64
+ [Note, 0xFFFF, "label:[歳徳=ja:%%<歳徳神>]",
65
+ 'position:暦序', 'suffix:在'], # 8:
66
+ [Note, 0xFFFF, "label:[歳刑=ja:%%<歳刑神>]",
67
+ 'position:暦序', 'suffix:在'], # 9: 支
68
+ [Note, 0xFFFF, "label:[歳破=ja:%%<歳破神>]",
69
+ 'position:暦序', 'suffix:在'], # 10: 支
70
+ [Note, 0xFFFF, "label:[歳煞=ja:%%<歳煞神>]",
71
+ 'position:暦序', 'suffix:在'], # 11: 支
72
+ [Note, 0xFFFF, "label:[黄幡=ja:%%<黄幡神>]",
73
+ 'position:暦序', 'suffix:在'], # 12: 支
74
+ [Note, 0xFFFF, "label:[豹尾=ja:%%<豹尾神>]",
75
+ 'position:暦序', 'suffix:在'], # 13: 支
76
+ [Note, 0x0003, "label:[天道=]", 'position:暦序', 'suffix:-'], # 14: 支
77
+ [Note, 0x0003, "label:[人道=]", 'position:暦序', 'suffix:-'], # 15:
78
+ [Note, 0x3FFC, "label:[歳次=]", 'position:暦序', 'suffix:-'], # 16:
79
+ [Note, 0xF800, "label:[金神]", 'position:仮名暦', 'suffix:在'], # 17: 干
80
+ [Note, 0xFFFF, "label:[大小]", 'position:暦序'] # 18: 朔閏表
81
+ ],
82
+
83
+ # 月の暦注 ----------------------------
84
+ [When::BasicTypes::M17n,
85
+ "names:[月]",
86
+ [Note, 0xFFFF, "label:[月名=ja:%%<月_(暦)>#%.<日本の和風月名>, Month]",
87
+ 'position:月建'], # 0: 月の和名
88
+ # [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 干支
89
+ # [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
90
+ # 'position:共通'], #
91
+ # [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
92
+ # 'position:共通'], #
93
+ [Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
94
+ 'position:共通'], # 1: 廿八宿
95
+ [Note, 0xFFFC, "label:[月建=]", 'position:月建', 'suffix:-' ], # 2: 年の十干と暦月
96
+ [Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
97
+ [Note, 0x0003, "label:[天氣=]", 'position:月建', 'suffix:-' ], # 4: 暦月
98
+ [Note, 0x3FFF, "label:[天道=]", 'position:月建', 'suffix:-' ], # 5: 暦月
99
+ [Note, 0x0003, "label:[人道=]", 'position:月建', 'suffix:-' ], # 6: 暦月
100
+ [Note, 0x0003, "label:[月破=]", 'position:月建', 'suffix:在'], # 7: 暦月
101
+ [Note, 0x3FFC, "label:[天徳=]", 'position:月建', 'suffix:在'], # 8: 暦月
102
+ [Note, 0x3FFF, "label:[月煞=]", 'position:月建', 'suffix:在'], # 9: 暦月
103
+ [Note, 0x3FFF, "label:[用時=]", 'position:月建', 'suffix:-' ], # 10: 暦月
104
+ [Note, 0x3FFF, "label:[月徳=]", 'position:月建', 'suffix:在'], # 11: 暦月
105
+ [Note, 0x3FFC, "label:[月徳合=]", 'position:月建', 'suffix:在'], # 12: 暦月
106
+ [Note, 0x3FFC, "label:[月空=]", 'position:月建', 'suffix:在'], # 13: 暦月
107
+ [Note, 0x3FFF, "label:[三鏡=]", 'position:月建', 'suffix:-' ], # 14: 暦月
108
+ [Note, 0x3FFF, "label:[土府=]", 'position:月建', 'suffix:在'], # 15: 暦月
109
+ [Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
110
+ 'position:月建', 'suffix:在'], # 16: 暦月
111
+ [Note, 0xFFFF, "label:[大小]", 'position:月建'] # 17: 朔閏表
112
+ ],
113
+
114
+ # 日の暦注 ----------------------------
115
+ [When::BasicTypes::M17n,
116
+ "names:[]",
117
+ [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
118
+ # [Note, 0x, "label:[干=ja:%%<十干>]",
119
+ # 'position:共通'], #
120
+ # [Note, 0x, "label:[支=ja:%%<十二支>]",
121
+ # 'position:共通'], #
122
+ [Note, 0x3FFF, "label:[納音]", 'position:共通', 'suffix:是'], # 1: 干支
123
+ [Note, 0xFFFF, "label:[十二直]", 'position:共通'], # 2: 支 節月
124
+ [Note, 0xFFFF, "label:[七曜]", 'position:共通'], # 3: 七曜
125
+ [Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
126
+ 'position:共通'], # 4: 廿八宿
127
+ [Note, 0x07F8, "label:[廿七宿=ja:%%<二十八宿>]",
128
+ 'position:共通'], # 5: 暦月 暦日
129
+ [Note, 0xC000, "label:[九星]", 'position:民間'], # 6: 九星
130
+ [Note, 0x8000, "label:[六曜]", 'position:民間'], # 7: 暦月 暦日
131
+ [Note, 0xE000, "label:[祝祭日]", 'position:祝祭日'], # 8: 暦月 暦日 (七曜)
132
+ [Note, 0xFFFF, "label:[廿四節気=ja:%%<二十四節気>]",
133
+ 'position:時候'], # 9: 太陽黄経
134
+ [Note, 0xFFFF, "label:[節中=]", 'position:時候'], # 10: 太陽黄経
135
+ [Note, 0xFFFC, "label:[七十二候]", 'position:時候'], # 11: 太陽黄経
136
+ [Note, 0x3FFC, "label:[六十卦=]", 'position:時候'], # 12: 太陽黄経
137
+ [Note, 0xF800, "label:[節分]", 'position:雑節'], # 13: 立春からの日数
138
+ [Note, 0xF800, "label:[初午]", 'position:雑節'], # 14: 節月 or 暦月
139
+ [Note, 0xF800, "label:[八十八夜]", 'position:雑節'], # 15: 立春からの日数
140
+ [Note, 0xF800, "label:[入梅]", 'position:雑節'], # 16: 干 太陽黄経
141
+ [Note, 0xF800, "label:[半夏生]", 'position:雑節'], # 17: 干 太陽黄経
142
+ [Note, 0xF800, "label:[二百十日]", 'position:雑節'], # 18: 立春からの日数
143
+ [Note, 0xF800, "label:[二百廿日]", 'position:雑節'], # 19: 立春からの日数
144
+
145
+ [Note, 0x3FFC, "label:[大禍=ja:%%<暦注下段>#%.<大禍日>]",
146
+ 'position:上段 上段 欄外 欄外', 'suffix:日'], # 20: 支 節月
147
+ [Note, 0x3FFC, "label:[滅門=ja:%%<暦注下段>#%.<滅門日>]",
148
+ 'position:上段 上段 欄外 欄外', 'suffix:日'], # 21: 支 節月
149
+ [Note, 0x3FFC, "label:[狼藉=ja:%%<暦注下段>#%.<狼藉日>]",
150
+ 'position:上段 上段 欄外 欄外', 'suffix:日'], # 22: 節月
151
+
152
+ [Note, 0x07F8, "label:[甘露=]", 'position:上段 上段 上段 上段', 'suffix:日'], # 23: 七曜 廿七宿
153
+ [Note, 0x07F8, "label:[金剛峯=]", 'position:上段 上段 上段 上段'], # 24: 七曜 廿七宿
154
+ [Note, 0x07F8, "label:[羅刹=]", 'position:上段 上段 上段 上段'], # 25: 七曜 廿七宿
155
+
156
+ [Note, 0x3FFC, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
157
+ 'position:上段 上段 上段 上段', 'suffix:-'], # 26: 干支 節年
158
+ [Note, 0xFFFC, "label:[天一=ja:%%<天一神>]",
159
+ 'position:上段 上段 上段 上段', 'suffix:-'], # 27: 干支
160
+ [Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
161
+ 'position:上段 上段 上段 上段', 'suffix:-'], # 28: 干支
162
+ [Note, 0x3FFC, "label:[歳下食=ja:%%<暦注下段>#%.<歳下食>]",
163
+ 'position:上段 上段 上段 上段'], # 29: 干支 節年
164
+ [Note, 0x3FFC, "label:[忌遠行=]", 'position:上段 上段 上段 上段'], # 30: 支 節月
165
+ [Note, 0x3FFC, "label:[忌夜行=]", 'position:上段 上段 上段 上段'], # 31: 支 節月
166
+ [Note, 0x3FFC, "label:[下食時=ja:%%<暦注下段>#%.<時下食>]",
167
+ 'position:上段 上段 上段 上段', 'suffix:-'], # 32: 支 節月 貞享暦で一部廃止
168
+ [Note, 0x3FFC, "label:[天間=]", 'position:上段 上段 上段 中段上'], # 33: 干支 節月
169
+ [Note, 0x3FFC, "label:[不視病=]", 'position:上段 上段 上段 上段'], # 34:
170
+ [Note, 0x3FFC, "label:[不問疾=]", 'position:上段 上段 上段 上段'], # 35:
171
+ [Note, 0x3FFC, "label:[不弔人=]", 'position:上段 上段 上段 上段'], # 36: 支
172
+ [Note, 0xFFFC, "label:[彼岸]", 'position:仮名暦'], # 37: 太陽黄経
173
+ [Note, 0xFFFF, "label:[社=ja:%%<社日>]",
174
+ 'position:中段 中段 中段 中段', 'suffix:日'], # 38: 太陽黄経
175
+ [Note, 0xFFFF, "label:[三伏]", 'position:中段 中段 中段 中段'], # 39: 太陽黄経
176
+ [Note, 0x3FFC, "label:[除手足甲=]", 'position:中段 中段 中段 中段'], # 40: 晦(除手足甲)、支(片方のみ), 没滅凶会日×
177
+ [Note, 0x3FFC, "label:[沐浴=]", 'position:中段 中段 中段 中段'], # 41: 支 没滅凶会日×
178
+ [Note, 0x3FFD, "label:[臘=ja:%%<臘日>]",
179
+ 'position:中段 中段 中段 中段', 'suffix:日'], # 42: 支 太陽黄経
180
+ [Note, 0x3FFC, "label:[伐=]", 'position:中段 中段 中段 中段上', 'suffix:日'], # 43: 干支
181
+ [Note, 0x3FFC, "label:[五墓=ja:%%<暦注下段>#%.<五墓日>]",
182
+ 'position:中段 中段 中段 中段下', 'suffix:日'], # 44: 干支
183
+ [Note, 0x3FFC, "label:[六蛇=]", 'position:中段 中段 中段 中段上'], # 45: 干支 節月
184
+ [Note, 0x3FFC, "label:[七鳥=]", 'position:中段 中段 中段 中段上'], # 46: 干支 節月
185
+ [Note, 0x3FFC, "label:[八龍=]", 'position:中段 中段 中段 中段上'], # 47: 干支 節月
186
+ [Note, 0x3FFC, "label:[九虎=]", 'position:中段 中段 中段 中段上'], # 48: 干支 節月
187
+ [Note, 0x07FF, "label:[没=ja:%%<没日>]",
188
+ 'position:中段 中段 中段 中段', 'suffix:日'], # 49: 太陽黄経
189
+ [Note, 0xFFF8, "label:[日食]", 'position:中段 中段 中段 中段'], # 50: 日食表
190
+ [Note, 0x07FC, "label:[滅=ja:%%<滅日]",
191
+ 'position:中段 中段 中段 中段', 'suffix:日'], # 51: 月の位相
192
+ [Note, 0xFFF8, "label:[月食]", 'position:中段 中段 中段 中段'], # 52: 月食表
193
+ [Note, 0xC7FD, "label:[月相]", 'position:中段 中段 中段 中段'], # 53: 月の位相
194
+ [Note, 0xFFFF, "label:[土用事=ja:%%<土用>]",
195
+ 'position:中段 中段 中段 中段'], # 54: 太陽黄経
196
+ [Note, 0x3FF0, "label:[伏龍=]", 'position:上段 上段 下段 下段', 'suffix:在'], # 55: 太陽黄経
197
+
198
+ [Note, 0x3FFF, "label:[凶会=ja:%%<暦注下段>#%.<凶会日>]",
199
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 56: 干支 節月(宣明暦以前)/暦月(貞享暦以降)
200
+ [Note, 0x3FFF, "label:[大小歳=]", 'position:下段 下段 下段 下段'], # 57: 干支 節月
201
+ [Note, 0x3FFC, "label:[歳徳=ja:%%<歳徳神>]",
202
+ 'position:下段 下段 下段 下段'], # 58: 干 節年 凶会日× ~合も
203
+ [Note, 0x0003, "label:[天倉=]", 'position:古注'], # 59: 干支 節月
204
+ # [Note, 0x0003, "label:[天李=]", 'position:古注'], # 干支 節月?
205
+ [Note, 0x37FF, "label:[天恩=ja:%%<暦注下段>#%.<天恩日>]",
206
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 60: 干支 節月 凶会日×
207
+ [Note, 0xFFFF, "label:[天赦=ja:%%<暦注下段>#%.<天赦日>]",
208
+ 'position:下段 下段 下段 下段'], # 61: 干支 節月
209
+ [Note, 0x37FF, "label:[母倉=ja:%%<暦注下段>#%.<母倉日>]",
210
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 62: 支 節月 凶会日×
211
+ [Note, 0x37FC, "label:[月徳=]", 'position:下段 下段 下段 下段'], # 63: 干 節月 凶会日× ~合も
212
+ [Note, 0x3FFF, "label:[九坎=]", 'position:下段 下段 下段 下段'], # 64: 支 節月
213
+ [Note, 0x3FFF, "label:[歸忌=ja:%%<暦注下段>#%.<帰忌日>]",
214
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 65: 支 節月
215
+ [Note, 0x3FFF, "label:[血忌=ja:%%<暦注下段>#%.<血忌日>]",
216
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 66: 支 節月
217
+ [Note, 0x3FFC, "label:[無翹=]", 'position:下段 下段 下段 下段'], # 67: 支 節月
218
+ [Note, 0x3FFF, "label:[厭=]", 'position:下段 下段 下段 下段'], # 68: 支 節月
219
+ [Note, 0x3FFC, "label:[重=ja:%%<暦注下段>#%.<重日>]",
220
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 69:
221
+ [Note, 0x3FFD, "label:[復=ja:%%<暦注下段>#%.<復日>]",
222
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 70: 干 節月
223
+ [Note, 0x3FFC, "label:[月煞=]", 'position:下段 下段 下段 下段'], # 71: 支 節月
224
+ [Note, 0x3FFF, "label:[往亡=ja:%%<暦注下段>#%.<往亡日>]",
225
+ 'position:下段 下段 下段 下段', 'suffix:日'], # 72: 太陽黄経
226
+ [Note, 0x3FFF, "label:[日遊=ja:%%<日遊神>]",
227
+ 'position:最下段', 'suffix:在'], # 73: 干支
228
+ [Note, 0x07FF, "label:[人神配当=]", 'position:最下段孟月', 'suffix:-'], # 74: 暦日
229
+
230
+ [Note, 0x3E00, "label:[受死=ja:%%<暦注下段>#%.<受死日>]",
231
+ 'position:仮名暦', 'suffix:日'], # 75: 支 節月
232
+ [Note, 0xFFF0, "label:[八專]", 'position:仮名暦'], # 76: 干支
233
+ [Note, 0x3E00, "label:[八專間日=ja:%%<八専>]",
234
+ 'position:仮名暦'], # 77: 干支
235
+ [Note, 0xC000, "label:[金神間日=ja:%%<金神>#%.<金神の遊行・間日>]",
236
+ 'position:仮名暦'], # 78: 支 節月
237
+ [Note, 0xC000, "label:[金神遊行=ja:%%<金神>#%.<金神の遊行・間日>]",
238
+ 'position:仮名暦'], # 79: 支 節月
239
+ [Note, 0x3FF0, "label:[天火=ja:%%<暦注下段>#%.<天火日>]",
240
+ 'position:仮名暦', 'suffix:日'], # 80: 支 節月
241
+ [Note, 0x3FF0, "label:[地火=ja:%%<暦注下段>#%.<地火日>]",
242
+ 'position:仮名暦', 'suffix:日'], # 81: 支 節月
243
+ [Note, 0x3800, "label:[人火=]", 'position:仮名暦'], # 82: 支 節月
244
+ [Note, 0x3800, "label:[雷火=]", 'position:仮名暦'], # 83: 節月
245
+ [Note, 0x3FF0, "label:[赤舌=ja:%%<赤舌日>]",
246
+ 'position:仮名暦', 'suffix:日'], # 84: 暦月 暦日
247
+ [Note, 0x3E00, "label:[十死=ja:%%<暦注下段>#%.<十死日>]",
248
+ 'position:仮名暦', 'suffix:日'], # 85: 支 節月
249
+ [Note, 0x3E00, "label:[道虚=]", 'position:仮名暦', 'suffix:日'], # 86: 暦日
250
+ [Note, 0x3E00, "label:[大明=ja:%%<暦注下段>#%.<大明日>]",
251
+ 'position:仮名暦', 'suffix:日'], # 87: 干支
252
+ [Note, 0x0600, "label:[大赤=ja:%%<赤口日>]",
253
+ 'position:仮名暦', 'suffix:日'], # 88: 暦月 暦日
254
+ [Note, 0xF800, "label:[甲子待=ja:%%<甲子>]",
255
+ 'position:仮名暦'], # 89: 干支
256
+ [Note, 0xC000, "label:[己巳]", 'position:仮名暦'], # 90: 干支
257
+ [Note, 0xF800, "label:[庚申待]", 'position:仮名暦'], # 91: 干支
258
+ [Note, 0x3800, "label:[犯土]", 'position:仮名暦'], # 92: 干支
259
+ [Note, 0xF800, "label:[十方暮]", 'position:仮名暦'], # 93: 干支
260
+ [Note, 0xF800, "label:[一粒万倍=ja:%%<一粒万倍日>]",
261
+ 'position:仮名暦', 'suffix:日'], # 94: 支 節月
262
+ [Note, 0x3800, "label:[天福=]", 'position:仮名暦'], # 95: 支 節月
263
+ [Note, 0x3800, "label:[地福=]", 'position:仮名暦'], # 96: 支 節月
264
+ [Note, 0x3800, "label:[地五福=]", 'position:仮名暦'], # 97: 支 節月
265
+ [Note, 0xB800, "label:[三隣亡]", 'position:仮名暦'], # 98: 節月
266
+ [Note, 0xF800, "label:[不成就=ja:%%<不成就日>]",
267
+ 'position:仮名暦', 'suffix:日'], # 99: 暦月 暦日/晦日
268
+ [Note, 0x3800, "label:[鬼宿]", 'position:仮名暦'], #100: 廿八宿
269
+ [Note, 0x3800, "label:[金性=]", 'position:仮名暦'], #101: 節月 支 節年
270
+ [Note, 0x3FFF, "label:[三寶吉=ja:%%<三宝吉>]",
271
+ 'position:上段 上段 上段 上段'], #102: 干支 節月
272
+ [Note, 0x3FFF, "label:[神吉=ja:%%<暦注下段>#%.<神吉日>]",
273
+ 'position:上段 上段 中段 中段上', 'suffix:日'], #103: 干支 節月
274
+ [Note, 0x3FFF, "label:[雑事吉=]", 'position:雑事吉'], #104: 干支 節月
275
+ [Note, 0x3FFF, "label:[小字注=]", 'position:下段小字 下段小字 下段小字 下段小字'],#105: 干支 節月
276
+ ]
277
+ ]]
278
+
279
+ #
280
+ # 日本暦注の時代変遷
281
+ #
282
+ # @private
283
+ NoteTypes = (2...When::TM::CalendarEra::JapaneseSolar[2].size).to_a.map {|i|
284
+ calendars =
285
+ [When::TM::CalendarEra::JapaneseLuniSolar[2][i][2],
286
+ When::TM::CalendarEra::JapaneseSolar[2][i][2]].map {|epoch|
287
+ epoch =~ /\A(-?\d+)-(\d+)-(\d+)\^(.+)\z/
288
+ $4
289
+ }
290
+ [$2 == '01' ? $1.to_i : $1.to_i+1, Cal4Note.new(*calendars)]
291
+ }.reverse
292
+
293
+ # @private
294
+ NoteRange = [
295
+ # 開始 具注暦 七十二候 index mask
296
+ [-660, 0, 0], # ~ 696 0 : 0001
297
+ [ 697, 0, 0], # ~ 763 1 : 0002
298
+ [ 764, 0, 2], # ~ 800 2 : 0004
299
+ [ 801, 0, 2], # ~ 900 3 : 0008
300
+ [ 901, 0, 2], # ~1003 4 : 0010
301
+ [1004, 1, 2], # ~1047 5 : 0020
302
+ [1048, 1, 2], # ~1100 6 : 0040
303
+ [1101, 1, 2], # ~1184 7 : 0080
304
+ [1185, 2, 2], # ~1300 8 : 0100
305
+ [1301, 2, 2], # ~1337 9 : 0200
306
+ [1338, 3, 2], # ~1684 10 : 0400
307
+ [1685, 3, 3], # ~1754 11 : 0800
308
+ [1755, 3, 4], # ~1867 12 : 1000
309
+ [1868, 3, 4], # ~1872 13 : 2000
310
+ [1873, 3, 4], # ~1873 14 : 4000
311
+ [1874, 3, 5] # ~ 15 : 8000
312
+ ]
313
+
314
+ # @private
315
+ NoteFocused = (0...NoteRange.size).to_a.map {|range|
316
+ (2..4).to_a.map {|cord|
317
+ notes = Notes[1][cord]
318
+ (2...notes.size).to_a.inject([]) {|focused,note|
319
+ focused << notes[note][2][/\[.+?[=\]]/][1..-2] if notes[note][1][range] == 1
320
+ focused
321
+ }
322
+ }
323
+ }
324
+
325
+ #
326
+ # 月の大小
327
+ #
328
+ # @private
329
+ MonthPattern = {
330
+ 29 => '',
331
+ 30 => '',
332
+ -28 => '',
333
+ -29 => '',
334
+ -30 => '小',
335
+ -31 => '大'
336
+ }
337
+
338
+ #
339
+ # 日本暦注に対応するインデックス(整数値)
340
+ #
341
+ # @private
342
+ module Index
343
+ # @private
344
+ [[2,'Y'], [3,'M'], [4,'D']].map {|cord|
345
+ index, initial = cord
346
+ notes = Notes[1][index]
347
+ (notes.size-2).times {|no|
348
+ name = initial + notes[no+2][2][/\[.+?[=\]]/][1..-2]
349
+ mask = 'M' + name
350
+ const_set(name, no)
351
+ const_set(mask, 1<<no)
352
+ }
353
+ }
354
+ end
355
+
356
+ #
357
+ # 日本暦注が使用する暦法
358
+ #
359
+ # @private
360
+ class Cal4Note
361
+ attr_reader :calendar, :solar
362
+
363
+ def l_calendar
364
+ @l_calendar ||= When.Calendar(@calendar.kind_of?(String) ? @calendar.sub(/#\{\?.+?\}/, '') : @calendar)
365
+ end
366
+
367
+ def s_calendar
368
+ @s_calendar ||= When.Calendar(@solar.kind_of?(String) ? @solar.sub(/#\{\?.+?\}/, '?Clock=THS') : @solar)
369
+ end
370
+
371
+ def l_phases
372
+ @l_phases ||= Japanese::LunarPhases.new('formula'=>l_calendar.formula[-1])
373
+ end
374
+
375
+ def s_terms
376
+ @s_terms ||= Japanese::SolarTerms.new('formula'=>s_calendar.formula[0])
377
+ end
378
+
379
+ def s_terms2
380
+ @s_terms2 ||= @l_calendar.iri =~ /JapaneseTwin(.*?)::天保暦/ ?
381
+ Japanese::SolarTermsRevised.new('formula'=>s_calendar.formula[0]) : s_terms
382
+ end
383
+
384
+ def doyo
385
+ @doyo ||= (s_calendar.doyo ? s_calendar.doyo * 360.0 / s_calendar.year_length : 0)
386
+ end
387
+ end
388
+
389
+ #
390
+ # 日本暦注用の Notes の要素のための内部クラス
391
+ #
392
+ # @private
393
+ class Note
394
+
395
+ attr_reader :label, :position, :suffix
396
+
397
+ def to_note_hash(note, dates=nil)
398
+ {
399
+ :note => self,
400
+ :value => case @suffix
401
+ when '是' ; [@label + '是-', note[/.\z/]]
402
+ when '在' ; [@label + '在-', note]
403
+ when '-' ; [@label + '-', note]
404
+ else ; note
405
+ end,
406
+ :position => @position[@position.size == 1 ? 0 : dates.index_g]
407
+ }
408
+ end
409
+
410
+ private
411
+ # オブジェクトの正規化
412
+ #
413
+ def _normalize(args=[], options={})
414
+ @position = @position.split(/ /)
415
+ end
416
+ end
417
+
418
+ #
419
+ # 日本暦注計算に必要となる暦日や暦法をまとめた内部クラス
420
+ #
421
+ # @private
422
+ class Dates
423
+
424
+ attr_reader :year, :precision, :cal4note, :range, :index_g, :index_s, :o_date, :l_date, :m_date, :s_date
425
+
426
+ # 初期設定
427
+ def initialize(date, year=date.most_significant_coordinate, precision=date.precision, cal4note=nil)
428
+
429
+ # 暦注パターン
430
+ if cal4note
431
+ # 年代による判定
432
+ (1...NoteRange.size).to_a.reverse.each do |i|
433
+ if year >= NoteRange[i][0]
434
+ @range = i
435
+ break
436
+ end
437
+ end
438
+ @range ||= 0
439
+ else
440
+ # 暦法による判定
441
+ cal4note = Cal4Note.new(date.frame, date.frame.twin)
442
+ @range =
443
+ case cal4note.l_calendar.formula[-1]
444
+ when When::Ephemeris::ChineseTrueLunation::JujiMethods ; 11 # 江戸時代の暦
445
+ when When::Ephemeris::ChineseTrueLunation
446
+ date.frame.twin =~ /戊寅|麟徳/ ? 1 : 10 # 唐代定朔暦(儀鳳暦 or 宣明暦)
447
+ when When::Ephemeris::MeanLunation ; 0 # 唐代以前平朔暦(元嘉暦)
448
+ else ; 15 # 現代の旧暦
449
+ end
450
+ end
451
+
452
+ # 具注暦の配置
453
+ @index_g = NoteRange[@range][1]
454
+
455
+ # 七十二候
456
+ @index_s = NoteRange[@range][2]
457
+
458
+ # その他の属性
459
+ @year = year
460
+ @precision = precision
461
+ @cal4note = cal4note
462
+ @o_date = date
463
+ @l_date = @cal4note.l_calendar ^ date
464
+ @m_date = date.frame.kind_of?(When::CalendarTypes::Christian) ? @l_date : @o_date
465
+ @s_date = @cal4note.s_calendar ^ date
466
+ end
467
+ end
468
+
469
+ NoteMethods = [:year_notes, :month_notes, :day_notes]
470
+
471
+ # 暦注の計算
472
+ #
473
+ # @param [When::TM::TemporalPosition] date 暦注を計算する日時
474
+ # (date When::TM::TemporalPosition でない場合、When::TM::TemporalPosition に変換して使用する)
475
+ # @param [Hash] options
476
+ # :indices, :notes およびその他のキー => {When::CalendarNote#notes} を参照
477
+ #
478
+ # @return [Hash] :notes が String の場合
479
+ # @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合
480
+ # @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合
481
+ # @note return 値の [Hash] の要素は下記の通り
482
+ # :note => 暦注要素 (When::CalendarTypes::Japanese::Note)
483
+ # :value => 暦注の値 (String or When::BasicTypes::M17n または、その Array)
484
+ # :position => 具注暦でのその暦注の配置場所(String)
485
+ #
486
+ def notes(date, options={})
487
+ dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
488
+ NotesContainer.register(indices.map {|i|
489
+ next [] unless i <= dates.precision
490
+ send(NoteMethods[i-1], dates, notes[i-1], conditions)
491
+ }, persistence, date.to_i)
492
+ end
493
+
494
+ # 太陽の位置 => 日時
495
+ #
496
+ # @param [When::TM::TemporalPosition] date 探す基準とする日時
497
+ # @param [Array<Numeric>] parameter 太陽の位置の分子と分母( num, den)
498
+ #
499
+ # num 分子 (デフォルト 0 : 基準日時直後の春分)
500
+ #
501
+ # den 分母 (デフォルト 360 : 検索範囲の長さ)
502
+ #
503
+ # @param [String] parameter 太陽の位置の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(春分))
504
+ # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
505
+ #
506
+ # @return [When::TM::CalDate] date またはその直後に太陽の位置が指定の値になる日時
507
+ #
508
+ def term(date, parameter=nil, precision=date.precision)
509
+ dates = _to_date_for_note(date)
510
+ result = dates.cal4note.s_terms.term(date, parameter)
511
+ patch = SolarTerms::Patch[result.to_i]
512
+ return result unless patch
513
+ num, den = parameter.kind_of?(String) ? parameter.split('/', 2) : parameter
514
+ num = (num || 0).to_f
515
+ den = (den || 360).to_f
516
+ diff = (num - patch[0] + 1) % den - 1
517
+ return result if diff == 0
518
+ patched = result + When::P1D * diff
519
+ result.cal_date[0..-2] = patched.cal_date[0..-2]
520
+ result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
521
+ result
522
+ end
523
+
524
+ # 月の位相 => 日時
525
+ #
526
+ # @param [When::TM::TemporalPosition] date 探す基準とする日時
527
+ # @param [Array<Numeric>] parameter 月の位相の分子と分母( num, den)
528
+ #
529
+ # num 分子 (デフォルト 0 : 基準日時直後の朔)
530
+ #
531
+ # den 分母 (デフォルト 30 : 検索範囲の長さ)
532
+ #
533
+ # @param [String] parameter 月の位相の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(朔))
534
+ # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
535
+ #
536
+ # @return [When::TM::CalDate] date またはその直後に月の位相が指定の値になる日時
537
+ #
538
+ def phase(date, parameter=nil, precision=date.precision)
539
+ dates = _to_date_for_note(date)
540
+ note = dates.cal4note.l_phases
541
+ result = note.phase(date, parameter)
542
+ return result if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
543
+
544
+ time = note.phase(date, parameter, When::SYSTEM)
545
+ cn = note.formula.time_to_cn(time) % 1
546
+ case cn
547
+ when 0..0.0001, 0.9999..1 #
548
+ return result if result.cal_date[-1] == 1
549
+ diff = result.cal_date[-1] < 15 ? -1 : +1
550
+ when 0.2..0.8 # 弦、望
551
+ return result unless note.formula.kind_of?(When::Ephemeris::ChineseTrueLunation)
552
+ return result if time.clk_time.universal_time >= When::TM::Duration::DAY/4 # 午前6時以降
553
+ diff = -1
554
+ else # その他
555
+ return result
556
+ end
557
+
558
+ patched = result + When::P1D * diff
559
+ result.cal_date[0..-2] = patched.cal_date[0..-2]
560
+ result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
561
+ result
562
+ end
563
+
564
+ private
565
+
566
+ # オブジェクトの正規化
567
+ def _normalize(args=[], options={})
568
+ @prime ||= [%w(干支), %w(月名), %w(七曜 干支 六曜 廿四節気 祝祭日)]
569
+ super
570
+ end
571
+
572
+ # 年の暦注
573
+ def year_notes(dates, notes, conditions={})
574
+ _note_values(dates, notes, _all_keys[-3], _elements[-3]) do |dates, focused_notes, notes_hash|
575
+
576
+ focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-3]
577
+ root = When.Resource('_co:Common')
578
+
579
+ # 干支
580
+ residue = (dates.precision < When::DAY ? dates.o_date : dates.s_date).most_significant_coordinate - 4
581
+ notes_hash['干支'] = root['干支'][residue % 60]
582
+ notes_hash[''] = root['' ][residue % 10]
583
+ notes_hash['支'] = root['支' ][residue % 12]
584
+
585
+ # 廿八宿
586
+ notes_hash['廿八宿'] ||= root['宿'][(residue+18) % 28]
587
+
588
+ # 九星
589
+ notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.year(residue)]
590
+
591
+ # 大小
592
+ unless notes_hash['大小']
593
+ year = dates.o_date.floor(When::YEAR)
594
+ month = year.floor(When::MONTH)
595
+ pattern = ''
596
+ while year == month
597
+ length = month.length(When::MONTH)
598
+ length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
599
+ pattern += '閏' if month[When::MONTH] * 0 == 1
600
+ pattern += MonthPattern[length] || ''
601
+ month += When::P1M
602
+ end
603
+ notes_hash['大小'] = "#{pattern}(#{year.length(When::YEAR)})"
604
+ end
605
+
606
+ # その他
607
+ [notes_hash['干支'], notes_hash['干'], notes_hash['支']].each do |note|
608
+ note._year_notes(notes_hash, dates, conditions)
609
+ end
610
+ notes_hash
611
+ end
612
+ end
613
+
614
+ # 月の暦注
615
+ def month_notes(dates, notes, conditions={})
616
+ _note_values(dates, notes, _all_keys[-2], _elements[-2]) do |dates, focused_notes, notes_hash|
617
+
618
+ focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-2]
619
+ root = When.Resource('_co:Common')
620
+
621
+ # 干支
622
+ residue = month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.m_date)
623
+ notes_hash['干支'] = root['干支'][residue % 60]
624
+ notes_hash[''] = root['' ][residue % 10]
625
+ notes_hash['支'] = root['支' ][residue % 12]
626
+
627
+ # 廿八宿
628
+ notes_hash['廿八宿'] ||= root['宿'][(residue+6) % 28]
629
+
630
+ # 九星
631
+ notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.month(
632
+ month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.s_date))]
633
+
634
+ # 大小
635
+ unless notes_hash['大小']
636
+ length = dates.o_date.length(When::MONTH)
637
+ length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
638
+ notes_hash['大小'] = "#{dates.o_date[When::MONTH]*0==1 ? '閏' : ''}#{MonthPattern[length] || '改'}(#{length.abs})"
639
+ end
640
+
641
+ # その他
642
+ [notes_hash['干支'], notes_hash['干'], notes_hash['支'], JapaneseLuniSolarNote].each do |note|
643
+ note._month_notes(notes_hash, dates, conditions)
644
+ end
645
+ notes_hash
646
+ end
647
+ end
648
+
649
+ # 日の暦注
650
+ def day_notes(dates, notes, conditions={})
651
+ _note_values(dates, notes, _all_keys[-1], _elements[-1]) do |dates, focused_notes, notes_hash|
652
+
653
+ focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-1]
654
+ root = When.Resource('_co:Common')
655
+
656
+ # 干支
657
+ residue = dates.s_date.to_i-11
658
+ notes_hash['干支'] = root['干支'][residue % 60]
659
+ notes_hash['干'] = root['干' ][residue % 10]
660
+ notes_hash['支'] = root['支' ][residue % 12]
661
+
662
+ # その他
663
+ [SolarTerms, LunarPhases, notes_hash['干支'], notes_hash['干'], notes_hash['支'],
664
+ JapaneseLuniSolarNote, JapaneseSolarNote].each do |note|
665
+ note._day_notes(notes_hash, dates, conditions)
666
+ end
667
+
668
+ # 七曜
669
+ notes_hash['七曜'] ||= root['Week'][dates.s_date.to_i % 7]
670
+
671
+ # 廿七宿
672
+ notes_hash['廿七宿'] = _residue27(notes_hash['廿七宿'], root)
673
+
674
+ # 廿八宿 / 鬼宿
675
+ notes_hash['廿八宿'] ||= root['宿'][(dates.s_date.to_i+11) % 28]
676
+ notes_hash['鬼宿'] ||= /鬼/ =~ notes_hash['廿八宿'].to_s ? '鬼宿' : nil
677
+
678
+ # 九星
679
+ notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.day(dates.s_date, dates.cal4note.s_terms)]
680
+
681
+ notes_hash
682
+ end
683
+ end
684
+
685
+ #
686
+ # 日本暦日情報オブジェクトの生成
687
+ #
688
+ # @note 対となる太陽暦のある太陰太陽暦はそのまま(太陰太陽暦,太陽暦)の対
689
+ # そうでなければ、採用する対を年代により選択する
690
+ #
691
+ def _to_date_for_note(date)
692
+ if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
693
+ return Dates.new(date) if date.frame.twin
694
+ o_date = date
695
+ else
696
+ o_date = self.class._to_japanese_date(date)
697
+ return nil unless o_date
698
+ end
699
+ year = o_date.most_significant_coordinate
700
+ NoteTypes.each do |line|
701
+ return Dates.new(o_date, year, date.precision, line[1]) if year >= line[0]
702
+ end
703
+ nil
704
+ end
705
+
706
+ #
707
+ # 任意の暦を日本年号付暦日に変換
708
+ #
709
+ def self._to_japanese_date(date)
710
+ return date if date._attr[:query] && date._attr[:query]['area'].to_s =~ /日本/
711
+ (date^ When.era(:area=>'日本')).each do |list|
712
+ return list[0] if list[0]
713
+ end
714
+ nil
715
+ end
716
+
717
+ #
718
+ # 廿七宿を Resudue 化
719
+ #
720
+ def _residue27(index, root)
721
+ return index unless index.kind_of?(Integer)
722
+ root['宿'][index]
723
+ end
724
+
725
+ #
726
+ # 月の干支
727
+ #
728
+ def month_stem_branch(date)
729
+ date.most_significant_coordinate*12+(date.cal_date[1] * 1) +
730
+ (date.frame.kind_of?(When::CalendarTypes::Christian) ? 12 : 13)
731
+ end
732
+ end
733
+
734
+ #
735
+ # 太陽暦の暦注・祝祭日
736
+ #
737
+ class JapaneseSolarNote < self
738
+
739
+ #
740
+ # 祝祭日一覧
741
+ #
742
+ NotesList = {
743
+ [ 1, 1] => [[1868..1872, '元旦'], [1874..1948, '四方拝'], [1949..2100, '元日']],
744
+ [ 1, 3] => [[1874..1948, '元始祭']],
745
+ [ 1, 5] => [[1874..1948, '新年宴会']],
746
+ [ 1,-2] => [[2000..2100, '成人の日']],
747
+ [ 1,15] => [[1868..1872, '小正月'], [1949..1999, '成人の日']],
748
+ [ 1,29] => [[1873..1873, '神武天皇即位日']],
749
+ [ 1,30] => [[1874..1912, '孝明天皇祭']],
750
+ [ 2,11] => [[1874..1948, '紀元節'], [1967..2100, '建国記念の日']],
751
+ [ 2,24] => [[1989..1989, '昭和天皇の大喪の礼']],
752
+ [ 3, 3] => [[1868..1872, '弥生節句']],
753
+ [ 3, 0] => [[1879..1948, '春季皇霊祭'], [1949..2100, '春分の日']],
754
+ [ 4, 3] => [[1874..1948, '神武天皇祭']],
755
+ [ 4,10] => [[1959..1959, '皇太子明仁親王の結婚の儀']],
756
+ [ 4,29] => [[1927..1948, '天長節'], [1949..1988, '天皇誕生日'], [1989..2006, 'みどりの日'], [2007..2100, '昭和の日']],
757
+ [ 5, 3] => [[1949..2100, '憲法記念日']],
758
+ [ 5, 4] => [[2007..2100, 'みどりの日']],
759
+ [ 5, 5] => [[1868..1872, '端午節句'], [1949..2100, 'こどもの日']],
760
+ [ 6, 9] => [[1993..1993, '皇太子徳仁親王の結婚の儀']],
761
+ [ 7, 7] => [[1868..1872, '七夕節句']],
762
+ [ 7,15] => [[1868..1872, 'お盆']],
763
+ [ 7,20] => [[1996..2002, '海の日']],
764
+ [ 7,-3] => [[2003..2100, '海の日']],
765
+ [ 7,30] => [[1913..1926, '明治天皇祭']],
766
+ [ 8, 1] => [[1868..1872, '田実節句']],
767
+ [ 8,11] => [[2016..2100, '山の日']],
768
+ [ 8,31] => [[1913..1926, '天長節']],
769
+ [ 9, 9] => [[1868..1872, '重陽節句']],
770
+ [ 9,15] => [[1966..2002, '敬老の日']],
771
+ [ 9,-3] => [[2003..2100, '敬老の日']],
772
+ [ 9,17] => [[1874..1878, '神嘗祭']],
773
+ [ 9, 0] => [[1878..1947, '秋季皇霊祭'], [1948..2100, '秋分の日']],
774
+ [10,10] => [[1966..1999, '体育の日']],
775
+ [10,-2] => [[2000..2100, '体育の日']],
776
+ [10,17] => [[1879..1947, '神嘗祭']],
777
+ [10,31] => [[1913..1926, '天長節祝日']],
778
+ [11, 3] => [[1873..1911, '天長節'], [1927..1947, '明治節'], [1948..2100, '文化の日']],
779
+ [11,10] => [[1915..1915, '即位の礼'], [1928..1928, '即位の礼']],
780
+ [11,12] => [[1990..1990, '即位の礼正殿の儀']],
781
+ [11,14] => [[1915..1915, '大嘗祭'], [1928..1928, '大嘗祭']],
782
+ [11,16] => [[1915..1915, '大饗第1日'], [1928..1928, '大饗第1日']],
783
+ [11,23] => [[1873..1947, '新嘗祭'], [1948..2100, '勤労感謝の日']],
784
+ [12,23] => [[1989..2100, '天皇誕生日']],
785
+ [12,25] => [[1927..1947, '大正天皇祭']]
786
+ }
787
+
788
+ # @private
789
+ Long = {3=>0, 9=>180}
790
+
791
+ class << self
792
+
793
+ # 日の暦注 - 祝祭日の計算
794
+ # @private
795
+ def _day_notes(notes, dates, conditions={})
796
+ # 明治維新以降の実暦日のみ扱う
797
+ return notes if dates.o_date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
798
+ year = dates.o_date.most_significant_coordinate
799
+ return notes unless year >= 1868
800
+
801
+ # 春分の日と秋分の日を祝祭日に加える
802
+ long = Long[dates.o_date.cal_date[1]] if year >= 1878
803
+ if long
804
+ date = When.when?(dates.o_date.to_cal_date.to_s,
805
+ {:frame=>dates.o_date.frame,
806
+ :clock=>dates.s_date.frame.time_basis})
807
+ term = dates.cal4note.s_terms.term(date.floor(When::MONTH,
808
+ When::DAY), [long,360]).cal_date[1..2]
809
+ list = NotesList.dup
810
+ list[term] = list[[term[0],0]]
811
+ else
812
+ list = NotesList
813
+ end
814
+
815
+ # 「国民の休日」制定以前
816
+ notes['祝祭日'] ||= _holiday(list, dates.o_date, '振替休日')
817
+ return notes if notes['祝祭日'] || year < 1988
818
+
819
+ # 「国民の休日」制定以後
820
+ duration = When.Duration('P1D')
821
+ [duration, -duration].each do |d|
822
+ return notes unless _holiday(list, dates.o_date + d)
823
+ end
824
+ notes['祝祭日'] = '国民の休日'
825
+ return notes
826
+ end
827
+
828
+ private
829
+
830
+ # 振替休日とハッピーマンデーを考慮した祝祭日
831
+ def _holiday(list, date, alternate=nil)
832
+ y = date.most_significant_coordinate
833
+ m, d = date.cal_date[1..2]
834
+
835
+ # 「振替休日」制定以前
836
+ note = _note(list, y, m, d)
837
+ return note if note || y < 1973
838
+
839
+ # 「振替休日」制定以降
840
+ case date.to_i % 7
841
+ when 0 # 月曜
842
+ # 振替休日
843
+ note = _note(list, y, m, d-1)
844
+ return alternate if note
845
+ # ハッピーマンデー
846
+ note = _note(list, y, m, -((d-1)/7 + 1))
847
+ return note if note
848
+ when 1,2 # 火曜・水曜
849
+ # 振替休日
850
+ return alternate if y >= 2007 && m == 5 && d == 6
851
+ end
852
+ end
853
+
854
+ # 振替休日とハッピーマンデーを考慮しない祝祭日
855
+ def _note(list, year, month, day)
856
+ return nil if day == 0
857
+ year = [year, 2100].min
858
+ note = list[[month,day]]
859
+ return nil unless note
860
+ note.each do |range|
861
+ return range[1] if range[0].include?(year)
862
+ end
863
+ return nil
864
+ end
865
+ end
866
+ end
867
+
868
+ #
869
+ # 太陰太陽暦の暦注
870
+ #
871
+ class JapaneseLuniSolarNote < self
872
+
873
+ # 変換表 月日→27宿
874
+ StarMansions = [ # 正 2 3 4 5 6 7 8 9 10 11 12
875
+ [11, 13, 15, 17, 19, 21, 24, 0, 2, 4, 7, 9], # 0 : 本月本説 室12奎14胃16畢18參20鬼22張25角00氐02心04斗07虛10
876
+ [ 5, 3, 1, 25, 23, 21, 19, 16, 14, 11, 8, 7], # 1 : 本月異説 尾05房03亢01翼26星24鬼22參20昴17婁15室12女09斗07
877
+ [14, 16, 18, 20, 22, 24, 0, 3, 5, 7, 10, 12], # 2 : 閏月本説 婁15昴17觜19井21柳23張25角00房03尾05斗07危11壁13
878
+ [12, 14, 16, 18, 19, 21, 24, 0, 2, 5, 8, 10], # 3 : 閏月異説 壁13婁15昴17觜19參20鬼22張25角00氐02尾05女09危11
879
+ [14, 16, 18, 23, 22, 24, 0, 3, 5, 7, 8, 12] # 4 : 閏月本説(元) (星24) (女09)
880
+ ]
881
+
882
+ # 変換表 27宿→28宿
883
+ StarMansionIndex = (0..7).to_a + (9..27).to_a
884
+
885
+ # 七曜と27宿で決まる暦注
886
+ WeekDepended = {
887
+ # 日 月 火 水 木 金 土
888
+ '甘露' => [26, 17, 5, 22, 21, 3, 23], # 軫27 畢18 尾05 柳23 鬼22 房03 星24
889
+ '金剛峯' => [ 5, 8, 12, 16, 20, 24, 1], # 尾05 女09 壁13 昴17 井21 張25 亢01
890
+ '羅刹' => [15, 21, 25, 19, 2, 13, 22] # 胃16 鬼22 翼26 参20 氐02 奎14 柳23
891
+ }
892
+
893
+ # 人神配当
894
+ HumanBody = %w(足大指 外踝 股内 腰 口 手 内踝 腕 尻 腰背
895
+ 鼻柱 髪際 牙歯 胃管 遍身 胸 気街 股内 足 踝
896
+ 足小指 足踝及胸、目下 肝及足 手陽明 足陽明 胸 膝 陰 膝晊 足跌)
897
+
898
+ # 月の暦注
899
+ # @private
900
+ def self._month_notes(notes, dates, conditions={})
901
+ # 月名
902
+ notes['月名'] ||= dates.o_date.name('month')
903
+ end
904
+
905
+ # 日の暦注
906
+ # @private
907
+ def self._day_notes(notes, dates, conditions={})
908
+
909
+ # 廿七宿
910
+ m, l = [1,0].map {|f| dates.m_date.cal_date[1] * f}
911
+ d = (StarMansions[l==1 ? (conditions[:i27]||0) :
912
+ (conditions[:n27]||0)][m-1] + dates.m_date.cal_date[2] - 1) % 27
913
+ notes['廿七宿'] ||= StarMansionIndex[d]
914
+
915
+ # 甘露 / 金剛峯 / 羅刹
916
+ w = (dates.m_date.to_i + 1) % 7
917
+ ['甘露', '金剛峯', '羅刹'].each do |c|
918
+ notes[c] = c if d == WeekDepended[c][w]
919
+ end
920
+
921
+ # 三寶吉・神吉・雑事吉・小字注 (凶会日は表引きの時点で抑制済み)
922
+ notes['神吉'] = notes['雑事吉'] = notes['三寶吉'] = notes['小字注'] = nil if notes['没'] || notes['滅']
923
+ notes['神吉'] = notes['雑事吉'] = nil if notes['往亡']
924
+ notes['神吉'] = notes['三寶吉'] = nil if notes['月食']
925
+ notes['小字注'] = nil if notes['日食'] || notes['月食']
926
+ notes['小字注'] = nil if notes['九坎'] && dates.range==5 # 11世紀後半
927
+ notes['三寶吉'] = nil if notes['羅刹']
928
+ notes['三寶吉'] = notes['甘露'] ? '三寶吉' : nil if /\+/ =~ notes['三寶吉'].to_s
929
+ notes['三寶吉'] = '三吉' if notes['三寶吉'] && dates.range >= 8 # 鎌倉以降
930
+
931
+ # 除手足甲 & 道虚・人神配当
932
+ y,m0,d0 = dates.m_date.cal_date
933
+ misoka = m0 != (dates.m_date + When.Duration('P1D')).cal_date[1] if d0 == 29
934
+ notes['除手足甲'] = '除手足甲' if ([6,16,30].include?(d0) || misoka) && !(conditions[:kana] || notes['没'] || notes['滅'] || notes['凶会'])
935
+ notes['道虚'] = '道虚' if d0 % 6 == 0 || misoka
936
+ notes['人神配当'] = HumanBody[d0-1]
937
+
938
+ # 仮名暦
939
+ notes['赤舌' ] ||= d0 == (m * 5 - 3) % 6 + 1 ? '赤舌' : nil
940
+ notes['大赤' ] ||= d0 % 8 == (m * 7 - 3) % 8 ? '大赤' : nil
941
+ notes['不成就'] ||= d0 % 8 == [6,3,2,1,4,5][m % 6] || (misoka && m % 6 == 0) ? '不成就' : nil # 『現代こよみ読み解き事典』 for 不成就日
942
+ notes['六曜' ] ||= When::RokuyoWeek.rokuyo_value(m, d0)
943
+ notes
944
+ end
945
+ end
946
+
947
+ #
948
+ # 月の位相による暦注
949
+ #
950
+ class Japanese::LunarPhases < LunarPhases
951
+
952
+ # 日の暦注
953
+ # @private
954
+ def self._day_notes(notes, dates, conditions={})
955
+ date = When.when?(dates.o_date.to_cal_date.to_s,
956
+ {:frame=>dates.o_date.frame,
957
+ :clock=>dates.l_date.frame.time_basis})
958
+ phase, metsu = dates.cal4note.l_phases.position(date)
959
+
960
+ #
961
+ notes['滅'] = metsu == 2 && dates.range < 11 ? '滅' : nil
962
+
963
+ # 月相
964
+ unless notes['月相']
965
+ # イベントの判定
966
+ formula = dates.cal4note.l_phases.formula
967
+ clock = formula.kind_of?(When::Ephemeris::ChineseTrueLunation) &&
968
+ (5..25).include?(dates.l_date.cal_date[2]) ?
969
+ When.Clock(-21600) : # 唐代暦法の望弦は午前6時を日の境界とする
970
+ dates.l_date.frame._time_basis[-1] # その他(進朔も考慮した時刻)
971
+ odate = When.when?(dates.o_date.to_cal_date.to_s, {:frame=>dates.o_date.frame, :clock=>clock})
972
+ phases = formula.phase_range(odate)
973
+ thitis = phases.map {|phase| (phase % 1) * 30.0}
974
+ note = if thitis[0] >= thitis[1]
975
+ dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) || conditions[:shoyo] ? '朔' : nil
976
+ else
977
+ range = thitis[0]...thitis[1]
978
+ range.include?( 7.5) ? '上弦' :
979
+ range.include?(15.0) ? '望' :
980
+ range.include?(22.5) ? '下弦' : nil
981
+ end
982
+
983
+ # 結果の反映
984
+ if conditions[:shoyo]
985
+ # :shoyo が true ならイベント時刻も返す
986
+ notes['月相'] = if note
987
+ etime = formula._to_seed_type(formula.cn_to_time((phases[1] * 4).floor / 4.0), odate)
988
+ if formula.respond_to?(:lunation_length) && formula.lunation_length.kind_of?(Rational)
989
+ shoyo = etime.clk_time.universal_time
990
+ shoyo += When::TM::Duration::DAY if (0...clock.universal_time).include?(shoyo)
991
+ shoyo = (shoyo / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
992
+ shoyo = shoyo.to_i if shoyo == shoyo.to_i
993
+ "#{note}(#{shoyo}/#{formula.denominator})"
994
+ else
995
+ etime.events = [note]
996
+ etime
997
+ end
998
+ else
999
+ nil
1000
+ end
1001
+ else
1002
+ # :shoyo が false ならイベン名のみ返す
1003
+ notes['月相'] = note
1004
+ end
1005
+ end
1006
+
1007
+ # 月食
1008
+ unless notes['月食'] && notes['神吉'] && notes['三寶吉'] && notes['小字注']
1009
+ level = (conditions[:lunar_eclipse]||0).to_i
1010
+ if level == -1
1011
+ note = nil
1012
+ else
1013
+ key = dates.m_date.to_s[/\(.+\z/]
1014
+ if key
1015
+ note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
1016
+ elsif dates.o_date.location &&
1017
+ dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
1018
+ info = dates.o_date.location.lunar_eclipse(date..date)
1019
+ note = '' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
1020
+ end
1021
+ if note
1022
+ note.sub!(/\*.*\z/, '')
1023
+ note = nil unless /月/ =~ note
1024
+ note = nil if level[0] == 1 && /昼/ =~ note
1025
+ note = nil if level[1] == 1 && /^\(/ =~ note
1026
+ end
1027
+ end
1028
+ notes['月食'] = note
1029
+ end
1030
+
1031
+ notes
1032
+ end
1033
+ end
1034
+
1035
+ #
1036
+ # 太陽黄経による暦注
1037
+ #
1038
+ class Japanese::SolarTerms < SolarTerms
1039
+
1040
+ Notes12 = %w(正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月)
1041
+
1042
+ Notes10 = [
1043
+ %w(初伏 初伏),
1044
+ %w(仲伏 中伏),
1045
+ %w(後伏 末伏)]
1046
+
1047
+ Notes60_A = [
1048
+ # +0
1049
+ '侯小過外', # 315 : 正月
1050
+ '侯需外', # 345 : 二月
1051
+ '侯豫外', # 15 : 三月
1052
+ '侯旅外', # 45 : 四月
1053
+ '侯大有外', # 75 : 五月
1054
+ '侯鼎外', # 105 : 六月
1055
+ '侯恆外', # 135 : 七月
1056
+ '侯巽外', # 165 : 八月
1057
+ '侯歸妹外', # 195 : 九月
1058
+ '侯艮外', # 225 : 十月
1059
+ '侯未濟外', # 255 : 十一月
1060
+ '侯屯外' # 285 : 十二月
1061
+ ]
1062
+
1063
+ Notes60_B = [
1064
+ # +3 +9 +15 +21 +27
1065
+ '大夫蒙', '卿益', '公漸', '辟泰', '侯需内', # 315 : 正月
1066
+ '大夫随', '卿晋', '公解', '辟大壯', '侯豫内', # 345 : 二月
1067
+ '大夫訟', '卿蠱', '公革', '辟夬', '侯旅内', # 15 : 三月
1068
+ '大夫師', '卿比', '公小畜', '辟乾', '侯大有内', # 45 : 四月
1069
+ '大夫家人', '卿井', '公咸', '辟姤', '侯鼎内', # 75 : 五月
1070
+ '大夫豊', '卿渙', '公履', '辟遯', '侯恆内', # 105 : 六月
1071
+ '大夫節', '卿同人', '公損', '辟否', '侯巽内', # 135 : 七月
1072
+ '大夫萃', '卿大畜', '公賁', '辟観', '侯歸妹内', # 165 : 八月
1073
+ '大夫無妄', '卿明夷', '公困', '辟剥', '侯艮内', # 195 : 九月
1074
+ '大夫既濟', '卿噬嗑', '公大過', '辟坤', '侯未濟内', # 225 : 十月
1075
+ '大不蹇', '卿頤', '公中孚', '辟復', '侯屯内', # 255 : 十一月
1076
+ '大夫謙', '卿睽', '公升', '辟臨', '侯小過内' # 285 : 十二月
1077
+ ]
1078
+
1079
+ Notes72 = [
1080
+ # 儀鳳暦 宣明暦(中国) 宣明暦 貞享暦 宝暦暦・寛政暦 略本暦
1081
+ # 315 : 正月
1082
+ %w(雞始乳 東風解凍 東風解凍 東風解凍 東風解凍 東風解凍),
1083
+ %w(東風解凍 蟄始振 蟄虫始振 梅花乃芳 黄鶯睍睆 黄鶯睍睆),
1084
+ %w(蟄蟲始振 魚上氷 魚上氷 魚上氷 魚上氷 魚上氷),
1085
+ %w(魚上冰 獺祭魚 獺祭魚 土脈潤起 土脈潤起 土脉潤起),
1086
+ %w(獺祭魚 鴻雁来 鴻雁来 霞彩碧空 霞始靆 霞始靆),
1087
+ %w(鴻雁來 草木萌動 草木萌動 草木萌動 草木萌動 草木萌動),
1088
+
1089
+ # 345 : 二月
1090
+ %w(始雨水 桃始華 桃始華 蟄虫啓戸 蟄虫啓戸 蟄虫啓戸),
1091
+ %w(桃始花 倉庚鳴 倉庚鳴 寒雨間熟 桃始笑 桃始笑),
1092
+ %w(倉庚鳴 鷹化爲鳩 鷹化爲鳩 菜虫化蝶 菜虫化蝶 菜虫化蝶),
1093
+ %w(鷹化爲鳩 玄鳥至 玄鳥至 雀始巣 雀始巣 雀始巣),
1094
+ %w(玄鳥至 雷乃發聲 雷乃發聲 雷乃発声 桜始開 桜始開),
1095
+ %w(雷始發聲 始電 始電 桜始開桃始笑 雷乃発声 雷乃発声),
1096
+
1097
+ # 15 : 三月
1098
+ %w(始雷 桐始華 桐始華 玄鳥至 玄鳥至 玄鳥至),
1099
+ %w(蟄蟲咸動 田鼠化爲鴑 田鼠化爲鴑 鴻雁北 鴻雁北 鴻雁北),
1100
+ %w(蟄蟲啓戸 虹始見 虹始見 虹始見 虹始見 虹始見),
1101
+ %w(桐始華 萍始生 萍始生 葭始生 葭始生 葭始生),
1102
+ %w(田鼠化爲鴑 鳴鳩拂其羽 鳴鳩拂其羽 牡丹華 霜止出苗 霜止出苗),
1103
+ %w(虹始見 戴勝降于桑 戴勝降于桑 霜止出苗 牡丹華 牡丹華),
1104
+
1105
+ # 45 : 四月
1106
+ %w(萍始生 螻蟈鳴 螻蟈鳴 鵑始鳴 鼃始鳴 鼃始鳴),
1107
+ %w(戴勝降于桑 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出),
1108
+ %w(螻蟈鳴 王瓜生 王瓜生 竹笋生 竹笋生 竹笋生),
1109
+ %w(蚯蚓出 苦菜秀 苦菜秀 蚕起食桑 蚕起食桑 蚕起食桑),
1110
+ %w(王瓜生 靡草死 靡草死 紅花栄 紅花栄 紅花栄),
1111
+ %w(苦菜秀 小暑至 小暑至 麦秋至 麦秋至 麦秋至),
1112
+
1113
+ # 75 : 五月
1114
+ %w(靡草死 螳蜋生 螳蜋生 螳螂生 螳螂生 螳螂生),
1115
+ %w(小暑至 鵙始鳴 鵙始鳴 腐草為螢 腐草為螢 腐草為螢),
1116
+ %w(螳螂生 反舌無聲 反舌無聲 梅始黄 梅子黄 梅子黄),
1117
+ %w(鵙始鳴 鹿角解 鹿角解 乃東枯 乃東枯 乃東枯),
1118
+ %w(反舌無聲 蜩始鳴 蜩始鳴 分龍雨 菖蒲華 菖蒲華),
1119
+ %w(鹿角解 半夏生 半夏生 半夏生 半夏生 半夏生),
1120
+
1121
+ # 105 : 六月
1122
+ %w(蟬始鳴 温風至 温風至 温風至 温風至 温風至),
1123
+ %w(半夏生 蟋蟀居壁 蟋蟀居壁 蓮始華 蓮始華 蓮始開),
1124
+ %w(木槿榮 鷹乃學習 鷹乃學習 鷹乃学習 鷹乃学習 鷹乃学習),
1125
+ %w(温風至 腐草爲螢 腐草爲螢 桐始結花 桐始結花 桐始結花),
1126
+ %w(蟋蟀居壁 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑),
1127
+ %w(鷹乃學習 大雨時行 大雨時行 大雨時行 大雨時行 大雨時行),
1128
+
1129
+ # 135 : 七月
1130
+ %w(腐草爲螢 涼風至 涼風至 涼風至 涼風至 涼風至),
1131
+ %w(土潤溽暑 白露降 白露降 山沢浮雲 寒蝉鳴 寒蝉鳴),
1132
+ %w(涼風至 寒蟬鳴 寒蟬鳴 霧色已成 蒙霧升降 蒙霧升降),
1133
+ %w(白露降 鷹乃祭鳥 鷹乃祭鳥 寒蝉鳴 綿柎開 綿柎開),
1134
+ %w(寒蟬鳴 天地始肅 天地始肅 天地始粛 天地始粛 天地始粛),
1135
+ %w(鷹祭鳥 禾乃登 禾乃登 禾乃登 禾乃登 禾乃登),
1136
+
1137
+ # 165 : 八月
1138
+ %w(天地始肅 鴻雁来 鴻雁来 草露白 草露白 草露白),
1139
+ %w(暴風至 玄鳥歸 玄鳥歸 鶺鴒鳴 鶺鴒鳴 鶺鴒鳴),
1140
+ %w(鴻雁來 群鳥養羞 群鳥養羞 玄鳥去 玄鳥去 玄鳥去),
1141
+ %w(玄鳥歸 雷乃收聲 雷乃收聲 鴻雁来 雷乃収声 雷乃収声),
1142
+ %w(羣鳥養羞 蟄蟲坏戸 蟄蟲坏戸 蟄虫坏戸 蟄虫坏戸 蟄虫坏戸),
1143
+ %w(雷始收聲 水始涸 水始涸 水始涸 水始涸 水始涸),
1144
+
1145
+ # 195 : 九月
1146
+ %w(蟄蟲坏戸 鴻雁來賓 鴻雁來賓 棗栗零 鴻雁来 鴻雁来),
1147
+ %w(陰氣方盛 雀入大水爲蛤 雀入大水爲蛤 蟋蟀在戸 菊花開 菊花開),
1148
+ %w(陽氣始衰 菊有黄花 菊有黄花 菊花開 蟋蟀在戸 蟋蟀在戸),
1149
+ %w(水始涸 豺乃祭獸 豺乃祭獸 霜始降 霜始降 霜始降),
1150
+ %w(鴻雁來賓 草木黄落 草木黄落 蔦楓紅葉 霎時施 霎時施),
1151
+ %w(雀入水爲蛤 蟄蟲咸俯 蟄蟲咸俯 鶯雛鳴 楓蔦黄 楓蔦黄),
1152
+
1153
+ # 225 : 十月
1154
+ %w(菊有黄花 水始冰 水始冰 山茶始開 山茶始開 山茶始開),
1155
+ %w(豺祭獣 地始凍 地始凍 地始凍 地始凍 地始凍),
1156
+ %w(水始冰 野雞入大水爲蜃 野雞入大水爲蜃 霎乃降 金盞香 金盞香),
1157
+ %w(地始凍 虹藏不見 虹藏不見 虹蔵不見 虹蔵不見 虹蔵不見),
1158
+ %w(野雞入水爲蜃 天氣上騰地氣下降 天氣上騰地氣下降 樹葉咸落 朔風払葉 朔風払葉),
1159
+ %w(虹藏不見 閉塞而成冬 閉塞而成冬 橘始黄 橘始黄 橘始黄),
1160
+
1161
+ # 255 : 十一月
1162
+ %w(冰益壯 鶡鳥不鳴 鶡鳥不鳴 閉塞成冬 閉塞成冬 閉塞成冬),
1163
+ %w(地始坼 虎始交 虎始交 熊蟄穴 熊蟄穴 熊蟄穴),
1164
+ %w(鶡鳥不鳴 茘挺生 茘挺生 水仙開 鱖魚群 鱖魚群),
1165
+ %w(虎始交 蚯蚓結 蚯蚓結 乃東生 乃東生 乃東生),
1166
+ %w(芒始生 麋角解 麋角解 麋角解 麋角解 麋角解),
1167
+ %w(茘挺生 水泉動 水泉動 雪下出麦 雪下出麦 雪下出麦),
1168
+
1169
+ # 285 : 十二月
1170
+ %w(蚯蚓結 雁北郷 雁北郷 芹乃栄 芹乃栄 芹乃栄),
1171
+ %w(麋角解 鵲始巣 鵲始巣 風気乃行 水泉動 水泉動),
1172
+ %w(水泉動 野雞始鴝 野雞始鴝 雉始雊 雉始雊 雉始雊),
1173
+ %w(雁北郷 雞始乳 雞始乳 款冬華 款冬華 款冬華),
1174
+ %w(鵲始巣 鷙鳥厲疾 鷙鳥厲疾 水沢腹堅 水沢腹堅 水沢腹堅),
1175
+ %w(雉始雊 水澤腹堅 水澤腹堅 鶏始乳 鶏始乳 鶏始乳)
1176
+ ]
1177
+
1178
+ # 計算結果の修正
1179
+ # @private
1180
+ Patch = {
1181
+ 2039054 => [149.0, 1], # 貞観12(0870).07.17 [149.0, 0] 没
1182
+ 2039055 => [150.0, 0], # 貞観12(0870).07.18 [150.0, 1] 処暑
1183
+
1184
+ 2107233 => [ 29.0, 1], # 天喜05(1057).03.10 [ 29.0, 0]
1185
+ 2107234 => [ 30.0, 0], # 天喜05(1057).03.11 [ 30.0, 1] 穀雨
1186
+
1187
+ 2160437 => [269.0, 0], # 建仁02(1202).10=29 [270.0, 1] 冬至
1188
+ 2160438 => [270.0, 1], # 建仁02(1202).11.01 [271.0, 1]
1189
+ 2160439 => [271.0, 1], # 建仁02(1202).11.02 [272.0, 1]
1190
+ 2160440 => [272.0, 1], # 建仁02(1202).11.03 [272.0, 0]
1191
+
1192
+ 2175412 => [269.0, 1], # 寛元01(1243).11.03 [269.0, 0] 没
1193
+ 2175413 => [270.0, 0], # 寛元01(1243).11.04 [270.0, 1] 冬至
1194
+
1195
+ 2189200 => [179.0, 0], # 弘安04(1281).07=30 [180.0, 1] 秋分
1196
+ 2189201 => [180.0, 1], # 弘安04(1281).08.01 [181.0, 1]
1197
+ 2189202 => [181.0, 1], # 弘安04(1281).08.02 [181.0, 0] 没
1198
+
1199
+ 2243577 => [136.0, 0], # 永享02(1430).07.11 [136.0, 1] (立秋の翌日)
1200
+ 2243578 => [136.0, 1], # 永享02(1430).07.12 [137.0, 1]
1201
+ 2243579 => [137.0, 1], # 永享02(1430).07.13 [138.0, 1]
1202
+ 2243580 => [138.0, 1], # 永享02(1430).07.14 [139.0, 1]
1203
+ 2243581 => [139.0, 1], # 永享02(1430).07.15 [140.0, 1]
1204
+ 2243582 => [140.0, 1], # 永享02(1430).07.16 [141.0, 1]
1205
+ 2243583 => [141.0, 1], # 永享02(1430).07.17 [142.0, 1]
1206
+ 2243584 => [142.0, 1], # 永享02(1430).07.18 [143.0, 1]
1207
+ 2243585 => [143.0, 1], # 永享02(1430).07.19 [144.0, 1]
1208
+ 2243586 => [144.0, 1], # 永享02(1430).07.20 [145.0, 1]
1209
+ 2243587 => [145.0, 1], # 永享02(1430).07.21 [146.0, 1]
1210
+ 2243588 => [146.0, 1], # 永享02(1430).07.22 [147.0, 1]
1211
+ 2243589 => [147.0, 1], # 永享02(1430).07.23 [148.0, 1]
1212
+ 2243590 => [148.0, 1], # 永享02(1430).07.24 [149.0, 1]
1213
+ 2243591 => [149.0, 1], # 永享02(1430).07.25 [149.0, 0] (処暑の前日)
1214
+
1215
+ 2311770 => [ 29.0, 1], # 元和03(1617).03.18 [ 29.0, 0] 没
1216
+ 2311771 => [ 30.0, 0], # 元和03(1617).03.19 [ 30.0, 1] 穀雨
1217
+
1218
+ 2396062 => [314.0, 0], # 弘化04(1847).12.30 [315.0, 1] 立春 (計算誤差の補正)
1219
+ 2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0]
1220
+
1221
+ 2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0]
1222
+ 2397584 => [ 16.0, 0] # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
1223
+ }
1224
+
1225
+ class << self
1226
+ # テスト用の属性
1227
+ attr_writer :patch
1228
+ private :patch=
1229
+
1230
+ # 日の暦注
1231
+ # @private
1232
+ def _day_notes(notes, dates, conditions={})
1233
+ date = When.when?(dates.o_date.to_cal_date.to_s,
1234
+ {:frame=>dates.o_date.frame,
1235
+ :clock=>dates.s_date.frame._time_basis[0]})
1236
+ patch = (@patch || Patch)[date.to_i] unless dates.o_date.frame.respond_to?(:twin) &&
1237
+ dates.o_date.frame.twin
1238
+ longitude, motsu = patch ? patch : dates.cal4note.s_terms.position(date)
1239
+
1240
+ # 三伏 -
1241
+ #
1242
+ # : 夏至から 20..29
1243
+ # : 夏至から 30..39
1244
+ # : 立秋から 0..9
1245
+ if !notes['三伏'] && notes[''].remainder == 6 # 庚
1246
+ index = dates.range >= 11 ? 1 : 0
1247
+ if 109 <= longitude && longitude <= 129 # 夏至から
1248
+ term = dates.cal4note.s_terms.term(date, [-270,360])
1249
+ diff = dates.s_date.to_i - term.to_i
1250
+ notes['三伏'] = Notes10[0][index] if 20 <= diff && diff <= 29
1251
+ notes['三伏'] = Notes10[1][index] if 30 <= diff && diff <= 39
1252
+ elsif longitude == 135 # 立秋
1253
+ notes['三伏'] = Notes10[2][index]
1254
+ elsif 136 <= longitude && longitude <= 144 # 立秋から
1255
+ term = dates.cal4note.s_terms.term(date, [-225,360])
1256
+ diff = dates.s_date.to_i - term.to_i
1257
+ notes['三伏'] = Notes10[2][index] if 0 < diff && diff <= 9
1258
+ end
1259
+ end
1260
+
1261
+ # -
1262
+ #
1263
+ # 春秋分から -5..4
1264
+ if !notes['社'] && notes['干'].remainder == 4 # 戊
1265
+ if (longitude + 5) % 180 < 10 # 春秋分の近傍
1266
+ term = dates.cal4note.s_terms.term(date - When.Duration('P5D'), [0,180])
1267
+ diff = dates.s_date.to_i - term.to_i
1268
+ notes['社'] = '社' if -5 <= diff && diff <= 4
1269
+ end
1270
+ end
1271
+
1272
+ # 臘 - 辰
1273
+ #
1274
+ # 大寒から -6..5
1275
+ if !notes['臘'] && notes['支'].remainder == 4 #
1276
+ if (longitude - 339) % 360 < 12 # 大寒の近傍
1277
+ term = dates.cal4note.s_terms.term(date - When.Duration('P6D'), [345,360])
1278
+ diff = dates.s_date.to_i - term.to_i
1279
+ notes[''] = '臘' if -6 <= diff && diff <= 5
1280
+ end
1281
+ end
1282
+
1283
+ # 土用事
1284
+ unless notes['土用事']
1285
+ _longitude, _motsu = dates.cal4note.s_terms2.instance_of?(self) && dates.cal4note.doyo == 0 ? [longitude, motsu] :
1286
+ dates.cal4note.s_terms2.position(date, -dates.cal4note.doyo)
1287
+ if _motsu != 0 && _longitude % 90 == 27
1288
+ notes['土用事'] =
1289
+ begin
1290
+ event_name =
1291
+ case dates.range
1292
+ when 0 ; '土用' # 元嘉暦以前
1293
+ when 1 ; '土王' # 麟徳暦
1294
+ when 2..10 ; '土用事' # 大衍暦~宣明暦
1295
+ else ; '土用入' # 貞享暦以降
1296
+ end
1297
+ if conditions[:shoyo]
1298
+ dates.cal4note.s_terms2.event_time(date, event_name, [27-dates.cal4note.doyo, 90])
1299
+ else
1300
+ event_name
1301
+ end
1302
+ end
1303
+ end
1304
+ end
1305
+
1306
+ # 入梅 - 壬
1307
+ #
1308
+ # 貞享2(1685)~ 芒種から 1..10 日の壬の日
1309
+ # 元文5(1740)~ 芒種から 0..9 日の壬の日
1310
+ # 明治9(1876)~ 太陽黄経80度
1311
+ unless notes['入梅']
1312
+ if dates.year >= 1876
1313
+ notes['入梅'] = '入梅' if longitude == 80 && motsu == 1
1314
+ elsif notes[''].remainder == 8 #
1315
+ if (longitude - 75) % 360 <= 10 # 芒種の近傍
1316
+ term = dates.cal4note.s_terms.term(date - When.Duration('P11D'), [75,360])
1317
+ diff = dates.s_date.to_i - term.to_i
1318
+ diff += 1 if dates.year >= 1740
1319
+ notes['入梅'] = '入梅' if dates.range >= 11 && 1 <= diff && diff <= 10
1320
+ end
1321
+ end
1322
+ end
1323
+
1324
+ # 半夏生
1325
+ #
1326
+ # 太陽黄経100度
1327
+ notes['半夏生'] ||= '半夏生' if longitude == 100 && motsu == 1
1328
+
1329
+ # 立春を起算日とする雑節
1330
+ #
1331
+ unless notes['節分'] && notes['八十八夜'] && notes['二百十日'] && notes['二百廿日']
1332
+ term = dates.cal4note.s_terms.term(date + When.Duration('P3D'), [-45,360])
1333
+ case dates.s_date.to_i - term.to_i
1334
+ when -1 ; notes['節分'] ||= '節分'
1335
+ when 87 ; notes['八十八夜'] ||= '八十八夜'
1336
+ when 209 ; notes['二百十日'] ||= '二百十日'
1337
+ when 219 ; notes['二百廿日'] ||= '二百廿日'
1338
+ end
1339
+ end
1340
+
1341
+ # 日食
1342
+ unless notes['日食'] && notes['小字注']
1343
+ level = (conditions[:solar_eclipse]||0).to_i
1344
+ if level == -1
1345
+ note = nil
1346
+ else
1347
+ key = dates.m_date.to_s[/\(.+\z/]
1348
+ if key
1349
+ note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
1350
+ elsif dates.o_date.location &&
1351
+ dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
1352
+ info = dates.o_date.location.solar_eclipse(date..date)
1353
+ note = '' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
1354
+ end
1355
+ if note
1356
+ note.sub!(/\*.*\z/, '')
1357
+ note = nil unless /日/ =~ note
1358
+ note = nil if level[0] == 1 && /夜/ =~ note
1359
+ note = nil if level[1] == 1 && /^\(/ =~ note
1360
+ end
1361
+ end
1362
+ notes['日食'] = note
1363
+ end
1364
+
1365
+ #
1366
+ if motsu == 0
1367
+ notes['没'] = dates.range < 11 ? '没' : nil
1368
+ return notes unless patch
1369
+ else
1370
+ notes[''] = nil
1371
+ end
1372
+
1373
+ # 廿四節気
1374
+ div, mod = longitude.divmod(15)
1375
+ if mod == 0
1376
+ note = (div - 21) % 24
1377
+ div, mod = note.divmod(2)
1378
+ notes['節中'] ||= Notes12[div] + %w(節 中)[mod]
1379
+ notes['廿四節気'] ||=
1380
+ begin
1381
+ residue = When.Resource(dates.range == 1 ? '_co:Common?V=0618' : '_co:Common')['二十四節気::*'][(note-3) % 24]
1382
+ if conditions[:shoyo]
1383
+ dates.cal4note.s_terms.event_time(date, residue.label, [0,15])
1384
+ else
1385
+ residue
1386
+ end
1387
+ end
1388
+ end
1389
+
1390
+ # 七十二候
1391
+ div, mod = longitude.divmod(5)
1392
+ notes['七十二候'] ||= mod == 0 ? Notes72[(div - 63) % 72][dates.index_s] : nil
1393
+
1394
+ # 往亡
1395
+ unless notes['往亡'] && notes['神吉'] && notes['雑事吉']
1396
+ month = dates.s_date.cal_date[-2] - 1
1397
+ day = dates.s_date.cal_date[-1] - 1
1398
+ div, mod = month.divmod(3)
1399
+ deg = (div+7)*(mod+1) + month * 30 + 314
1400
+ notes['往亡'] = (dates.range < 11 ? (deg - longitude) % 360 == 0 : # 没を含まない
1401
+ (deg - 315 ) % 30 == day)? '往亡' : nil # 没を含む
1402
+ end
1403
+
1404
+ # 伏龍
1405
+ notes['伏龍'] ||= {
1406
+ 315 => '庭内去堂', 15 => '門内百日', 115 => '東垣六十日',
1407
+ 175 => '四隅百日', 275 => '竈内四十日'
1408
+ }[longitude]
1409
+
1410
+ # 六十卦
1411
+ div, mod = longitude.divmod(30)
1412
+ notes['六十卦'] ||= mod == 15 ? Notes60_A[(div - 10) % 12] : nil
1413
+ div, mod = longitude.divmod(6)
1414
+ notes['六十卦'] ||= mod == 0 ? Notes60_B[(div - 53) % 60] : nil
1415
+
1416
+ # 彼岸
1417
+ unless notes['彼岸']
1418
+ if dates.range < 11
1419
+ notes['彼岸'] = '彼岸' if longitude % 180 == 2 # 宣明暦以前(没を除いて3日後)
1420
+ else
1421
+ term = dates.cal4note.s_terms.term(date - When.Duration('P7D'), [0,180]) # 近傍の春秋分
1422
+ case dates.s_date.to_i - term.to_i
1423
+ when 2 ; notes['彼岸'] = '彼岸' if dates.range == 11 # 貞享暦(没を含めて3日後)
1424
+ when -5 ; notes['彼岸'] = '彼岸' if longitude > 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(春-6日前))
1425
+ when -1 ; notes['彼岸'] = '彼岸' if longitude <= 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(秋-2日前)
1426
+ when -3 ; notes['彼岸'] = '彼岸' if dates.year >= 1844 # 天保暦以降(秋-4日前)
1427
+ end
1428
+ end
1429
+ notes['彼岸'] = nil unless notes['彼岸'] == '彼岸'
1430
+ end
1431
+
1432
+ notes
1433
+ end
1434
+ end
1435
+ end
1436
+
1437
+ #
1438
+ # 太陽黄経による暦注
1439
+ #
1440
+ class Japanese::SolarTermsRevised < Japanese::SolarTerms
1441
+
1442
+ # 土用策
1443
+ DoyoShift = When::TM::PeriodDuration.new([0,0,12.1747411317])
1444
+
1445
+ # 日付に対応する座標
1446
+ #
1447
+ # @param [When::TM::TemporalPosition] date 日付
1448
+ # @param [Numeric] delta 周期の補正(土用の時刻の補正に使用,デフォルト 0)
1449
+ #
1450
+ # @return [Array<Integer>] Array< Integer, 0 or 1 or 2 >
1451
+ #
1452
+ # [Integer] 対応する座標
1453
+ #
1454
+ # [0 or 1 or 2] 座標の進み(0 なら 没, 2 なら滅)
1455
+ #
1456
+ def position(date, delta=0)
1457
+ return super if date.most_significant_coordinate >= 1869
1458
+ date = date.floor
1459
+ p0, p1 = [date, date.succ].map {|d| (30.0 * @formula.time_to_cn(d-DoyoShift) - @margin + 12).floor}
1460
+ [p1 % @den, p1 - p0]
1461
+ end
1462
+
1463
+ #
1464
+ # イベント日付(時刻付)
1465
+ #
1466
+ # @private
1467
+ def event_time(date, event_name, event)
1468
+ return super if date.most_significant_coordinate >= 1869
1469
+ etime = term(date + When.Duration('P3D'), [-15,30], When::SYSTEM) + DoyoShift
1470
+ if formula.respond_to?(:year_length) && formula.denominator && formula.denominator < 100000
1471
+ fraction = etime.clk_time.local_time
1472
+ fraction += When::TM::Duration::DAY * (etime.to_i - date.to_i)
1473
+ fraction = (fraction / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
1474
+ fraction = fraction.to_i if fraction == fraction.to_i
1475
+ event_name + "(#{fraction}/#{formula.denominator})"
1476
+ else
1477
+ etime.events = [event_name]
1478
+ etime
1479
+ end
1480
+ end
1481
+ end
1482
+ end