when_exe 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,93 +1,93 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2011-2014 Takashi SUGA
4
-
5
- You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
- =end
7
-
8
- module When
9
- class BasicTypes::M17n
10
-
11
- Japanese = [self, [
12
- "locale:[=en:, ja=ja:, alias=ja:]",
13
- "names:[Japanese=]",
14
-
15
- # Remarks
16
- "[based on Research Project 22520700=http://suchowan.at.webry.info/201401/article_25.html," +
17
- "典拠 - 科研22520700=]",
18
-
19
- [self,
20
- "names:[Month, 月=ja:%%<月_(暦)>]",
21
- "[Month 1=, *正月=ja:%%<1月_(旧暦)>, 睦月 ]",
22
- "[Month 2=, *二月=ja:%%<2月_(旧暦)>, 如月 ]",
23
- "[Month 3=, *三月=ja:%%<3月_(旧暦)>, 弥生 ]",
24
- "[Month 4=, *四月=ja:%%<4月_(旧暦)>, 卯月 ]",
25
- "[Month 5=, *五月=ja:%%<5月_(旧暦)>, 皐月 ]",
26
- "[Month 6=, *六月=ja:%%<6月_(旧暦)>, 水無月]",
27
- "[Month 7=, *七月=ja:%%<7月_(旧暦)>, 文月 ]",
28
- "[Month 8=, *八月=ja:%%<8月_(旧暦)>, 葉月 ]",
29
- "[Month 9=, *九月=ja:%%<9月_(旧暦)>, 長月 ]",
30
- "[Month 10=, *十月=ja:%%<10月_(旧暦)>, 神無月]",
31
- "[Month 11=, *十一月=ja:%%<11月_(旧暦)>, 霜月 ]",
32
- "[Month 12=, *十二月=ja:%%<21月_(旧暦)>, 師走 ]"
33
- ],
34
-
35
- [self,
36
- "names:[The_Tale_of_Genji, *源氏物語]",
37
- "[Kiritsubo=, *桐壺]",
38
- "[Hahakigi=, *帚木=ja:%%<帚木_(源氏物語)>]",
39
- "[Utsusemi=, *空蝉=ja:%%<空蝉_(源氏物語)>]",
40
- "[Yūgao=, *夕顔=ja:%%<夕顔_(源氏物語)>]",
41
- "[Wakamurasaki=, *若紫]",
42
- "[Suetsumuhana, *末摘花=ja:%%<末摘花_(源氏物語)>]",
43
- "[Momiji no Ga=, *紅葉賀]",
44
- "[Hana no En=, *花宴]",
45
- "[Aoi=, *葵=ja:%%<葵_(源氏物語)>]",
46
- "[Sakaki=, *賢木]",
47
- "[Hana Chiru Sato=, *花散里]",
48
- "[Suma=, *須磨=ja:%%<須磨_(源氏物語)>]",
49
- "[Akashi=, *明石=ja:%%<明石_(源氏物語)>]",
50
- "[Miotsukushi=, *澪標=ja:%%<澪標_(源氏物語)>]",
51
- "[Yomogiu=, *蓬生]",
52
- "[Sekiya=, *関屋=ja:%%<関屋_(源氏物語)>]",
53
- "[E Awase=, *絵合]",
54
- "[Matsukaze=, *松風=ja:%%<松風_(源氏物語)>]",
55
- "[Usugumo=, *薄雲]",
56
- "[Asagao=, *朝顔=ja:%%<朝顔_(源氏物語)>]",
57
- "[Otome=, *少女=ja:%%<少女_(源氏物語)>]",
58
- "[Tamakazura=, *玉鬘=ja:%%<玉鬘_(源氏物語)>]",
59
- "[Hatsune=, *初音=ja:%%<初音_(源氏物語)>]",
60
- "[Kochō=, *胡蝶=ja:%%<胡蝶_(源氏物語)>]",
61
- "[Hotaru=, *蛍=ja:%%<蛍_(源氏物語)>]",
62
- "[Tokonatsu=, *常夏]",
63
- "[Kagaribi=, *篝火]",
64
- "[Nowaki=, *野分=ja:%%<野分_(源氏物語)>]",
65
- "[Miyuki=, *行幸=ja:%%<行幸_(源氏物語)>]",
66
- "[Fujibakama=, *藤袴]",
67
- "[Makibashira=, *真木柱]",
68
- "[Mume ga E=, *梅枝]",
69
- "[Fuji no Uraba=, *藤裏葉]",
70
- "[Wakana=, *若菜=ja:%%<若菜_(源氏物語)>]",
71
- "[Kashiwagi=, *柏木=ja:%%<柏木_(源氏物語)>]",
72
- "[Yokobue=, *横笛=ja:%%<横笛_(源氏物語)>]",
73
- "[Suzumushi=, *鈴虫]",
74
- "[Yūgiri=, *夕霧=ja:%%<夕霧_(源氏物語)>]",
75
- "[Minori=, *御法]",
76
- "[Maboroshi=, *幻=ja:%%<幻_(源氏物語)>]",
77
- "[Niō Miya=, *匂宮]",
78
- "[Kōbai=, *紅梅=ja:%%<紅梅_(源氏物語)>]",
79
- "[Takekawa=, *竹河]",
80
- "[Hashihime=, *橋姫=ja:%%<橋姫_(源氏物語)>]",
81
- "[Shī ga Moto=, *椎本]",
82
- "[Agemaki=, *総角=ja:%%<総角_(源氏物語)>]",
83
- "[Sawarabi=, *早蕨]",
84
- "[Yadorigi=, *宿木]",
85
- "[Azumaya=, *東屋]",
86
- "[Ukifune, *浮舟=ja:%%<浮舟_(源氏物語)>]",
87
- "[Kagerō=, *蜻蛉=ja:%%<蜻蛉_(源氏物語)>]",
88
- "[Tenarai=, *手習]",
89
- "[Yume no Ukihashi=, *夢浮橋]"
90
- ]
91
- ]]
92
- end
93
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2011-2015 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ module When
9
+ class BasicTypes::M17n
10
+
11
+ Japanese = [self, [
12
+ "locale:[=en:, ja=ja:, alias=ja:]",
13
+ "names:[Japanese=]",
14
+
15
+ # Remarks
16
+ "[based on Research Project 22520700=http://suchowan.at.webry.info/201401/article_25.html," +
17
+ "典拠 - 科研22520700=]",
18
+
19
+ [self,
20
+ "names:[Month, 月=ja:%%<月_(暦)>]",
21
+ "[Month 1=, *正月=ja:%%<1月_(旧暦)>, 睦月 ]",
22
+ "[Month 2=, *二月=ja:%%<2月_(旧暦)>, 如月 ]",
23
+ "[Month 3=, *三月=ja:%%<3月_(旧暦)>, 弥生 ]",
24
+ "[Month 4=, *四月=ja:%%<4月_(旧暦)>, 卯月 ]",
25
+ "[Month 5=, *五月=ja:%%<5月_(旧暦)>, 皐月 ]",
26
+ "[Month 6=, *六月=ja:%%<6月_(旧暦)>, 水無月]",
27
+ "[Month 7=, *七月=ja:%%<7月_(旧暦)>, 文月 ]",
28
+ "[Month 8=, *八月=ja:%%<8月_(旧暦)>, 葉月 ]",
29
+ "[Month 9=, *九月=ja:%%<9月_(旧暦)>, 長月 ]",
30
+ "[Month 10=, *十月=ja:%%<10月_(旧暦)>, 神無月]",
31
+ "[Month 11=, *十一月=ja:%%<11月_(旧暦)>, 霜月 ]",
32
+ "[Month 12=, *十二月=ja:%%<12月_(旧暦)>, 師走 ]"
33
+ ],
34
+
35
+ [self,
36
+ "names:[The_Tale_of_Genji, *源氏物語]",
37
+ "[Kiritsubo=, *桐壺]",
38
+ "[Hahakigi=, *帚木=ja:%%<帚木_(源氏物語)>]",
39
+ "[Utsusemi=, *空蝉=ja:%%<空蝉_(源氏物語)>]",
40
+ "[Yūgao=, *夕顔=ja:%%<夕顔_(源氏物語)>]",
41
+ "[Wakamurasaki=, *若紫]",
42
+ "[Suetsumuhana, *末摘花=ja:%%<末摘花_(源氏物語)>]",
43
+ "[Momiji no Ga=, *紅葉賀]",
44
+ "[Hana no En=, *花宴]",
45
+ "[Aoi=, *葵=ja:%%<葵_(源氏物語)>]",
46
+ "[Sakaki=, *賢木]",
47
+ "[Hana Chiru Sato=, *花散里]",
48
+ "[Suma=, *須磨=ja:%%<須磨_(源氏物語)>]",
49
+ "[Akashi=, *明石=ja:%%<明石_(源氏物語)>]",
50
+ "[Miotsukushi=, *澪標=ja:%%<澪標_(源氏物語)>]",
51
+ "[Yomogiu=, *蓬生]",
52
+ "[Sekiya=, *関屋=ja:%%<関屋_(源氏物語)>]",
53
+ "[E Awase=, *絵合]",
54
+ "[Matsukaze=, *松風=ja:%%<松風_(源氏物語)>]",
55
+ "[Usugumo=, *薄雲]",
56
+ "[Asagao=, *朝顔=ja:%%<朝顔_(源氏物語)>]",
57
+ "[Otome=, *少女=ja:%%<少女_(源氏物語)>]",
58
+ "[Tamakazura=, *玉鬘=ja:%%<玉鬘_(源氏物語)>]",
59
+ "[Hatsune=, *初音=ja:%%<初音_(源氏物語)>]",
60
+ "[Kochō=, *胡蝶=ja:%%<胡蝶_(源氏物語)>]",
61
+ "[Hotaru=, *蛍=ja:%%<蛍_(源氏物語)>]",
62
+ "[Tokonatsu=, *常夏]",
63
+ "[Kagaribi=, *篝火]",
64
+ "[Nowaki=, *野分=ja:%%<野分_(源氏物語)>]",
65
+ "[Miyuki=, *行幸=ja:%%<行幸_(源氏物語)>]",
66
+ "[Fujibakama=, *藤袴]",
67
+ "[Makibashira=, *真木柱]",
68
+ "[Mume ga E=, *梅枝]",
69
+ "[Fuji no Uraba=, *藤裏葉]",
70
+ "[Wakana=, *若菜=ja:%%<若菜_(源氏物語)>]",
71
+ "[Kashiwagi=, *柏木=ja:%%<柏木_(源氏物語)>]",
72
+ "[Yokobue=, *横笛=ja:%%<横笛_(源氏物語)>]",
73
+ "[Suzumushi=, *鈴虫]",
74
+ "[Yūgiri=, *夕霧=ja:%%<夕霧_(源氏物語)>]",
75
+ "[Minori=, *御法]",
76
+ "[Maboroshi=, *幻=ja:%%<幻_(源氏物語)>]",
77
+ "[Niō Miya=, *匂宮]",
78
+ "[Kōbai=, *紅梅=ja:%%<紅梅_(源氏物語)>]",
79
+ "[Takekawa=, *竹河]",
80
+ "[Hashihime=, *橋姫=ja:%%<橋姫_(源氏物語)>]",
81
+ "[Shī ga Moto=, *椎本]",
82
+ "[Agemaki=, *総角=ja:%%<総角_(源氏物語)>]",
83
+ "[Sawarabi=, *早蕨]",
84
+ "[Yadorigi=, *宿木]",
85
+ "[Azumaya=, *東屋]",
86
+ "[Ukifune, *浮舟=ja:%%<浮舟_(源氏物語)>]",
87
+ "[Kagerō=, *蜻蛉=ja:%%<蜻蛉_(源氏物語)>]",
88
+ "[Tenarai=, *手習]",
89
+ "[Yume no Ukihashi=, *夢浮橋]"
90
+ ]
91
+ ]]
92
+ end
93
+ end
@@ -1,1495 +1,1510 @@
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:[二百廿日=ja:%%<二百二十日>]", '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:[三寶吉=http://kotobank.jp/word/%%<三宝吉日>]",
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.formula[0].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
- # @option options [Hash] :conditions 日本暦注固有の計算条件
477
- # :n27 通常月の廿七宿配当 *0:本月本説, 1:本月異説, 2:閏月本説, 3:閏月異説, 4:閏月本説(元)
478
- # :i27 閏月の廿七宿配当 同上
479
- # :sai *false,'0':日本暦日総覧説 , true:wagoyomi.net説
480
- # :shoyo *false:出力せず, true:暦定数が有理数の場合に出力
481
- # :solar_eclipse -1:計算を行わない, *0:すべて出力, 1:夜日食は出力しない, 3:夜日食に加え南半球で主に見える日食も出力しない
482
- # :lunar_eclipse -1:計算を行わない, *0:すべて出力, 1:昼月食は出力しない, 3:昼月食に加え半影月食も出力しない
483
- # :kana *false:具注暦用の計算, true:江戸仮名暦用の計算
484
- # (* がデフォルト)
485
- #
486
- # @note :indices, :notes およびその他のキー => {When::CalendarNote#notes} を参照
487
- #
488
- # @return [Hash] :notes が String の場合
489
- # @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合
490
- # @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合
491
- # @note return 値の [Hash] の要素は下記の通り
492
- #
493
- # :note => 暦注要素 (When::CalendarTypes::Japanese::Note)
494
- #
495
- # :value => 暦注の値 (String or When::BasicTypes::M17n または、その Array)
496
- #
497
- # :position => 具注暦でのその暦注の配置場所(String)
498
- #
499
- def notes(date, options={})
500
- dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
501
- NotesContainer.register(indices.map {|i|
502
- next [] unless i <= dates.precision
503
- send(NoteMethods[i-1], dates, notes[i-1], conditions)
504
- }, persistence, date.to_i)
505
- end
506
-
507
- # 太陽の位置 => 日時
508
- #
509
- # @param [When::TM::TemporalPosition] date 探す基準とする日時
510
- # @param [Array<Numeric>] parameter 太陽の位置の分子と分母( num, den)
511
- #
512
- # num 分子 (デフォルト 0 : 基準日時直後の春分)
513
- #
514
- # den 分母 (デフォルト 360 : 検索範囲の長さ)
515
- #
516
- # @param [String] parameter 太陽の位置の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(春分))
517
- # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
518
- #
519
- # @return [When::TM::CalDate] date またはその直後に太陽の位置が指定の値になる日時
520
- #
521
- def term(date, parameter=nil, precision=date.precision)
522
- dates = _to_date_for_note(date)
523
- result = dates.cal4note.s_terms.term(date, parameter)
524
- patch = SolarTerms::Patch[result.to_i]
525
- return result unless patch
526
- num, den = parameter.kind_of?(String) ? parameter.split('/', 2) : parameter
527
- num = (num || 0).to_f
528
- den = (den || 360).to_f
529
- diff = (num - patch[0] + 1) % den - 1
530
- return result if diff == 0
531
- patched = result + When::P1D * diff
532
- result.cal_date[0..-2] = patched.cal_date[0..-2]
533
- result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
534
- result
535
- end
536
-
537
- # 月の位相 => 日時
538
- #
539
- # @param [When::TM::TemporalPosition] date 探す基準とする日時
540
- # @param [Array<Numeric>] parameter 月の位相の分子と分母( num, den)
541
- #
542
- # num 分子 (デフォルト 0 : 基準日時直後の朔)
543
- #
544
- # den 分母 (デフォルト 30 : 検索範囲の長さ)
545
- #
546
- # @param [String] parameter 月の位相の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(朔))
547
- # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
548
- #
549
- # @return [When::TM::CalDate] date またはその直後に月の位相が指定の値になる日時
550
- #
551
- def phase(date, parameter=nil, precision=date.precision)
552
- dates = _to_date_for_note(date)
553
- note = dates.cal4note.l_phases
554
- result = note.phase(date, parameter)
555
- return result if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
556
-
557
- time = note.phase(date, parameter, When::SYSTEM)
558
- cn = note.formula.time_to_cn(time) % 1
559
- case cn
560
- when 0..0.0001, 0.9999..1 # 朔
561
- return result if result.cal_date[-1] == 1
562
- diff = result.cal_date[-1] < 15 ? -1 : +1
563
- when 0.2..0.8 # 弦、望
564
- return result unless note.formula.kind_of?(When::Ephemeris::ChineseTrueLunation)
565
- return result if time.clk_time.universal_time >= When::TM::Duration::DAY/4 # 午前6時以降
566
- diff = -1
567
- else # その他
568
- return result
569
- end
570
-
571
- patched = result + When::P1D * diff
572
- result.cal_date[0..-2] = patched.cal_date[0..-2]
573
- result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
574
- result
575
- end
576
-
577
- private
578
-
579
- # オブジェクトの正規化
580
- def _normalize(args=[], options={})
581
- @prime ||= [%w(干支), %w(月名), %w(七曜 干支 六曜 廿四節気 祝祭日)]
582
- super
583
- end
584
-
585
- # 年の暦注
586
- def year_notes(dates, notes, conditions={})
587
- _note_values(dates, notes, _all_keys[-3], _elements[-3]) do |dates, focused_notes, notes_hash|
588
-
589
- focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-3]
590
- root = When.Resource('_co:Common')
591
-
592
- # 干支
593
- residue = (dates.precision < When::DAY ? dates.o_date : dates.s_date).most_significant_coordinate - 4
594
- notes_hash['干支'] = root['干支'][residue % 60]
595
- notes_hash['干'] = root['干' ][residue % 10]
596
- notes_hash['支'] = root['支' ][residue % 12]
597
-
598
- # 廿八宿
599
- notes_hash['廿八宿'] ||= root['宿'][(residue+18) % 28]
600
-
601
- # 九星
602
- notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.year(residue)]
603
-
604
- # 大小
605
- unless notes_hash['大小']
606
- year = dates.o_date.floor(When::YEAR)
607
- month = year.floor(When::MONTH)
608
- pattern = ''
609
- while year == month
610
- length = month.length(When::MONTH)
611
- length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
612
- pattern += '閏' if month[When::MONTH] * 0 == 1
613
- pattern += MonthPattern[length] || '改'
614
- month += When::P1M
615
- end
616
- notes_hash['大小'] = "#{pattern}(#{year.length(When::YEAR)})"
617
- end
618
-
619
- # その他
620
- [notes_hash['干支'], notes_hash['干'], notes_hash['支']].each do |note|
621
- note._year_notes(notes_hash, dates, conditions)
622
- end
623
- notes_hash
624
- end
625
- end
626
-
627
- # 月の暦注
628
- def month_notes(dates, notes, conditions={})
629
- _note_values(dates, notes, _all_keys[-2], _elements[-2]) do |dates, focused_notes, notes_hash|
630
-
631
- focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-2]
632
- root = When.Resource('_co:Common')
633
-
634
- # 干支
635
- residue = month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.m_date)
636
- notes_hash['干支'] = root['干支'][residue % 60]
637
- notes_hash['干'] = root['干' ][residue % 10]
638
- notes_hash['支'] = root['支' ][residue % 12]
639
-
640
- # 廿八宿
641
- notes_hash['廿八宿'] ||= root['宿'][(residue+6) % 28]
642
-
643
- # 九星
644
- notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.month(
645
- month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.s_date))]
646
-
647
- # 大小
648
- unless notes_hash['大小']
649
- length = dates.o_date.length(When::MONTH)
650
- length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
651
- notes_hash['大小'] = "#{dates.o_date[When::MONTH]*0==1 ? '閏' : ''}#{MonthPattern[length] || '改'}(#{length.abs})"
652
- end
653
-
654
- # その他
655
- [notes_hash['干支'], notes_hash['干'], notes_hash['支'], JapaneseLuniSolarNote].each do |note|
656
- note._month_notes(notes_hash, dates, conditions)
657
- end
658
- notes_hash
659
- end
660
- end
661
-
662
- # 日の暦注
663
- def day_notes(dates, notes, conditions={})
664
- _note_values(dates, notes, _all_keys[-1], _elements[-1]) do |dates, focused_notes, notes_hash|
665
-
666
- focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-1]
667
- root = When.Resource('_co:Common')
668
-
669
- # 干支
670
- residue = dates.s_date.to_i-11
671
- notes_hash['干支'] = root['干支'][residue % 60]
672
- notes_hash['干'] = root['干' ][residue % 10]
673
- notes_hash['支'] = root['支' ][residue % 12]
674
-
675
- # その他
676
- [SolarTerms, LunarPhases, notes_hash['干支'], notes_hash['干'], notes_hash['支'],
677
- JapaneseLuniSolarNote, JapaneseSolarNote].each do |note|
678
- note._day_notes(notes_hash, dates, conditions)
679
- end
680
-
681
- # 七曜
682
- notes_hash['七曜'] ||= root['Week'][dates.s_date.to_i % 7]
683
-
684
- # 廿七宿
685
- notes_hash['廿七宿'] = _residue27(notes_hash['廿七宿'], root)
686
-
687
- # 廿八宿 / 鬼宿
688
- notes_hash['廿八宿'] ||= root['宿'][(dates.s_date.to_i+11) % 28]
689
- notes_hash['鬼宿'] ||= /鬼/ =~ notes_hash['廿八宿'].to_s ? '鬼宿' : nil
690
-
691
- # 九星
692
- notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.day(dates.s_date, dates.cal4note.s_terms)]
693
-
694
- notes_hash
695
- end
696
- end
697
-
698
- #
699
- # 日本暦日情報オブジェクトの生成
700
- #
701
- # @note 対となる太陽暦のある太陰太陽暦はそのまま(太陰太陽暦,太陽暦)の対
702
- # そうでなければ、採用する対を年代により選択する
703
- #
704
- def _to_date_for_note(date)
705
- if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
706
- return Dates.new(date) if date.frame.twin
707
- o_date = date
708
- else
709
- o_date = self.class._to_japanese_date(date)
710
- return nil unless o_date
711
- end
712
- year = o_date.most_significant_coordinate
713
- NoteTypes.each do |line|
714
- return Dates.new(o_date, year, date.precision, line[1]) if year >= line[0]
715
- end
716
- nil
717
- end
718
-
719
- #
720
- # 任意の暦を日本年号付暦日に変換
721
- #
722
- def self._to_japanese_date(date)
723
- return date if date._attr[:query] && date._attr[:query]['area'].to_s =~ /日本/
724
- (date^ When.era(:area=>'日本')).each do |list|
725
- return list[0] if list[0]
726
- end
727
- nil
728
- end
729
-
730
- #
731
- # 廿七宿を Resudue 化
732
- #
733
- def _residue27(index, root)
734
- return index unless index.kind_of?(Integer)
735
- root['宿'][index]
736
- end
737
-
738
- #
739
- # 月の干支
740
- #
741
- def month_stem_branch(date)
742
- date.most_significant_coordinate*12+(date.cal_date[1] * 1) +
743
- (date.frame.kind_of?(When::CalendarTypes::Christian) ? 12 : 13)
744
- end
745
- end
746
-
747
- #
748
- # 太陽暦の暦注・祝祭日
749
- #
750
- class JapaneseSolarNote < self
751
-
752
- #
753
- # 祝祭日一覧
754
- #
755
- NotesList = {
756
- [ 1, 1] => [[1868..1872, '元旦'], [1874..1948, '四方拝'], [1949..2100, '元日']],
757
- [ 1, 3] => [[1874..1948, '元始祭']],
758
- [ 1, 5] => [[1874..1948, '新年宴会']],
759
- [ 1,-2] => [[2000..2100, '成人の日']],
760
- [ 1,15] => [[1868..1872, '小正月'], [1949..1999, '成人の日']],
761
- [ 1,29] => [[1873..1873, '神武天皇即位日']],
762
- [ 1,30] => [[1874..1912, '孝明天皇祭']],
763
- [ 2,11] => [[1874..1948, '紀元節'], [1967..2100, '建国記念の日']],
764
- [ 2,24] => [[1989..1989, '昭和天皇の大喪の礼']],
765
- [ 3, 3] => [[1868..1872, '弥生節句']],
766
- [ 3, 0] => [[1879..1948, '春季皇霊祭'], [1949..2100, '春分の日']],
767
- [ 4, 3] => [[1874..1948, '神武天皇祭']],
768
- [ 4,10] => [[1959..1959, '皇太子明仁親王の結婚の儀']],
769
- [ 4,29] => [[1927..1948, '天長節'], [1949..1988, '天皇誕生日'], [1989..2006, 'みどりの日'], [2007..2100, '昭和の日']],
770
- [ 5, 3] => [[1949..2100, '憲法記念日']],
771
- [ 5, 4] => [[2007..2100, 'みどりの日']],
772
- [ 5, 5] => [[1868..1872, '端午節句'], [1949..2100, 'こどもの日']],
773
- [ 6, 9] => [[1993..1993, '皇太子徳仁親王の結婚の儀']],
774
- [ 7, 7] => [[1868..1872, '七夕節句']],
775
- [ 7,15] => [[1868..1872, 'お盆']],
776
- [ 7,20] => [[1996..2002, '海の日']],
777
- [ 7,-3] => [[2003..2100, '海の日']],
778
- [ 7,30] => [[1913..1926, '明治天皇祭']],
779
- [ 8, 1] => [[1868..1872, '田実節句']],
780
- [ 8,11] => [[2016..2100, '山の日']],
781
- [ 8,31] => [[1913..1926, '天長節']],
782
- [ 9, 9] => [[1868..1872, '重陽節句']],
783
- [ 9,15] => [[1966..2002, '敬老の日']],
784
- [ 9,-3] => [[2003..2100, '敬老の日']],
785
- [ 9,17] => [[1874..1878, '神嘗祭']],
786
- [ 9, 0] => [[1878..1947, '秋季皇霊祭'], [1948..2100, '秋分の日']],
787
- [10,10] => [[1966..1999, '体育の日']],
788
- [10,-2] => [[2000..2100, '体育の日']],
789
- [10,17] => [[1879..1947, '神嘗祭']],
790
- [10,31] => [[1913..1926, '天長節祝日']],
791
- [11, 3] => [[1873..1911, '天長節'], [1927..1947, '明治節'], [1948..2100, '文化の日']],
792
- [11,10] => [[1915..1915, '即位の礼'], [1928..1928, '即位の礼']],
793
- [11,12] => [[1990..1990, '即位の礼正殿の儀']],
794
- [11,14] => [[1915..1915, '大嘗祭'], [1928..1928, '大嘗祭']],
795
- [11,16] => [[1915..1915, '大饗第1日'], [1928..1928, '大饗第1日']],
796
- [11,23] => [[1873..1947, '新嘗祭'], [1948..2100, '勤労感謝の日']],
797
- [12,23] => [[1989..2100, '天皇誕生日']],
798
- [12,25] => [[1927..1947, '大正天皇祭']]
799
- }
800
-
801
- # @private
802
- Long = {3=>0, 9=>180}
803
-
804
- class << self
805
-
806
- # 日の暦注 - 祝祭日の計算
807
- # @private
808
- def _day_notes(notes, dates, conditions={})
809
- # 明治維新以降の実暦日のみ扱う
810
- return notes if dates.o_date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
811
- year = dates.o_date.most_significant_coordinate
812
- return notes unless year >= 1868
813
-
814
- # 春分の日と秋分の日を祝祭日に加える
815
- long = Long[dates.o_date.cal_date[1]] if year >= 1878
816
- if long
817
- date = When.when?(dates.o_date.to_cal_date.to_s,
818
- {:frame=>dates.o_date.frame,
819
- :clock=>dates.s_date.frame.time_basis})
820
- term = dates.cal4note.s_terms.term(date.floor(When::MONTH,
821
- When::DAY), [long,360]).cal_date[1..2]
822
- list = NotesList.dup
823
- list[term] = list[[term[0],0]]
824
- else
825
- list = NotesList
826
- end
827
-
828
- # 「国民の休日」制定以前
829
- notes['祝祭日'] ||= _holiday(list, dates.o_date, '振替休日')
830
- return notes if notes['祝祭日'] || year < 1988
831
-
832
- # 「国民の休日」制定以後
833
- duration = When.Duration('P1D')
834
- [duration, -duration].each do |d|
835
- return notes unless _holiday(list, dates.o_date + d)
836
- end
837
- notes['祝祭日'] = '国民の休日'
838
- return notes
839
- end
840
-
841
- private
842
-
843
- # 振替休日とハッピーマンデーを考慮した祝祭日
844
- def _holiday(list, date, alternate=nil)
845
- y = date.most_significant_coordinate
846
- m, d = date.cal_date[1..2]
847
-
848
- # 「振替休日」制定以前
849
- note = _note(list, y, m, d)
850
- return note if note || y < 1973
851
-
852
- # 「振替休日」制定以降
853
- case date.to_i % 7
854
- when 0 # 月曜
855
- # 振替休日
856
- note = _note(list, y, m, d-1)
857
- return alternate if note
858
- # ハッピーマンデー
859
- note = _note(list, y, m, -((d-1)/7 + 1))
860
- return note if note
861
- when 1,2 # 火曜・水曜
862
- # 振替休日
863
- return alternate if y >= 2007 && m == 5 && d == 6
864
- end
865
- end
866
-
867
- # 振替休日とハッピーマンデーを考慮しない祝祭日
868
- def _note(list, year, month, day)
869
- return nil if day == 0
870
- year = [year, 2100].min
871
- note = list[[month,day]]
872
- return nil unless note
873
- note.each do |range|
874
- return range[1] if range[0].include?(year)
875
- end
876
- return nil
877
- end
878
- end
879
- end
880
-
881
- #
882
- # 太陰太陽暦の暦注
883
- #
884
- class JapaneseLuniSolarNote < self
885
-
886
- # 変換表 月日→27宿
887
- StarMansions = [ # 正 2 3 4 5 6 7 8 9 10 11 12
888
- [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
889
- [ 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
890
- [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
891
- [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
892
- [14, 16, 18, 23, 22, 24, 0, 3, 5, 7, 8, 12] # 4 : 閏月本説(元) (星24) (女09)
893
- ]
894
-
895
- # 変換表 27宿→28宿
896
- StarMansionIndex = (0..7).to_a + (9..27).to_a
897
-
898
- # 七曜と27宿で決まる暦注
899
- WeekDepended = {
900
- # 日 月 火 水 木 金 土
901
- '甘露' => [26, 17, 5, 22, 21, 3, 23], # 軫27 畢18 尾05 柳23 鬼22 房03 星24
902
- '金剛峯' => [ 5, 8, 12, 16, 20, 24, 1], # 尾05 女09 壁13 昴17 井21 張25 亢01
903
- '羅刹' => [15, 21, 25, 19, 2, 13, 22] # 胃16 鬼22 翼26 参20 氐02 奎14 柳23
904
- }
905
-
906
- # 人神配当
907
- HumanBody = %w(足大指 外踝 股内 腰 口 手 内踝 腕 尻 腰背
908
- 鼻柱 髪際 牙歯 胃管 遍身 胸 気街 股内 足 踝
909
- 足小指 足踝及胸、目下 肝及足 手陽明 足陽明 胸 膝 陰 膝晊 足跌)
910
-
911
- # 月の暦注
912
- # @private
913
- def self._month_notes(notes, dates, conditions={})
914
- # 月名
915
- notes['月名'] ||= dates.o_date.name('month')
916
- end
917
-
918
- # 日の暦注
919
- # @private
920
- def self._day_notes(notes, dates, conditions={})
921
-
922
- # 廿七宿
923
- m, l = [1,0].map {|f| dates.m_date.cal_date[1] * f}
924
- d = (StarMansions[l==1 ? (conditions[:i27]||0) :
925
- (conditions[:n27]||0)][m-1] + dates.m_date.cal_date[2] - 1) % 27
926
- notes['廿七宿'] ||= StarMansionIndex[d]
927
-
928
- # 甘露 / 金剛峯 / 羅刹
929
- w = (dates.m_date.to_i + 1) % 7
930
- ['甘露', '金剛峯', '羅刹'].each do |c|
931
- notes[c] = c if d == WeekDepended[c][w]
932
- end
933
-
934
- # 三寶吉・神吉・雑事吉・小字注 (凶会日は表引きの時点で抑制済み)
935
- notes['神吉'] = notes['雑事吉'] = notes['三寶吉'] = notes['小字注'] = nil if notes['没'] || notes['滅']
936
- notes['神吉'] = notes['雑事吉'] = nil if notes['往亡']
937
- notes['神吉'] = notes['三寶吉'] = nil if notes['月食']
938
- notes['小字注'] = nil if notes['日食'] || notes['月食']
939
- notes['小字注'] = nil if notes['九坎'] && dates.range==5 # 11世紀後半
940
- notes['三寶吉'] = nil if notes['羅刹']
941
- notes['三寶吉'] = notes['甘露'] ? '三寶吉' : nil if /\+/ =~ notes['三寶吉'].to_s
942
- notes['三寶吉'] = '三吉' if notes['三寶吉'] && dates.range >= 8 # 鎌倉以降
943
-
944
- # 除手足甲 & 道虚・人神配当
945
- y,m0,d0 = dates.m_date.cal_date
946
- misoka = m0 != (dates.m_date + When.Duration('P1D')).cal_date[1] if d0 == 29
947
- notes['除手足甲'] = '除手足甲' if ([6,16,30].include?(d0) || misoka) && !(conditions[:kana] || notes['没'] || notes['滅'] || notes['凶会'])
948
- notes['道虚'] = '道虚' if d0 % 6 == 0 || misoka
949
- notes['人神配当'] = HumanBody[d0-1]
950
-
951
- # 仮名暦
952
- notes['赤舌' ] ||= d0 == (m * 5 - 3) % 6 + 1 ? '赤舌' : nil
953
- notes['大赤' ] ||= d0 % 8 == (m * 7 - 3) % 8 ? '大赤' : nil
954
- notes['不成就'] ||= d0 % 8 == [6,3,2,1,4,5][m % 6] || (misoka && m % 6 == 0) ? '不成就' : nil # 『現代こよみ読み解き事典』 for 不成就日
955
- notes['六曜' ] ||= When::RokuyoWeek.rokuyo_value(m, d0)
956
- notes
957
- end
958
- end
959
-
960
- #
961
- # 月の位相による暦注
962
- #
963
- class Japanese::LunarPhases < LunarPhases
964
-
965
- # 日の暦注
966
- # @private
967
- def self._day_notes(notes, dates, conditions={})
968
- date = When.when?(dates.o_date.to_cal_date.to_s,
969
- {:frame=>dates.o_date.frame,
970
- :clock=>dates.l_date.frame.time_basis})
971
- phase, metsu = dates.cal4note.l_phases.position(date)
972
-
973
- # 滅
974
- notes['滅'] = metsu == 2 && dates.range < 11 ? '滅' : nil
975
-
976
- # 月相
977
- unless notes['月相']
978
- # イベントの判定
979
- formula = dates.cal4note.l_phases.formula
980
- clock = formula.kind_of?(When::Ephemeris::ChineseTrueLunation) &&
981
- (5..25).include?(dates.l_date.cal_date[2]) ?
982
- When.Clock(-21600) : # 唐代暦法の望弦は午前6時を日の境界とする
983
- dates.l_date.frame._time_basis[-1] # その他(進朔も考慮した時刻)
984
- odate = When.when?(dates.o_date.to_cal_date.to_s, {:frame=>dates.o_date.frame, :clock=>clock})
985
- phases = formula.phase_range(odate)
986
- thitis = phases.map {|phase| (phase % 1) * 30.0}
987
- note = if thitis[0] >= thitis[1]
988
- dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) || conditions[:shoyo] ? '朔' : nil
989
- else
990
- range = thitis[0]...thitis[1]
991
- range.include?( 7.5) ? '上弦' :
992
- range.include?(15.0) ? '' :
993
- range.include?(22.5) ? '下弦' : nil
994
- end
995
-
996
- # 結果の反映
997
- if conditions[:shoyo]
998
- # :shoyo が true ならイベント時刻も返す
999
- notes['月相'] = if note
1000
- etime = formula._to_seed_type(formula.cn_to_time((phases[1] * 4).floor / 4.0), odate)
1001
- if formula.respond_to?(:lunation_length) && formula.lunation_length.kind_of?(Rational)
1002
- shoyo = etime.clk_time.universal_time
1003
- shoyo += When::TM::Duration::DAY if (0...clock.universal_time).include?(shoyo)
1004
- shoyo = (shoyo / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
1005
- shoyo = shoyo.to_i if shoyo == shoyo.to_i
1006
- "#{note}(#{shoyo}/#{formula.denominator})"
1007
- else
1008
- etime.events = [note]
1009
- etime
1010
- end
1011
- else
1012
- nil
1013
- end
1014
- else
1015
- # :shoyo false ならイベン名のみ返す
1016
- notes['月相'] = note
1017
- end
1018
- end
1019
-
1020
- # 月食
1021
- unless notes['月食'] && notes['神吉'] && notes['三寶吉'] && notes['小字注']
1022
- level = (conditions[:lunar_eclipse]||0).to_i
1023
- if level == -1
1024
- note = nil
1025
- else
1026
- key = dates.m_date.to_s[/\(.+\z/]
1027
- if key
1028
- note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
1029
- elsif dates.o_date.location &&
1030
- dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
1031
- info = dates.o_date.location.lunar_eclipse(date..date)
1032
- note = '月' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
1033
- end
1034
- if note
1035
- note.sub!(/\*.*\z/, '')
1036
- note = nil unless /月/ =~ note
1037
- note = nil if level[0] == 1 && /昼/ =~ note
1038
- note = nil if level[1] == 1 && /^\(/ =~ note
1039
- end
1040
- end
1041
- notes['月食'] = note
1042
- end
1043
-
1044
- notes
1045
- end
1046
- end
1047
-
1048
- #
1049
- # 太陽黄経による暦注
1050
- #
1051
- class Japanese::SolarTerms < SolarTerms
1052
-
1053
- Notes12 = %w(正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月)
1054
-
1055
- Notes10 = [
1056
- %w(初伏 初伏),
1057
- %w(仲伏 中伏),
1058
- %w(後伏 末伏)]
1059
-
1060
- Notes60_A = [
1061
- # +0
1062
- '侯小過外', # 315 : 正月
1063
- '侯需外', # 345 : 二月
1064
- '侯豫外', # 15 : 三月
1065
- '侯旅外', # 45 : 四月
1066
- '侯大有外', # 75 : 五月
1067
- '侯鼎外', # 105 : 六月
1068
- '侯恆外', # 135 : 七月
1069
- '侯巽外', # 165 : 八月
1070
- '侯歸妹外', # 195 : 九月
1071
- '侯艮外', # 225 : 十月
1072
- '侯未濟外', # 255 : 十一月
1073
- '侯屯外' # 285 : 十二月
1074
- ]
1075
-
1076
- Notes60_B = [
1077
- # +3 +9 +15 +21 +27
1078
- '大夫蒙', '卿益', '公漸', '辟泰', '侯需内', # 315 : 正月
1079
- '大夫随', '卿晋', '公解', '辟大壯', '侯豫内', # 345 : 二月
1080
- '大夫訟', '卿蠱', '公革', '辟夬', '侯旅内', # 15 : 三月
1081
- '大夫師', '卿比', '公小畜', '辟乾', '侯大有内', # 45 : 四月
1082
- '大夫家人', '卿井', '公咸', '辟姤', '侯鼎内', # 75 : 五月
1083
- '大夫豊', '卿渙', '公履', '辟遯', '侯恆内', # 105 : 六月
1084
- '大夫節', '卿同人', '公損', '辟否', '侯巽内', # 135 : 七月
1085
- '大夫萃', '卿大畜', '公賁', '辟観', '侯歸妹内', # 165 : 八月
1086
- '大夫無妄', '卿明夷', '公困', '辟剥', '侯艮内', # 195 : 九月
1087
- '大夫既濟', '卿噬嗑', '公大過', '辟坤', '侯未濟内', # 225 : 十月
1088
- '大不蹇', '卿頤', '公中孚', '辟復', '侯屯内', # 255 : 十一月
1089
- '大夫謙', '卿睽', '公升', '辟臨', '侯小過内' # 285 : 十二月
1090
- ]
1091
-
1092
- Notes72 = [
1093
- # 儀鳳暦 宣明暦(中国) 宣明暦 貞享暦 宝暦暦・寛政暦 略本暦
1094
- # 315 : 正月
1095
- %w(雞始乳 東風解凍 東風解凍 東風解凍 東風解凍 東風解凍),
1096
- %w(東風解凍 蟄始振 蟄虫始振 梅花乃芳 黄鶯睍睆 黄鶯睍睆),
1097
- %w(蟄蟲始振 魚上氷 魚上氷 魚上氷 魚上氷 魚上氷),
1098
- %w(魚上冰 獺祭魚 獺祭魚 土脈潤起 土脈潤起 土脉潤起),
1099
- %w(獺祭魚 鴻雁来 鴻雁来 霞彩碧空 霞始靆 霞始靆),
1100
- %w(鴻雁來 草木萌動 草木萌動 草木萌動 草木萌動 草木萌動),
1101
-
1102
- # 345 : 二月
1103
- %w(始雨水 桃始華 桃始華 蟄虫啓戸 蟄虫啓戸 蟄虫啓戸),
1104
- %w(桃始花 倉庚鳴 倉庚鳴 寒雨間熟 桃始笑 桃始笑),
1105
- %w(倉庚鳴 鷹化爲鳩 鷹化爲鳩 菜虫化蝶 菜虫化蝶 菜虫化蝶),
1106
- %w(鷹化爲鳩 玄鳥至 玄鳥至 雀始巣 雀始巣 雀始巣),
1107
- %w(玄鳥至 雷乃發聲 雷乃發聲 雷乃発声 桜始開 桜始開),
1108
- %w(雷始發聲 始電 始電 桜始開桃始笑 雷乃発声 雷乃発声),
1109
-
1110
- # 15 : 三月
1111
- %w(始雷 桐始華 桐始華 玄鳥至 玄鳥至 玄鳥至),
1112
- %w(蟄蟲咸動 田鼠化爲鴑 田鼠化爲鴑 鴻雁北 鴻雁北 鴻雁北),
1113
- %w(蟄蟲啓戸 虹始見 虹始見 虹始見 虹始見 虹始見),
1114
- %w(桐始華 萍始生 萍始生 葭始生 葭始生 葭始生),
1115
- %w(田鼠化爲鴑 鳴鳩拂其羽 鳴鳩拂其羽 牡丹華 霜止出苗 霜止出苗),
1116
- %w(虹始見 戴勝降于桑 戴勝降于桑 霜止出苗 牡丹華 牡丹華),
1117
-
1118
- # 45 : 四月
1119
- %w(萍始生 螻蟈鳴 螻蟈鳴 鵑始鳴 鼃始鳴 鼃始鳴),
1120
- %w(戴勝降于桑 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出),
1121
- %w(螻蟈鳴 王瓜生 王瓜生 竹笋生 竹笋生 竹笋生),
1122
- %w(蚯蚓出 苦菜秀 苦菜秀 蚕起食桑 蚕起食桑 蚕起食桑),
1123
- %w(王瓜生 靡草死 靡草死 紅花栄 紅花栄 紅花栄),
1124
- %w(苦菜秀 小暑至 小暑至 麦秋至 麦秋至 麦秋至),
1125
-
1126
- # 75 : 五月
1127
- %w(靡草死 螳蜋生 螳蜋生 螳螂生 螳螂生 螳螂生),
1128
- %w(小暑至 鵙始鳴 鵙始鳴 腐草為螢 腐草為螢 腐草為螢),
1129
- %w(螳螂生 反舌無聲 反舌無聲 梅始黄 梅子黄 梅子黄),
1130
- %w(鵙始鳴 鹿角解 鹿角解 乃東枯 乃東枯 乃東枯),
1131
- %w(反舌無聲 蜩始鳴 蜩始鳴 分龍雨 菖蒲華 菖蒲華),
1132
- %w(鹿角解 半夏生 半夏生 半夏生 半夏生 半夏生),
1133
-
1134
- # 105 : 六月
1135
- %w(蟬始鳴 温風至 温風至 温風至 温風至 温風至),
1136
- %w(半夏生 蟋蟀居壁 蟋蟀居壁 蓮始華 蓮始華 蓮始開),
1137
- %w(木槿榮 鷹乃學習 鷹乃學習 鷹乃学習 鷹乃学習 鷹乃学習),
1138
- %w(温風至 腐草爲螢 腐草爲螢 桐始結花 桐始結花 桐始結花),
1139
- %w(蟋蟀居壁 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑),
1140
- %w(鷹乃學習 大雨時行 大雨時行 大雨時行 大雨時行 大雨時行),
1141
-
1142
- # 135 : 七月
1143
- %w(腐草爲螢 涼風至 涼風至 涼風至 涼風至 涼風至),
1144
- %w(土潤溽暑 白露降 白露降 山沢浮雲 寒蝉鳴 寒蝉鳴),
1145
- %w(涼風至 寒蟬鳴 寒蟬鳴 霧色已成 蒙霧升降 蒙霧升降),
1146
- %w(白露降 鷹乃祭鳥 鷹乃祭鳥 寒蝉鳴 綿柎開 綿柎開),
1147
- %w(寒蟬鳴 天地始肅 天地始肅 天地始粛 天地始粛 天地始粛),
1148
- %w(鷹祭鳥 禾乃登 禾乃登 禾乃登 禾乃登 禾乃登),
1149
-
1150
- # 165 : 八月
1151
- %w(天地始肅 鴻雁来 鴻雁来 草露白 草露白 草露白),
1152
- %w(暴風至 玄鳥歸 玄鳥歸 鶺鴒鳴 鶺鴒鳴 鶺鴒鳴),
1153
- %w(鴻雁來 群鳥養羞 群鳥養羞 玄鳥去 玄鳥去 玄鳥去),
1154
- %w(玄鳥歸 雷乃收聲 雷乃收聲 鴻雁来 雷乃収声 雷乃収声),
1155
- %w(羣鳥養羞 蟄蟲坏戸 蟄蟲坏戸 蟄虫坏戸 蟄虫坏戸 蟄虫坏戸),
1156
- %w(雷始收聲 水始涸 水始涸 水始涸 水始涸 水始涸),
1157
-
1158
- # 195 : 九月
1159
- %w(蟄蟲坏戸 鴻雁來賓 鴻雁來賓 棗栗零 鴻雁来 鴻雁来),
1160
- %w(陰氣方盛 雀入大水爲蛤 雀入大水爲蛤 蟋蟀在戸 菊花開 菊花開),
1161
- %w(陽氣始衰 菊有黄花 菊有黄花 菊花開 蟋蟀在戸 蟋蟀在戸),
1162
- %w(水始涸 豺乃祭獸 豺乃祭獸 霜始降 霜始降 霜始降),
1163
- %w(鴻雁來賓 草木黄落 草木黄落 蔦楓紅葉 霎時施 霎時施),
1164
- %w(雀入水爲蛤 蟄蟲咸俯 蟄蟲咸俯 鶯雛鳴 楓蔦黄 楓蔦黄),
1165
-
1166
- # 225 : 十月
1167
- %w(菊有黄花 水始冰 水始冰 山茶始開 山茶始開 山茶始開),
1168
- %w(豺祭獣 地始凍 地始凍 地始凍 地始凍 地始凍),
1169
- %w(水始冰 野雞入大水爲蜃 野雞入大水爲蜃 霎乃降 金盞香 金盞香),
1170
- %w(地始凍 虹藏不見 虹藏不見 虹蔵不見 虹蔵不見 虹蔵不見),
1171
- %w(野雞入水爲蜃 天氣上騰地氣下降 天氣上騰地氣下降 樹葉咸落 朔風払葉 朔風払葉),
1172
- %w(虹藏不見 閉塞而成冬 閉塞而成冬 橘始黄 橘始黄 橘始黄),
1173
-
1174
- # 255 : 十一月
1175
- %w(冰益壯 鶡鳥不鳴 鶡鳥不鳴 閉塞成冬 閉塞成冬 閉塞成冬),
1176
- %w(地始坼 虎始交 虎始交 熊蟄穴 熊蟄穴 熊蟄穴),
1177
- %w(鶡鳥不鳴 茘挺生 茘挺生 水仙開 鱖魚群 鱖魚群),
1178
- %w(虎始交 蚯蚓結 蚯蚓結 乃東生 乃東生 乃東生),
1179
- %w(芒始生 麋角解 麋角解 麋角解 麋角解 麋角解),
1180
- %w(茘挺生 水泉動 水泉動 雪下出麦 雪下出麦 雪下出麦),
1181
-
1182
- # 285 : 十二月
1183
- %w(蚯蚓結 雁北郷 雁北郷 芹乃栄 芹乃栄 芹乃栄),
1184
- %w(麋角解 鵲始巣 鵲始巣 風気乃行 水泉動 水泉動),
1185
- %w(水泉動 野雞始鴝 野雞始鴝 雉始雊 雉始雊 雉始雊),
1186
- %w(雁北郷 雞始乳 雞始乳 款冬華 款冬華 款冬華),
1187
- %w(鵲始巣 鷙鳥厲疾 鷙鳥厲疾 水沢腹堅 水沢腹堅 水沢腹堅),
1188
- %w(雉始雊 水澤腹堅 水澤腹堅 鶏始乳 鶏始乳 鶏始乳)
1189
- ]
1190
-
1191
- # 計算結果の修正
1192
- # @private
1193
- Patch = {
1194
- 2039054 => [149.0, 1], # 貞観12(0870).07.17 [149.0, 0] 没
1195
- 2039055 => [150.0, 0], # 貞観12(0870).07.18 [150.0, 1] 処暑
1196
-
1197
- 2107233 => [ 29.0, 1], # 天喜05(1057).03.10 [ 29.0, 0] 没
1198
- 2107234 => [ 30.0, 0], # 天喜05(1057).03.11 [ 30.0, 1] 穀雨
1199
-
1200
- 2160437 => [269.0, 0], # 建仁02(1202).10=29 [270.0, 1] 冬至
1201
- 2160438 => [270.0, 1], # 建仁02(1202).11.01 [271.0, 1]
1202
- 2160439 => [271.0, 1], # 建仁02(1202).11.02 [272.0, 1]
1203
- 2160440 => [272.0, 1], # 建仁02(1202).11.03 [272.0, 0] 没
1204
-
1205
- 2175412 => [269.0, 1], # 寛元01(1243).11.03 [269.0, 0] 没
1206
- 2175413 => [270.0, 0], # 寛元01(1243).11.04 [270.0, 1] 冬至
1207
-
1208
- 2189200 => [179.0, 0], # 弘安04(1281).07=30 [180.0, 1] 秋分
1209
- 2189201 => [180.0, 1], # 弘安04(1281).08.01 [181.0, 1]
1210
- 2189202 => [181.0, 1], # 弘安04(1281).08.02 [181.0, 0]
1211
-
1212
- 2243577 => [136.0, 0], # 永享02(1430).07.11 [136.0, 1] (立秋の翌日)
1213
- 2243578 => [136.0, 1], # 永享02(1430).07.12 [137.0, 1]
1214
- 2243579 => [137.0, 1], # 永享02(1430).07.13 [138.0, 1]
1215
- 2243580 => [138.0, 1], # 永享02(1430).07.14 [139.0, 1]
1216
- 2243581 => [139.0, 1], # 永享02(1430).07.15 [140.0, 1]
1217
- 2243582 => [140.0, 1], # 永享02(1430).07.16 [141.0, 1]
1218
- 2243583 => [141.0, 1], # 永享02(1430).07.17 [142.0, 1]
1219
- 2243584 => [142.0, 1], # 永享02(1430).07.18 [143.0, 1]
1220
- 2243585 => [143.0, 1], # 永享02(1430).07.19 [144.0, 1]
1221
- 2243586 => [144.0, 1], # 永享02(1430).07.20 [145.0, 1]
1222
- 2243587 => [145.0, 1], # 永享02(1430).07.21 [146.0, 1]
1223
- 2243588 => [146.0, 1], # 永享02(1430).07.22 [147.0, 1]
1224
- 2243589 => [147.0, 1], # 永享02(1430).07.23 [148.0, 1]
1225
- 2243590 => [148.0, 1], # 永享02(1430).07.24 [149.0, 1]
1226
- 2243591 => [149.0, 1], # 永享02(1430).07.25 [149.0, 0] 没 (処暑の前日)
1227
-
1228
- 2311770 => [ 29.0, 1], # 元和03(1617).03.18 [ 29.0, 0]
1229
- 2311771 => [ 30.0, 0], # 元和03(1617).03.19 [ 30.0, 1] 穀雨
1230
-
1231
- 2396062 => [314.0, 0], # 弘化04(1847).12.30 [315.0, 1] 立春 (計算誤差の補正)
1232
- 2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0]
1233
-
1234
- 2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0]
1235
- 2397584 => [ 16.0, 0] # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
1236
- }
1237
-
1238
- class << self
1239
- # テスト用の属性
1240
- attr_writer :patch
1241
- private :patch=
1242
-
1243
- # 日の暦注
1244
- # @private
1245
- def _day_notes(notes, dates, conditions={})
1246
- date = When.when?(dates.o_date.to_cal_date.to_s,
1247
- {:frame=>dates.o_date.frame,
1248
- :clock=>dates.s_date.frame._time_basis[0]})
1249
- patch = (@patch || Patch)[date.to_i] unless dates.o_date.frame.respond_to?(:twin) &&
1250
- dates.o_date.frame.twin
1251
- longitude, motsu = patch ? patch : dates.cal4note.s_terms.position(date)
1252
-
1253
- # 三伏 - 庚
1254
- #
1255
- # : 夏至から 20..29
1256
- # : 夏至から 30..39
1257
- # 後 : 立秋から 0..9
1258
- if !notes['三伏'] && notes['干'].remainder == 6 #
1259
- index = dates.range >= 11 ? 1 : 0
1260
- if 109 <= longitude && longitude <= 129 # 夏至から
1261
- term = dates.cal4note.s_terms.term(date, [-270,360])
1262
- diff = dates.s_date.to_i - term.to_i
1263
- notes['三伏'] = Notes10[0][index] if 20 <= diff && diff <= 29
1264
- notes['三伏'] = Notes10[1][index] if 30 <= diff && diff <= 39
1265
- elsif longitude == 135 # 立秋
1266
- notes['三伏'] = Notes10[2][index]
1267
- elsif 136 <= longitude && longitude <= 144 # 立秋から
1268
- term = dates.cal4note.s_terms.term(date, [-225,360])
1269
- diff = dates.s_date.to_i - term.to_i
1270
- notes['三伏'] = Notes10[2][index] if 0 < diff && diff <= 9
1271
- end
1272
- end
1273
-
1274
- # -
1275
- #
1276
- # 春秋分から -5..4
1277
- if !notes['社'] && notes['干'].remainder == 4 # 戊
1278
- if (longitude + 5) % 180 < 10 # 春秋分の近傍
1279
- term = dates.cal4note.s_terms.term(date - When.Duration('P5D'), [0,180])
1280
- diff = dates.s_date.to_i - term.to_i
1281
- notes[''] = '社' if -5 <= diff && diff <= 4
1282
- end
1283
- end
1284
-
1285
- # -
1286
- #
1287
- # 大寒から -6..5
1288
- if !notes['臘'] && notes['支'].remainder == 4 # 辰
1289
- if (longitude - 339) % 360 < 12 # 大寒の近傍
1290
- term = dates.cal4note.s_terms.term(date - When.Duration('P6D'), [345,360])
1291
- diff = dates.s_date.to_i - term.to_i
1292
- notes[''] = '' if -6 <= diff && diff <= 5
1293
- end
1294
- end
1295
-
1296
- # 土用事
1297
- unless notes['土用事']
1298
- _longitude, _motsu = dates.cal4note.s_terms2.instance_of?(self) && dates.cal4note.doyo == 0 ? [longitude, motsu] :
1299
- dates.cal4note.s_terms2.position(date, -dates.cal4note.doyo)
1300
- if _motsu != 0 && _longitude % 90 == 27
1301
- notes['土用事'] =
1302
- begin
1303
- event_name =
1304
- case dates.range
1305
- when 0 ; '土用' # 元嘉暦以前
1306
- when 1 ; '土王' # 麟徳暦
1307
- when 2..10 ; '土用事' # 大衍暦~宣明暦
1308
- else ; '土用入' # 貞享暦以降
1309
- end
1310
- if conditions[:shoyo]
1311
- dates.cal4note.s_terms2.event_time(date, event_name, [27-dates.cal4note.doyo, 90])
1312
- else
1313
- event_name
1314
- end
1315
- end
1316
- end
1317
- end
1318
-
1319
- # 入梅 - 壬
1320
- #
1321
- # 貞享2(1685)~ 芒種から 1..10 日の壬の日
1322
- # 元文5(1740)~ 芒種から 0..9 日の壬の日
1323
- # 明治9(1876)~ 太陽黄経80度
1324
- unless notes['入梅']
1325
- if dates.year >= 1876
1326
- notes['入梅'] = '入梅' if longitude == 80 && motsu == 1
1327
- elsif notes['干'].remainder == 8 # 壬
1328
- if (longitude - 75) % 360 <= 10 # 芒種の近傍
1329
- term = dates.cal4note.s_terms.term(date - When.Duration('P11D'), [75,360])
1330
- diff = dates.s_date.to_i - term.to_i
1331
- diff += 1 if dates.year >= 1740
1332
- notes['入梅'] = '入梅' if dates.range >= 11 && 1 <= diff && diff <= 10
1333
- end
1334
- end
1335
- end
1336
-
1337
- # 半夏生
1338
- #
1339
- # 太陽黄経100度
1340
- notes['半夏生'] ||= '半夏生' if longitude == 100 && motsu == 1
1341
-
1342
- # 立春を起算日とする雑節
1343
- #
1344
- unless notes['節分'] && notes['八十八夜'] && notes['二百十日'] && notes['二百廿日']
1345
- term = dates.cal4note.s_terms.term(date + When.Duration('P3D'), [-45,360])
1346
- case dates.s_date.to_i - term.to_i
1347
- when -1 ; notes['節分'] ||= '節分'
1348
- when 87 ; notes['八十八夜'] ||= '八十八夜'
1349
- when 209 ; notes['二百十日'] ||= '二百十日'
1350
- when 219 ; notes['二百廿日'] ||= '二百廿日'
1351
- end
1352
- end
1353
-
1354
- # 日食
1355
- unless notes['日食'] && notes['小字注']
1356
- level = (conditions[:solar_eclipse]||0).to_i
1357
- if level == -1
1358
- note = nil
1359
- else
1360
- key = dates.m_date.to_s[/\(.+\z/]
1361
- if key
1362
- note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
1363
- elsif dates.o_date.location &&
1364
- dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
1365
- info = dates.o_date.location.solar_eclipse(date..date)
1366
- note = '日' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
1367
- end
1368
- if note
1369
- note.sub!(/\*.*\z/, '')
1370
- note = nil unless /日/ =~ note
1371
- note = nil if level[0] == 1 && /夜/ =~ note
1372
- note = nil if level[1] == 1 && /^\(/ =~ note
1373
- end
1374
- end
1375
- notes['日食'] = note
1376
- end
1377
-
1378
- #
1379
- if motsu == 0
1380
- notes['没'] = dates.range < 11 ? '没' : nil
1381
- return notes unless patch
1382
- else
1383
- notes['没'] = nil
1384
- end
1385
-
1386
- # 廿四節気
1387
- div, mod = longitude.divmod(15)
1388
- if mod == 0
1389
- note = (div - 21) % 24
1390
- div, mod = note.divmod(2)
1391
- notes['節中'] ||= Notes12[div] + %w(節 中)[mod]
1392
- notes['廿四節気'] ||=
1393
- begin
1394
- residue = When.Resource(dates.range == 1 ? '_co:Common?V=0618' : '_co:Common')['二十四節気::*'][(note-3) % 24]
1395
- if conditions[:shoyo]
1396
- dates.cal4note.s_terms.event_time(date, residue.label, [0,15])
1397
- else
1398
- residue
1399
- end
1400
- end
1401
- end
1402
-
1403
- # 七十二候
1404
- div, mod = longitude.divmod(5)
1405
- notes['七十二候'] ||= mod == 0 ? Notes72[(div - 63) % 72][dates.index_s] : nil
1406
-
1407
- # 往亡
1408
- unless notes['往亡'] && notes['神吉'] && notes['雑事吉']
1409
- month = dates.s_date.cal_date[-2] - 1
1410
- day = dates.s_date.cal_date[-1] - 1
1411
- div, mod = month.divmod(3)
1412
- deg = (div+7)*(mod+1) + month * 30 + 314
1413
- notes['往亡'] = (dates.range < 11 ? (deg - longitude) % 360 == 0 : # 没を含まない
1414
- (deg - 315 ) % 30 == day)? '往亡' : nil # 没を含む
1415
- end
1416
-
1417
- # 伏龍
1418
- notes['伏龍'] ||= {
1419
- 315 => '庭内去堂', 15 => '門内百日', 115 => '東垣六十日',
1420
- 175 => '四隅百日', 275 => '竈内四十日'
1421
- }[longitude]
1422
-
1423
- # 六十卦
1424
- div, mod = longitude.divmod(30)
1425
- notes['六十卦'] ||= mod == 15 ? Notes60_A[(div - 10) % 12] : nil
1426
- div, mod = longitude.divmod(6)
1427
- notes['六十卦'] ||= mod == 0 ? Notes60_B[(div - 53) % 60] : nil
1428
-
1429
- # 彼岸
1430
- unless notes['彼岸']
1431
- if dates.range < 11
1432
- notes['彼岸'] = '彼岸' if longitude % 180 == 2 # 宣明暦以前(没を除いて3日後)
1433
- else
1434
- term = dates.cal4note.s_terms.term(date - When.Duration('P7D'), [0,180]) # 近傍の春秋分
1435
- case dates.s_date.to_i - term.to_i
1436
- when 2 ; notes['彼岸'] = '彼岸' if dates.range == 11 # 貞享暦(没を含めて3日後)
1437
- when -5 ; notes['彼岸'] = '彼岸' if longitude > 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(春-6日前))
1438
- when -1 ; notes['彼岸'] = '彼岸' if longitude <= 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(秋-2日前)
1439
- when -3 ; notes['彼岸'] = '彼岸' if dates.year >= 1844 # 天保暦以降(秋-4日前)
1440
- end
1441
- end
1442
- notes['彼岸'] = nil unless notes['彼岸'] == '彼岸'
1443
- end
1444
-
1445
- notes
1446
- end
1447
- end
1448
- end
1449
-
1450
- #
1451
- # 太陽黄経による暦注
1452
- #
1453
- class Japanese::SolarTermsRevised < Japanese::SolarTerms
1454
-
1455
- # 土用策
1456
- DoyoShift = When::TM::PeriodDuration.new([0,0,12.1747411317])
1457
-
1458
- # 日付に対応する座標
1459
- #
1460
- # @param [When::TM::TemporalPosition] date 日付
1461
- # @param [Numeric] delta 周期の補正(土用の時刻の補正に使用,デフォルト 0)
1462
- #
1463
- # @return [Array<Integer>] Array< Integer, 0 or 1 or 2 >
1464
- #
1465
- # [Integer] 対応する座標
1466
- #
1467
- # [0 or 1 or 2] 座標の進み(0 なら 没, 2 なら滅)
1468
- #
1469
- def position(date, delta=0)
1470
- return super if date.most_significant_coordinate >= 1869
1471
- date = date.floor
1472
- p0, p1 = [date, date.succ].map {|d| (30.0 * @formula.time_to_cn(d-DoyoShift) - @margin + 12).floor}
1473
- [p1 % @den, p1 - p0]
1474
- end
1475
-
1476
- #
1477
- # イベント日付(時刻付)
1478
- #
1479
- # @private
1480
- def event_time(date, event_name, event)
1481
- return super if date.most_significant_coordinate >= 1869
1482
- etime = term(date + When.Duration('P3D'), [-15,30], When::SYSTEM) + DoyoShift
1483
- if formula.respond_to?(:year_length) && formula.denominator && formula.denominator < 100000
1484
- fraction = etime.clk_time.local_time
1485
- fraction += When::TM::Duration::DAY * (etime.to_i - date.to_i)
1486
- fraction = (fraction / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
1487
- fraction = fraction.to_i if fraction == fraction.to_i
1488
- event_name + "(#{fraction}/#{formula.denominator})"
1489
- else
1490
- etime.events = [event_name]
1491
- etime
1492
- end
1493
- end
1494
- end
1495
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2012-2015 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:[年, YearNote]",
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:[月, MonthNote]",
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:[日, DayNote]",
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:[二百廿日=ja:%%<二百二十日>]", '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:[三寶吉=http://kotobank.jp/word/%%<三宝吉日>]",
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.formula[0].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
+ # @option options [Hash] :conditions 日本暦注固有の計算条件
477
+ # :n27 通常月の廿七宿配当 *0:本月本説, 1:本月異説, 2:閏月本説, 3:閏月異説, 4:閏月本説(元)
478
+ # :i27 閏月の廿七宿配当 同上
479
+ # :sai *false,'0':日本暦日総覧説 , true:wagoyomi.net説
480
+ # :shoyo *false:出力せず, true:暦定数が有理数の場合に出力
481
+ # :solar_eclipse -1:計算を行わない, *0:すべて出力, 1:夜日食は出力しない, 3:夜日食に加え南半球で主に見える日食も出力しない
482
+ # :lunar_eclipse -1:計算を行わない, *0:すべて出力, 1:昼月食は出力しない, 3:昼月食に加え半影月食も出力しない
483
+ # :kana *false:具注暦用の計算, true:江戸仮名暦用の計算
484
+ # (* がデフォルト)
485
+ #
486
+ # @note :indices, :notes およびその他のキー => {When::CalendarNote#notes} を参照
487
+ #
488
+ # @return [Hash] :notes が String の場合
489
+ # @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合
490
+ # @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合
491
+ # @note return 値の [Hash] の要素は下記の通り
492
+ #
493
+ # :note => 暦注要素 (When::CalendarTypes::Japanese::Note)
494
+ #
495
+ # :value => 暦注の値 (String or When::BasicTypes::M17n または、その Array)
496
+ #
497
+ # :position => 具注暦でのその暦注の配置場所(String)
498
+ #
499
+ def notes(date, options={})
500
+ dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
501
+ NotesContainer.register(indices.map {|i|
502
+ next [] unless i <= dates.precision
503
+ send(NoteMethods[i-1], dates, notes[i-1], conditions)
504
+ }, persistence, date.to_i)
505
+ end
506
+
507
+ # 太陽の位置 => 日時
508
+ #
509
+ # @param [When::TM::TemporalPosition] date 探す基準とする日時
510
+ # @param [Array<Numeric>] parameter 太陽の位置の分子と分母( num, den)
511
+ #
512
+ # num 分子 (デフォルト 0 : 基準日時直後の春分)
513
+ #
514
+ # den 分母 (デフォルト 360 : 検索範囲の長さ)
515
+ #
516
+ # @param [String] parameter 太陽の位置の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(春分))
517
+ # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
518
+ #
519
+ # @return [When::TM::CalDate] date またはその直後に太陽の位置が指定の値になる日時
520
+ #
521
+ def term(date, parameter=nil, precision=date.precision)
522
+ dates = _to_date_for_note(date)
523
+ result = dates.cal4note.s_terms.term(date, parameter)
524
+ patch = SolarTerms::Patch[result.to_i]
525
+ return result unless patch
526
+ num, den = parameter.kind_of?(String) ? parameter.split('/', 2) : parameter
527
+ num = (num || 0).to_f
528
+ den = (den || 360).to_f
529
+ diff = (num - patch[0] + 1) % den - 1
530
+ return result if diff == 0
531
+ patched = result + When::P1D * diff
532
+ result.cal_date[0..-2] = patched.cal_date[0..-2]
533
+ result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
534
+ result
535
+ end
536
+
537
+ # 月の位相 => 日時
538
+ #
539
+ # @param [When::TM::TemporalPosition] date 探す基準とする日時
540
+ # @param [Array<Numeric>] parameter 月の位相の分子と分母( num, den)
541
+ #
542
+ # num 分子 (デフォルト 0 : 基準日時直後の朔)
543
+ #
544
+ # den 分母 (デフォルト 30 : 検索範囲の長さ)
545
+ #
546
+ # @param [String] parameter 月の位相の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(朔))
547
+ # @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
548
+ #
549
+ # @return [When::TM::CalDate] date またはその直後に月の位相が指定の値になる日時
550
+ #
551
+ def phase(date, parameter=nil, precision=date.precision)
552
+ dates = _to_date_for_note(date)
553
+ note = dates.cal4note.l_phases
554
+ result = note.phase(date, parameter)
555
+ return result if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
556
+
557
+ time = note.phase(date, parameter, When::SYSTEM)
558
+ cn = note.formula.time_to_cn(time) % 1
559
+ case cn
560
+ when 0..0.0001, 0.9999..1 # 朔
561
+ return result if result.cal_date[-1] == 1
562
+ diff = result.cal_date[-1] < 15 ? -1 : +1
563
+ when 0.2..0.8 # 弦、望
564
+ return result unless note.formula.kind_of?(When::Ephemeris::ChineseTrueLunation)
565
+ return result if time.clk_time.universal_time >= When::TM::Duration::DAY/4 # 午前6時以降
566
+ diff = -1
567
+ else # その他
568
+ return result
569
+ end
570
+
571
+ patched = result + When::P1D * diff
572
+ result.cal_date[0..-2] = patched.cal_date[0..-2]
573
+ result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
574
+ result
575
+ end
576
+
577
+ private
578
+
579
+ # オブジェクトの正規化
580
+ def _normalize(args=[], options={})
581
+ @prime ||= [%w(干支), %w(月名), %w(七曜 干支 六曜 廿四節気 祝祭日)]
582
+ super
583
+ end
584
+
585
+ # 年の暦注
586
+ def year_notes(dates, notes, conditions={})
587
+ _note_values(dates, notes, _all_keys[-3], _elements[-3]) do |dates, focused_notes, notes_hash|
588
+
589
+ focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-3]
590
+ root = When.Resource('_co:Common')
591
+
592
+ # 干支
593
+ residue = (dates.precision < When::DAY ? dates.o_date : dates.s_date).most_significant_coordinate - 4
594
+ notes_hash['干支'] = root['干支'][residue % 60]
595
+ notes_hash['干'] = root['干' ][residue % 10]
596
+ notes_hash['支'] = root['支' ][residue % 12]
597
+
598
+ # 廿八宿
599
+ notes_hash['廿八宿'] ||= root['宿'][(residue+18) % 28]
600
+
601
+ # 九星
602
+ notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.year(residue)]
603
+
604
+ # 大小
605
+ unless notes_hash['大小']
606
+ year = dates.o_date.floor(When::YEAR)
607
+ month = year.floor(When::MONTH)
608
+ pattern = ''
609
+ while year == month
610
+ length = month.length(When::MONTH)
611
+ length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
612
+ pattern += '閏' if month[When::MONTH] * 0 == 1
613
+ pattern += MonthPattern[length] || '改'
614
+ month += When::P1M
615
+ end
616
+ notes_hash['大小'] = "#{pattern}(#{year.length(When::YEAR)})"
617
+ end
618
+
619
+ # その他
620
+ [notes_hash['干支'], notes_hash['干'], notes_hash['支']].each do |note|
621
+ note._year_notes(notes_hash, dates, conditions)
622
+ end
623
+ notes_hash
624
+ end
625
+ end
626
+
627
+ # 月の暦注
628
+ def month_notes(dates, notes, conditions={})
629
+ _note_values(dates, notes, _all_keys[-2], _elements[-2]) do |dates, focused_notes, notes_hash|
630
+
631
+ focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-2]
632
+ root = When.Resource('_co:Common')
633
+
634
+ # 干支
635
+ residue = month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.m_date)
636
+ notes_hash['干支'] = root['干支'][residue % 60]
637
+ notes_hash['干'] = root['干' ][residue % 10]
638
+ notes_hash['支'] = root['支' ][residue % 12]
639
+
640
+ # 廿八宿
641
+ notes_hash['廿八宿'] ||= root['宿'][(residue+6) % 28]
642
+
643
+ # 九星
644
+ notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.month(
645
+ month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.s_date))]
646
+
647
+ # 大小
648
+ unless notes_hash['大小']
649
+ length = dates.o_date.length(When::MONTH)
650
+ length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
651
+ notes_hash['大小'] = "#{dates.o_date[When::MONTH]*0==1 ? '閏' : ''}#{MonthPattern[length] || '改'}(#{length.abs})"
652
+ end
653
+
654
+ # その他
655
+ [notes_hash['干支'], notes_hash['干'], notes_hash['支'], JapaneseLuniSolarNote].each do |note|
656
+ note._month_notes(notes_hash, dates, conditions)
657
+ end
658
+ notes_hash
659
+ end
660
+ end
661
+
662
+ # 日の暦注
663
+ def day_notes(dates, notes, conditions={})
664
+ _note_values(dates, notes, _all_keys[-1], _elements[-1]) do |dates, focused_notes, notes_hash|
665
+
666
+ focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-1]
667
+ root = When.Resource('_co:Common')
668
+
669
+ # 干支
670
+ residue = dates.s_date.to_i-11
671
+ notes_hash['干支'] = root['干支'][residue % 60]
672
+ notes_hash['干'] = root['干' ][residue % 10]
673
+ notes_hash['支'] = root['支' ][residue % 12]
674
+
675
+ # その他
676
+ [SolarTerms, LunarPhases, notes_hash['干支'], notes_hash['干'], notes_hash['支'],
677
+ JapaneseLuniSolarNote, JapaneseSolarNote].each do |note|
678
+ note._day_notes(notes_hash, dates, conditions)
679
+ end
680
+
681
+ # 七曜
682
+ notes_hash['七曜'] ||= root['Week'][dates.s_date.to_i % 7]
683
+
684
+ # 廿七宿
685
+ notes_hash['廿七宿'] = _residue27(notes_hash['廿七宿'], root)
686
+
687
+ # 廿八宿 / 鬼宿
688
+ notes_hash['廿八宿'] ||= root['宿'][(dates.s_date.to_i+11) % 28]
689
+ notes_hash['鬼宿'] ||= /鬼/ =~ notes_hash['廿八宿'].to_s ? '鬼宿' : nil
690
+
691
+ # 九星
692
+ notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.day(dates.s_date, dates.cal4note.s_terms)]
693
+
694
+ notes_hash
695
+ end
696
+ end
697
+
698
+ #
699
+ # 日本暦日情報オブジェクトの生成
700
+ #
701
+ # @note 対となる太陽暦のある太陰太陽暦はそのまま(太陰太陽暦,太陽暦)の対
702
+ # そうでなければ、採用する対を年代により選択する
703
+ #
704
+ def _to_date_for_note(date)
705
+ if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
706
+ return Dates.new(date) if date.frame.twin
707
+ o_date = date
708
+ else
709
+ o_date = self.class._to_japanese_date(date)
710
+ return nil unless o_date
711
+ end
712
+ year = o_date.most_significant_coordinate
713
+ NoteTypes.each do |line|
714
+ return Dates.new(o_date, year, date.precision, line[1]) if year >= line[0]
715
+ end
716
+ nil
717
+ end
718
+
719
+ #
720
+ # 任意の暦を日本年号付暦日に変換
721
+ #
722
+ # @param When::TM::CalDate] date 変換元日付
723
+ #
724
+ # @return [When::TM::CalDate] 変換結果
725
+ #
726
+ def self._to_japanese_date(date)
727
+ return date if is_japanese_date?(date)
728
+ (date^ When.era(:area=>'日本')).each do |list|
729
+ return list[0] if list[0]
730
+ end
731
+ nil
732
+ end
733
+
734
+ #
735
+ # 日本年号付暦日か?
736
+ #
737
+ # @param When::TM::CalDate] date 確認する日付
738
+ #
739
+ # @return [Boolean] true YES / false NO
740
+ #
741
+ def self.is_japanese_date?(date)
742
+ date._attr[:query] && date._attr[:query]['area'].to_s =~ /日本/
743
+ end
744
+
745
+ #
746
+ # 廿七宿を Resudue 化
747
+ #
748
+ def _residue27(index, root)
749
+ return index unless index.kind_of?(Integer)
750
+ root['宿'][index]
751
+ end
752
+
753
+ #
754
+ # 月の干支
755
+ #
756
+ def month_stem_branch(date)
757
+ date.most_significant_coordinate*12+(date.cal_date[1] * 1) +
758
+ (date.frame.kind_of?(When::CalendarTypes::Christian) ? 12 : 13)
759
+ end
760
+ end
761
+
762
+ #
763
+ # 太陽暦の暦注・祝祭日
764
+ #
765
+ class JapaneseSolarNote < self
766
+
767
+ #
768
+ # 祝祭日一覧
769
+ #
770
+ NotesList = {
771
+ [ 1, 1] => [[1868..1872, '元旦'], [1874..1948, '四方拝'], [1949..2100, '元日']],
772
+ [ 1, 3] => [[1874..1948, '元始祭']],
773
+ [ 1, 5] => [[1874..1948, '新年宴会']],
774
+ [ 1,-2] => [[2000..2100, '成人の日']],
775
+ [ 1,15] => [[1868..1872, '小正月'], [1949..1999, '成人の日']],
776
+ [ 1,29] => [[1873..1873, '神武天皇即位日']],
777
+ [ 1,30] => [[1874..1912, '孝明天皇祭']],
778
+ [ 2,11] => [[1874..1948, '紀元節'], [1967..2100, '建国記念の日']],
779
+ [ 2,24] => [[1989..1989, '昭和天皇の大喪の礼']],
780
+ [ 3, 3] => [[1868..1872, '弥生節句']],
781
+ [ 3, 0] => [[1879..1948, '春季皇霊祭'], [1949..2100, '春分の日']],
782
+ [ 4, 3] => [[1874..1948, '神武天皇祭']],
783
+ [ 4,10] => [[1959..1959, '皇太子明仁親王の結婚の儀']],
784
+ [ 4,29] => [[1927..1948, '天長節'], [1949..1988, '天皇誕生日'], [1989..2006, 'みどりの日'], [2007..2100, '昭和の日']],
785
+ [ 5, 3] => [[1949..2100, '憲法記念日']],
786
+ [ 5, 4] => [[2007..2100, 'みどりの日']],
787
+ [ 5, 5] => [[1868..1872, '端午節句'], [1949..2100, 'こどもの日']],
788
+ [ 6, 9] => [[1993..1993, '皇太子徳仁親王の結婚の儀']],
789
+ [ 7, 7] => [[1868..1872, '七夕節句']],
790
+ [ 7,15] => [[1868..1872, 'お盆']],
791
+ [ 7,20] => [[1996..2002, '海の日']],
792
+ [ 7,-3] => [[2003..2100, '海の日']],
793
+ [ 7,30] => [[1913..1926, '明治天皇祭']],
794
+ [ 8, 1] => [[1868..1872, '田実節句']],
795
+ [ 8,11] => [[2016..2100, '山の日']],
796
+ [ 8,31] => [[1913..1926, '天長節']],
797
+ [ 9, 9] => [[1868..1872, '重陽節句']],
798
+ [ 9,15] => [[1966..2002, '敬老の日']],
799
+ [ 9,-3] => [[2003..2100, '敬老の日']],
800
+ [ 9,17] => [[1874..1878, '神嘗祭']],
801
+ [ 9, 0] => [[1878..1947, '秋季皇霊祭'], [1948..2100, '秋分の日']],
802
+ [10,10] => [[1966..1999, '体育の日']],
803
+ [10,-2] => [[2000..2100, '体育の日']],
804
+ [10,17] => [[1879..1947, '神嘗祭']],
805
+ [10,31] => [[1913..1926, '天長節祝日']],
806
+ [11, 3] => [[1873..1911, '天長節'], [1927..1947, '明治節'], [1948..2100, '文化の日']],
807
+ [11,10] => [[1915..1915, '即位の礼'], [1928..1928, '即位の礼']],
808
+ [11,12] => [[1990..1990, '即位の礼正殿の儀']],
809
+ [11,14] => [[1915..1915, '大嘗祭'], [1928..1928, '大嘗祭']],
810
+ [11,16] => [[1915..1915, '大饗第1日'], [1928..1928, '大饗第1日']],
811
+ [11,23] => [[1873..1947, '新嘗祭'], [1948..2100, '勤労感謝の日']],
812
+ [12,23] => [[1989..2100, '天皇誕生日']],
813
+ [12,25] => [[1927..1947, '大正天皇祭']]
814
+ }
815
+
816
+ # @private
817
+ Long = {3=>0, 9=>180}
818
+
819
+ class << self
820
+
821
+ # 日の暦注 - 祝祭日の計算
822
+ # @private
823
+ def _day_notes(notes, dates, conditions={})
824
+ # 明治維新以降の実暦日のみ扱う
825
+ return notes if dates.o_date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
826
+ year = dates.o_date.most_significant_coordinate
827
+ return notes unless year >= 1868
828
+
829
+ # 春分の日と秋分の日を祝祭日に加える
830
+ long = Long[dates.o_date.cal_date[1]] if year >= 1878
831
+ if long
832
+ date = When.when?(dates.o_date.to_cal_date.to_s,
833
+ {:frame=>dates.o_date.frame,
834
+ :clock=>dates.s_date.frame.time_basis})
835
+ term = dates.cal4note.s_terms.term(date.floor(When::MONTH,
836
+ When::DAY), [long,360]).cal_date[1..2]
837
+ list = NotesList.dup
838
+ list[term] = list[[term[0],0]]
839
+ else
840
+ list = NotesList
841
+ end
842
+
843
+ # 「国民の休日」制定以前
844
+ notes['祝祭日'] ||= _holiday(list, dates.o_date, '振替休日')
845
+ return notes if notes['祝祭日'] || year < 1988
846
+
847
+ # 「国民の休日」制定以後
848
+ duration = When.Duration('P1D')
849
+ [duration, -duration].each do |d|
850
+ return notes unless _holiday(list, dates.o_date + d)
851
+ end
852
+ notes['祝祭日'] = '国民の休日'
853
+ return notes
854
+ end
855
+
856
+ private
857
+
858
+ # 振替休日とハッピーマンデーを考慮した祝祭日
859
+ def _holiday(list, date, alternate=nil)
860
+ y = date.most_significant_coordinate
861
+ m, d = date.cal_date[1..2]
862
+
863
+ # 「振替休日」制定以前
864
+ note = _note(list, y, m, d)
865
+ return note if note || y < 1973
866
+
867
+ # 「振替休日」制定以降
868
+ case date.to_i % 7
869
+ when 0 # 月曜
870
+ # 振替休日
871
+ note = _note(list, y, m, d-1)
872
+ return alternate if note
873
+ # ハッピーマンデー
874
+ note = _note(list, y, m, -((d-1)/7 + 1))
875
+ return note if note
876
+ when 1,2 # 火曜・水曜
877
+ # 振替休日
878
+ return alternate if y >= 2007 && m == 5 && d == 6
879
+ end
880
+ end
881
+
882
+ # 振替休日とハッピーマンデーを考慮しない祝祭日
883
+ def _note(list, year, month, day)
884
+ return nil if day == 0
885
+ year = [year, 2100].min
886
+ note = list[[month,day]]
887
+ return nil unless note
888
+ note.each do |range|
889
+ return range[1] if range[0].include?(year)
890
+ end
891
+ return nil
892
+ end
893
+ end
894
+ end
895
+
896
+ #
897
+ # 太陰太陽暦の暦注
898
+ #
899
+ class JapaneseLuniSolarNote < self
900
+
901
+ # 変換表 月日→27宿
902
+ StarMansions = [ # 正 2 3 4 5 6 7 8 9 10 11 12
903
+ [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
904
+ [ 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
905
+ [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
906
+ [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
907
+ [14, 16, 18, 23, 22, 24, 0, 3, 5, 7, 8, 12] # 4 : 閏月本説(元) (星24) (女09)
908
+ ]
909
+
910
+ # 変換表 27宿→28宿
911
+ StarMansionIndex = (0..7).to_a + (9..27).to_a
912
+
913
+ # 七曜と27宿で決まる暦注
914
+ WeekDepended = {
915
+ # 日 月 火 水 木 金 土
916
+ '甘露' => [26, 17, 5, 22, 21, 3, 23], # 軫27 畢18 尾05 柳23 鬼22 房03 星24
917
+ '金剛峯' => [ 5, 8, 12, 16, 20, 24, 1], # 尾05 女09 壁13 昴17 井21 張25 亢01
918
+ '羅刹' => [15, 21, 25, 19, 2, 13, 22] # 胃16 鬼22 翼26 参20 氐02 奎14 柳23
919
+ }
920
+
921
+ # 人神配当
922
+ HumanBody = %w(足大指 外踝 股内 腰 口 手 内踝 腕 尻 腰背
923
+ 鼻柱 髪際 牙歯 胃管 遍身 胸 気街 股内
924
+ 足小指 足踝及胸、目下 肝及足 手陽明 足陽明 胸 膝 陰 膝晊 足跌)
925
+
926
+ # 月の暦注
927
+ # @private
928
+ def self._month_notes(notes, dates, conditions={})
929
+ # 月名
930
+ notes['月名'] ||= dates.o_date.name('month')
931
+ end
932
+
933
+ # 日の暦注
934
+ # @private
935
+ def self._day_notes(notes, dates, conditions={})
936
+
937
+ # 廿七宿
938
+ m, l = [1,0].map {|f| dates.m_date.cal_date[1] * f}
939
+ d = (StarMansions[l==1 ? (conditions[:i27]||0) :
940
+ (conditions[:n27]||0)][m-1] + dates.m_date.cal_date[2] - 1) % 27
941
+ notes['廿七宿'] ||= StarMansionIndex[d]
942
+
943
+ # 甘露 / 金剛峯 / 羅刹
944
+ w = (dates.m_date.to_i + 1) % 7
945
+ ['甘露', '金剛峯', '羅刹'].each do |c|
946
+ notes[c] = c if d == WeekDepended[c][w]
947
+ end
948
+
949
+ # 三寶吉・神吉・雑事吉・小字注 (凶会日は表引きの時点で抑制済み)
950
+ notes['神吉'] = notes['雑事吉'] = notes['三寶吉'] = notes['小字注'] = nil if notes['没'] || notes['滅']
951
+ notes['神吉'] = notes['雑事吉'] = nil if notes['往亡']
952
+ notes['神吉'] = notes['三寶吉'] = nil if notes['月食']
953
+ notes['小字注'] = nil if notes['日食'] || notes['月食']
954
+ notes['小字注'] = nil if notes['九坎'] && dates.range==5 # 11世紀後半
955
+ notes['三寶吉'] = nil if notes['羅刹']
956
+ notes['三寶吉'] = notes['甘露'] ? '三寶吉' : nil if /\+/ =~ notes['三寶吉'].to_s
957
+ notes['三寶吉'] = '三吉' if notes['三寶吉'] && dates.range >= 8 # 鎌倉以降
958
+
959
+ # 除手足甲 & 道虚・人神配当
960
+ y,m0,d0 = dates.m_date.cal_date
961
+ misoka = m0 != (dates.m_date + When.Duration('P1D')).cal_date[1] if d0 == 29
962
+ notes['除手足甲'] = '除手足甲' if ([6,16,30].include?(d0) || misoka) && !(conditions[:kana] || notes['没'] || notes['滅'] || notes['凶会'])
963
+ notes['道虚'] = '道虚' if d0 % 6 == 0 || misoka
964
+ notes['人神配当'] = HumanBody[d0-1]
965
+
966
+ # 仮名暦
967
+ notes['赤舌' ] ||= d0 == (m * 5 - 3) % 6 + 1 ? '赤舌' : nil
968
+ notes['大赤' ] ||= d0 % 8 == (m * 7 - 3) % 8 ? '大赤' : nil
969
+ notes['不成就'] ||= d0 % 8 == [6,3,2,1,4,5][m % 6] || (misoka && m % 6 == 0) ? '不成就' : nil # 『現代こよみ読み解き事典』 for 不成就日
970
+ notes['六曜' ] ||= When::RokuyoWeek.rokuyo_value(m, d0)
971
+ notes
972
+ end
973
+ end
974
+
975
+ #
976
+ # 月の位相による暦注
977
+ #
978
+ class Japanese::LunarPhases < LunarPhases
979
+
980
+ # 日の暦注
981
+ # @private
982
+ def self._day_notes(notes, dates, conditions={})
983
+ date = When.when?(dates.o_date.to_cal_date.to_s,
984
+ {:frame=>dates.o_date.frame,
985
+ :clock=>dates.l_date.frame.time_basis})
986
+ phase, metsu = dates.cal4note.l_phases.position(date)
987
+
988
+ #
989
+ notes['滅'] = metsu == 2 && dates.range < 11 ? '滅' : nil
990
+
991
+ # 月相
992
+ unless notes['月相']
993
+ # イベントの判定
994
+ formula = dates.cal4note.l_phases.formula
995
+ clock = formula.kind_of?(When::Ephemeris::ChineseTrueLunation) &&
996
+ (5..25).include?(dates.l_date.cal_date[2]) ?
997
+ When.Clock(-21600) : # 唐代暦法の望弦は午前6時を日の境界とする
998
+ dates.l_date.frame._time_basis[-1] # その他(進朔も考慮した時刻)
999
+ odate = When.when?(dates.o_date.to_cal_date.to_s, {:frame=>dates.o_date.frame, :clock=>clock})
1000
+ phases = formula.phase_range(odate)
1001
+ thitis = phases.map {|phase| (phase % 1) * 30.0}
1002
+ note = if thitis[0] >= thitis[1]
1003
+ dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) || conditions[:shoyo] ? '朔' : nil
1004
+ else
1005
+ range = thitis[0]...thitis[1]
1006
+ range.include?( 7.5) ? '上弦' :
1007
+ range.include?(15.0) ? '望' :
1008
+ range.include?(22.5) ? '下弦' : nil
1009
+ end
1010
+
1011
+ # 結果の反映
1012
+ if conditions[:shoyo]
1013
+ # :shoyo が true ならイベント時刻も返す
1014
+ notes['月相'] = if note
1015
+ etime = formula._to_seed_type(formula.cn_to_time((phases[1] * 4).floor / 4.0), odate)
1016
+ if formula.respond_to?(:lunation_length) && formula.lunation_length.kind_of?(Rational)
1017
+ shoyo = etime.clk_time.universal_time
1018
+ shoyo += When::TM::Duration::DAY if (0...clock.universal_time).include?(shoyo)
1019
+ shoyo = (shoyo / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
1020
+ shoyo = shoyo.to_i if shoyo == shoyo.to_i
1021
+ "#{note}(#{shoyo}/#{formula.denominator})"
1022
+ else
1023
+ etime.events = [note]
1024
+ etime
1025
+ end
1026
+ else
1027
+ nil
1028
+ end
1029
+ else
1030
+ # :shoyo が false ならイベン名のみ返す
1031
+ notes['月相'] = note
1032
+ end
1033
+ end
1034
+
1035
+ # 月食
1036
+ unless notes['月食'] && notes['神吉'] && notes['三寶吉'] && notes['小字注']
1037
+ level = (conditions[:lunar_eclipse]||0).to_i
1038
+ if level == -1
1039
+ note = nil
1040
+ else
1041
+ key = dates.m_date.to_s[/\(.+\z/]
1042
+ if key
1043
+ note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
1044
+ elsif dates.o_date.location &&
1045
+ dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
1046
+ info = dates.o_date.location.lunar_eclipse(date..date)
1047
+ note = '月' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
1048
+ end
1049
+ if note
1050
+ note.sub!(/\*.*\z/, '')
1051
+ note = nil unless /月/ =~ note
1052
+ note = nil if level[0] == 1 && /昼/ =~ note
1053
+ note = nil if level[1] == 1 && /^\(/ =~ note
1054
+ end
1055
+ end
1056
+ notes['月食'] = note
1057
+ end
1058
+
1059
+ notes
1060
+ end
1061
+ end
1062
+
1063
+ #
1064
+ # 太陽黄経による暦注
1065
+ #
1066
+ class Japanese::SolarTerms < SolarTerms
1067
+
1068
+ Notes12 = %w(正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月)
1069
+
1070
+ Notes10 = [
1071
+ %w(初伏 初伏),
1072
+ %w(仲伏 中伏),
1073
+ %w(後伏 末伏)]
1074
+
1075
+ Notes60_A = [
1076
+ # +0
1077
+ '侯小過外', # 315 : 正月
1078
+ '侯需外', # 345 : 二月
1079
+ '侯豫外', # 15 : 三月
1080
+ '侯旅外', # 45 : 四月
1081
+ '侯大有外', # 75 : 五月
1082
+ '侯鼎外', # 105 : 六月
1083
+ '侯恆外', # 135 : 七月
1084
+ '侯巽外', # 165 : 八月
1085
+ '侯歸妹外', # 195 : 九月
1086
+ '侯艮外', # 225 : 十月
1087
+ '侯未濟外', # 255 : 十一月
1088
+ '侯屯外' # 285 : 十二月
1089
+ ]
1090
+
1091
+ Notes60_B = [
1092
+ # +3 +9 +15 +21 +27
1093
+ '大夫蒙', '卿益', '公漸', '辟泰', '侯需内', # 315 : 正月
1094
+ '大夫随', '卿晋', '公解', '辟大壯', '侯豫内', # 345 : 二月
1095
+ '大夫訟', '卿蠱', '公革', '辟夬', '侯旅内', # 15 : 三月
1096
+ '大夫師', '卿比', '公小畜', '辟乾', '侯大有内', # 45 : 四月
1097
+ '大夫家人', '卿井', '公咸', '辟姤', '侯鼎内', # 75 : 五月
1098
+ '大夫豊', '卿渙', '公履', '辟遯', '侯恆内', # 105 : 六月
1099
+ '大夫節', '卿同人', '公損', '辟否', '侯巽内', # 135 : 七月
1100
+ '大夫萃', '卿大畜', '公賁', '辟観', '侯歸妹内', # 165 : 八月
1101
+ '大夫無妄', '卿明夷', '公困', '辟剥', '侯艮内', # 195 : 九月
1102
+ '大夫既濟', '卿噬嗑', '公大過', '辟坤', '侯未濟内', # 225 : 十月
1103
+ '大不蹇', '卿頤', '公中孚', '辟復', '侯屯内', # 255 : 十一月
1104
+ '大夫謙', '卿睽', '公升', '辟臨', '侯小過内' # 285 : 十二月
1105
+ ]
1106
+
1107
+ Notes72 = [
1108
+ # 儀鳳暦 宣明暦(中国) 宣明暦 貞享暦 宝暦暦・寛政暦 略本暦
1109
+ # 315 : 正月
1110
+ %w(雞始乳 東風解凍 東風解凍 東風解凍 東風解凍 東風解凍),
1111
+ %w(東風解凍 蟄始振 蟄虫始振 梅花乃芳 黄鶯睍睆 黄鶯睍睆),
1112
+ %w(蟄蟲始振 魚上氷 魚上氷 魚上氷 魚上氷 魚上氷),
1113
+ %w(魚上冰 獺祭魚 獺祭魚 土脈潤起 土脈潤起 土脉潤起),
1114
+ %w(獺祭魚 鴻雁来 鴻雁来 霞彩碧空 霞始靆 霞始靆),
1115
+ %w(鴻雁來 草木萌動 草木萌動 草木萌動 草木萌動 草木萌動),
1116
+
1117
+ # 345 : 二月
1118
+ %w(始雨水 桃始華 桃始華 蟄虫啓戸 蟄虫啓戸 蟄虫啓戸),
1119
+ %w(桃始花 倉庚鳴 倉庚鳴 寒雨間熟 桃始笑 桃始笑),
1120
+ %w(倉庚鳴 鷹化爲鳩 鷹化爲鳩 菜虫化蝶 菜虫化蝶 菜虫化蝶),
1121
+ %w(鷹化爲鳩 玄鳥至 玄鳥至 雀始巣 雀始巣 雀始巣),
1122
+ %w(玄鳥至 雷乃發聲 雷乃發聲 雷乃発声 桜始開 桜始開),
1123
+ %w(雷始發聲 始電 始電 桜始開桃始笑 雷乃発声 雷乃発声),
1124
+
1125
+ # 15 : 三月
1126
+ %w(始雷 桐始華 桐始華 玄鳥至 玄鳥至 玄鳥至),
1127
+ %w(蟄蟲咸動 田鼠化爲鴑 田鼠化爲鴑 鴻雁北 鴻雁北 鴻雁北),
1128
+ %w(蟄蟲啓戸 虹始見 虹始見 虹始見 虹始見 虹始見),
1129
+ %w(桐始華 萍始生 萍始生 葭始生 葭始生 葭始生),
1130
+ %w(田鼠化爲鴑 鳴鳩拂其羽 鳴鳩拂其羽 牡丹華 霜止出苗 霜止出苗),
1131
+ %w(虹始見 戴勝降于桑 戴勝降于桑 霜止出苗 牡丹華 牡丹華),
1132
+
1133
+ # 45 : 四月
1134
+ %w(萍始生 螻蟈鳴 螻蟈鳴 鵑始鳴 鼃始鳴 鼃始鳴),
1135
+ %w(戴勝降于桑 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出),
1136
+ %w(螻蟈鳴 王瓜生 王瓜生 竹笋生 竹笋生 竹笋生),
1137
+ %w(蚯蚓出 苦菜秀 苦菜秀 蚕起食桑 蚕起食桑 蚕起食桑),
1138
+ %w(王瓜生 靡草死 靡草死 紅花栄 紅花栄 紅花栄),
1139
+ %w(苦菜秀 小暑至 小暑至 麦秋至 麦秋至 麦秋至),
1140
+
1141
+ # 75 : 五月
1142
+ %w(靡草死 螳蜋生 螳蜋生 螳螂生 螳螂生 螳螂生),
1143
+ %w(小暑至 鵙始鳴 鵙始鳴 腐草為螢 腐草為螢 腐草為螢),
1144
+ %w(螳螂生 反舌無聲 反舌無聲 梅始黄 梅子黄 梅子黄),
1145
+ %w(鵙始鳴 鹿角解 鹿角解 乃東枯 乃東枯 乃東枯),
1146
+ %w(反舌無聲 蜩始鳴 蜩始鳴 分龍雨 菖蒲華 菖蒲華),
1147
+ %w(鹿角解 半夏生 半夏生 半夏生 半夏生 半夏生),
1148
+
1149
+ # 105 : 六月
1150
+ %w(蟬始鳴 温風至 温風至 温風至 温風至 温風至),
1151
+ %w(半夏生 蟋蟀居壁 蟋蟀居壁 蓮始華 蓮始華 蓮始開),
1152
+ %w(木槿榮 鷹乃學習 鷹乃學習 鷹乃学習 鷹乃学習 鷹乃学習),
1153
+ %w(温風至 腐草爲螢 腐草爲螢 桐始結花 桐始結花 桐始結花),
1154
+ %w(蟋蟀居壁 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑),
1155
+ %w(鷹乃學習 大雨時行 大雨時行 大雨時行 大雨時行 大雨時行),
1156
+
1157
+ # 135 : 七月
1158
+ %w(腐草爲螢 涼風至 涼風至 涼風至 涼風至 涼風至),
1159
+ %w(土潤溽暑 白露降 白露降 山沢浮雲 寒蝉鳴 寒蝉鳴),
1160
+ %w(涼風至 寒蟬鳴 寒蟬鳴 霧色已成 蒙霧升降 蒙霧升降),
1161
+ %w(白露降 鷹乃祭鳥 鷹乃祭鳥 寒蝉鳴 綿柎開 綿柎開),
1162
+ %w(寒蟬鳴 天地始肅 天地始肅 天地始粛 天地始粛 天地始粛),
1163
+ %w(鷹祭鳥 禾乃登 禾乃登 禾乃登 禾乃登 禾乃登),
1164
+
1165
+ # 165 : 八月
1166
+ %w(天地始肅 鴻雁来 鴻雁来 草露白 草露白 草露白),
1167
+ %w(暴風至 玄鳥歸 玄鳥歸 鶺鴒鳴 鶺鴒鳴 鶺鴒鳴),
1168
+ %w(鴻雁來 群鳥養羞 群鳥養羞 玄鳥去 玄鳥去 玄鳥去),
1169
+ %w(玄鳥歸 雷乃收聲 雷乃收聲 鴻雁来 雷乃収声 雷乃収声),
1170
+ %w(羣鳥養羞 蟄蟲坏戸 蟄蟲坏戸 蟄虫坏戸 蟄虫坏戸 蟄虫坏戸),
1171
+ %w(雷始收聲 水始涸 水始涸 水始涸 水始涸 水始涸),
1172
+
1173
+ # 195 : 九月
1174
+ %w(蟄蟲坏戸 鴻雁來賓 鴻雁來賓 棗栗零 鴻雁来 鴻雁来),
1175
+ %w(陰氣方盛 雀入大水爲蛤 雀入大水爲蛤 蟋蟀在戸 菊花開 菊花開),
1176
+ %w(陽氣始衰 菊有黄花 菊有黄花 菊花開 蟋蟀在戸 蟋蟀在戸),
1177
+ %w(水始涸 豺乃祭獸 豺乃祭獸 霜始降 霜始降 霜始降),
1178
+ %w(鴻雁來賓 草木黄落 草木黄落 蔦楓紅葉 霎時施 霎時施),
1179
+ %w(雀入水爲蛤 蟄蟲咸俯 蟄蟲咸俯 鶯雛鳴 楓蔦黄 楓蔦黄),
1180
+
1181
+ # 225 : 十月
1182
+ %w(菊有黄花 水始冰 水始冰 山茶始開 山茶始開 山茶始開),
1183
+ %w(豺祭獣 地始凍 地始凍 地始凍 地始凍 地始凍),
1184
+ %w(水始冰 野雞入大水爲蜃 野雞入大水爲蜃 霎乃降 金盞香 金盞香),
1185
+ %w(地始凍 虹藏不見 虹藏不見 虹蔵不見 虹蔵不見 虹蔵不見),
1186
+ %w(野雞入水爲蜃 天氣上騰地氣下降 天氣上騰地氣下降 樹葉咸落 朔風払葉 朔風払葉),
1187
+ %w(虹藏不見 閉塞而成冬 閉塞而成冬 橘始黄 橘始黄 橘始黄),
1188
+
1189
+ # 255 : 十一月
1190
+ %w(冰益壯 鶡鳥不鳴 鶡鳥不鳴 閉塞成冬 閉塞成冬 閉塞成冬),
1191
+ %w(地始坼 虎始交 虎始交 熊蟄穴 熊蟄穴 熊蟄穴),
1192
+ %w(鶡鳥不鳴 茘挺生 茘挺生 水仙開 鱖魚群 鱖魚群),
1193
+ %w(虎始交 蚯蚓結 蚯蚓結 乃東生 乃東生 乃東生),
1194
+ %w(芒始生 麋角解 麋角解 麋角解 麋角解 麋角解),
1195
+ %w(茘挺生 水泉動 水泉動 雪下出麦 雪下出麦 雪下出麦),
1196
+
1197
+ # 285 : 十二月
1198
+ %w(蚯蚓結 雁北郷 雁北郷 芹乃栄 芹乃栄 芹乃栄),
1199
+ %w(麋角解 鵲始巣 鵲始巣 風気乃行 水泉動 水泉動),
1200
+ %w(水泉動 野雞始鴝 野雞始鴝 雉始雊 雉始雊 雉始雊),
1201
+ %w(雁北郷 雞始乳 雞始乳 款冬華 款冬華 款冬華),
1202
+ %w(鵲始巣 鷙鳥厲疾 鷙鳥厲疾 水沢腹堅 水沢腹堅 水沢腹堅),
1203
+ %w(雉始雊 水澤腹堅 水澤腹堅 鶏始乳 鶏始乳 鶏始乳)
1204
+ ]
1205
+
1206
+ # 計算結果の修正
1207
+ # @private
1208
+ Patch = {
1209
+ 2039054 => [149.0, 1], # 貞観12(0870).07.17 [149.0, 0]
1210
+ 2039055 => [150.0, 0], # 貞観12(0870).07.18 [150.0, 1] 処暑
1211
+
1212
+ 2107233 => [ 29.0, 1], # 天喜05(1057).03.10 [ 29.0, 0]
1213
+ 2107234 => [ 30.0, 0], # 天喜05(1057).03.11 [ 30.0, 1] 穀雨
1214
+
1215
+ 2160437 => [269.0, 0], # 建仁02(1202).10=29 [270.0, 1] 冬至
1216
+ 2160438 => [270.0, 1], # 建仁02(1202).11.01 [271.0, 1]
1217
+ 2160439 => [271.0, 1], # 建仁02(1202).11.02 [272.0, 1]
1218
+ 2160440 => [272.0, 1], # 建仁02(1202).11.03 [272.0, 0]
1219
+
1220
+ 2175412 => [269.0, 1], # 寛元01(1243).11.03 [269.0, 0]
1221
+ 2175413 => [270.0, 0], # 寛元01(1243).11.04 [270.0, 1] 冬至
1222
+
1223
+ 2189200 => [179.0, 0], # 弘安04(1281).07=30 [180.0, 1] 秋分
1224
+ 2189201 => [180.0, 1], # 弘安04(1281).08.01 [181.0, 1]
1225
+ 2189202 => [181.0, 1], # 弘安04(1281).08.02 [181.0, 0]
1226
+
1227
+ 2243577 => [136.0, 0], # 永享02(1430).07.11 [136.0, 1] (立秋の翌日)
1228
+ 2243578 => [136.0, 1], # 永享02(1430).07.12 [137.0, 1]
1229
+ 2243579 => [137.0, 1], # 永享02(1430).07.13 [138.0, 1]
1230
+ 2243580 => [138.0, 1], # 永享02(1430).07.14 [139.0, 1]
1231
+ 2243581 => [139.0, 1], # 永享02(1430).07.15 [140.0, 1]
1232
+ 2243582 => [140.0, 1], # 永享02(1430).07.16 [141.0, 1]
1233
+ 2243583 => [141.0, 1], # 永享02(1430).07.17 [142.0, 1]
1234
+ 2243584 => [142.0, 1], # 永享02(1430).07.18 [143.0, 1]
1235
+ 2243585 => [143.0, 1], # 永享02(1430).07.19 [144.0, 1]
1236
+ 2243586 => [144.0, 1], # 永享02(1430).07.20 [145.0, 1]
1237
+ 2243587 => [145.0, 1], # 永享02(1430).07.21 [146.0, 1]
1238
+ 2243588 => [146.0, 1], # 永享02(1430).07.22 [147.0, 1]
1239
+ 2243589 => [147.0, 1], # 永享02(1430).07.23 [148.0, 1]
1240
+ 2243590 => [148.0, 1], # 永享02(1430).07.24 [149.0, 1]
1241
+ 2243591 => [149.0, 1], # 永享02(1430).07.25 [149.0, 0] 没 (処暑の前日)
1242
+
1243
+ 2311770 => [ 29.0, 1], # 元和03(1617).03.18 [ 29.0, 0] 没
1244
+ 2311771 => [ 30.0, 0], # 元和03(1617).03.19 [ 30.0, 1] 穀雨
1245
+
1246
+ 2396062 => [314.0, 0], # 弘化04(1847).12.30 [315.0, 1] 立春 (計算誤差の補正)
1247
+ 2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0] 没
1248
+
1249
+ 2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0] 没
1250
+ 2397584 => [ 16.0, 0] # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
1251
+ }
1252
+
1253
+ class << self
1254
+ # テスト用の属性
1255
+ attr_writer :patch
1256
+ private :patch=
1257
+
1258
+ # 日の暦注
1259
+ # @private
1260
+ def _day_notes(notes, dates, conditions={})
1261
+ date = When.when?(dates.o_date.to_cal_date.to_s,
1262
+ {:frame=>dates.o_date.frame,
1263
+ :clock=>dates.s_date.frame._time_basis[0]})
1264
+ patch = (@patch || Patch)[date.to_i] unless dates.o_date.frame.respond_to?(:twin) &&
1265
+ dates.o_date.frame.twin
1266
+ longitude, motsu = patch ? patch : dates.cal4note.s_terms.position(date)
1267
+
1268
+ # 三伏 -
1269
+ #
1270
+ # : 夏至から 20..29
1271
+ # 仲 : 夏至から 30..39
1272
+ # 後 : 立秋から 0..9
1273
+ if !notes['三伏'] && notes['干'].remainder == 6 # 庚
1274
+ index = dates.range >= 11 ? 1 : 0
1275
+ if 109 <= longitude && longitude <= 129 # 夏至から
1276
+ term = dates.cal4note.s_terms.term(date, [-270,360])
1277
+ diff = dates.s_date.to_i - term.to_i
1278
+ notes['三伏'] = Notes10[0][index] if 20 <= diff && diff <= 29
1279
+ notes['三伏'] = Notes10[1][index] if 30 <= diff && diff <= 39
1280
+ elsif longitude == 135 # 立秋
1281
+ notes['三伏'] = Notes10[2][index]
1282
+ elsif 136 <= longitude && longitude <= 144 # 立秋から
1283
+ term = dates.cal4note.s_terms.term(date, [-225,360])
1284
+ diff = dates.s_date.to_i - term.to_i
1285
+ notes['三伏'] = Notes10[2][index] if 0 < diff && diff <= 9
1286
+ end
1287
+ end
1288
+
1289
+ # -
1290
+ #
1291
+ # 春秋分から -5..4
1292
+ if !notes[''] && notes[''].remainder == 4 #
1293
+ if (longitude + 5) % 180 < 10 # 春秋分の近傍
1294
+ term = dates.cal4note.s_terms.term(date - When.Duration('P5D'), [0,180])
1295
+ diff = dates.s_date.to_i - term.to_i
1296
+ notes['社'] = '社' if -5 <= diff && diff <= 4
1297
+ end
1298
+ end
1299
+
1300
+ # -
1301
+ #
1302
+ # 大寒から -6..5
1303
+ if !notes['臘'] && notes['支'].remainder == 4 # 辰
1304
+ if (longitude - 339) % 360 < 12 # 大寒の近傍
1305
+ term = dates.cal4note.s_terms.term(date - When.Duration('P6D'), [345,360])
1306
+ diff = dates.s_date.to_i - term.to_i
1307
+ notes['臘'] = '' if -6 <= diff && diff <= 5
1308
+ end
1309
+ end
1310
+
1311
+ # 土用事
1312
+ unless notes['土用事']
1313
+ _longitude, _motsu = dates.cal4note.s_terms2.instance_of?(self) && dates.cal4note.doyo == 0 ? [longitude, motsu] :
1314
+ dates.cal4note.s_terms2.position(date, -dates.cal4note.doyo)
1315
+ if _motsu != 0 && _longitude % 90 == 27
1316
+ notes['土用事'] =
1317
+ begin
1318
+ event_name =
1319
+ case dates.range
1320
+ when 0 ; '土用' # 元嘉暦以前
1321
+ when 1 ; '土王' # 麟徳暦
1322
+ when 2..10 ; '土用事' # 大衍暦~宣明暦
1323
+ else ; '土用入' # 貞享暦以降
1324
+ end
1325
+ if conditions[:shoyo]
1326
+ dates.cal4note.s_terms2.event_time(date, event_name, [27-dates.cal4note.doyo, 90])
1327
+ else
1328
+ event_name
1329
+ end
1330
+ end
1331
+ end
1332
+ end
1333
+
1334
+ # 入梅 - 壬
1335
+ #
1336
+ # 貞享2(1685)~ 芒種から 1..10 日の壬の日
1337
+ # 元文5(1740)~ 芒種から 0..9 日の壬の日
1338
+ # 明治9(1876)~ 太陽黄経80度
1339
+ unless notes['入梅']
1340
+ if dates.year >= 1876
1341
+ notes['入梅'] = '入梅' if longitude == 80 && motsu == 1
1342
+ elsif notes['干'].remainder == 8 #
1343
+ if (longitude - 75) % 360 <= 10 # 芒種の近傍
1344
+ term = dates.cal4note.s_terms.term(date - When.Duration('P11D'), [75,360])
1345
+ diff = dates.s_date.to_i - term.to_i
1346
+ diff += 1 if dates.year >= 1740
1347
+ notes['入梅'] = '入梅' if dates.range >= 11 && 1 <= diff && diff <= 10
1348
+ end
1349
+ end
1350
+ end
1351
+
1352
+ # 半夏生
1353
+ #
1354
+ # 太陽黄経100度
1355
+ notes['半夏生'] ||= '半夏生' if longitude == 100 && motsu == 1
1356
+
1357
+ # 立春を起算日とする雑節
1358
+ #
1359
+ unless notes['節分'] && notes['八十八夜'] && notes['二百十日'] && notes['二百廿日']
1360
+ term = dates.cal4note.s_terms.term(date + When.Duration('P3D'), [-45,360])
1361
+ case dates.s_date.to_i - term.to_i
1362
+ when -1 ; notes['節分'] ||= '節分'
1363
+ when 87 ; notes['八十八夜'] ||= '八十八夜'
1364
+ when 209 ; notes['二百十日'] ||= '二百十日'
1365
+ when 219 ; notes['二百廿日'] ||= '二百廿日'
1366
+ end
1367
+ end
1368
+
1369
+ # 日食
1370
+ unless notes['日食'] && notes['小字注']
1371
+ level = (conditions[:solar_eclipse]||0).to_i
1372
+ if level == -1
1373
+ note = nil
1374
+ else
1375
+ key = dates.m_date.to_s[/\(.+\z/]
1376
+ if key
1377
+ note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
1378
+ elsif dates.o_date.location &&
1379
+ dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
1380
+ info = dates.o_date.location.solar_eclipse(date..date)
1381
+ note = '日' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
1382
+ end
1383
+ if note
1384
+ note.sub!(/\*.*\z/, '')
1385
+ note = nil unless /日/ =~ note
1386
+ note = nil if level[0] == 1 && /夜/ =~ note
1387
+ note = nil if level[1] == 1 && /^\(/ =~ note
1388
+ end
1389
+ end
1390
+ notes['日食'] = note
1391
+ end
1392
+
1393
+ # 没
1394
+ if motsu == 0
1395
+ notes['没'] = dates.range < 11 ? '没' : nil
1396
+ return notes unless patch
1397
+ else
1398
+ notes['没'] = nil
1399
+ end
1400
+
1401
+ # 廿四節気
1402
+ div, mod = longitude.divmod(15)
1403
+ if mod == 0
1404
+ note = (div - 21) % 24
1405
+ div, mod = note.divmod(2)
1406
+ notes['節中'] ||= Notes12[div] + %w(節 中)[mod]
1407
+ notes['廿四節気'] ||=
1408
+ begin
1409
+ residue = When.Resource(dates.range == 1 ? '_co:Common?V=0618' : '_co:Common')['二十四節気::*'][(note-3) % 24]
1410
+ if conditions[:shoyo]
1411
+ dates.cal4note.s_terms.event_time(date, residue.label, [0,15])
1412
+ else
1413
+ residue
1414
+ end
1415
+ end
1416
+ end
1417
+
1418
+ # 七十二候
1419
+ div, mod = longitude.divmod(5)
1420
+ notes['七十二候'] ||= mod == 0 ? Notes72[(div - 63) % 72][dates.index_s] : nil
1421
+
1422
+ # 往亡
1423
+ unless notes['往亡'] && notes['神吉'] && notes['雑事吉']
1424
+ month = dates.s_date.cal_date[-2] - 1
1425
+ day = dates.s_date.cal_date[-1] - 1
1426
+ div, mod = month.divmod(3)
1427
+ deg = (div+7)*(mod+1) + month * 30 + 314
1428
+ notes['往亡'] = (dates.range < 11 ? (deg - longitude) % 360 == 0 : # 没を含まない
1429
+ (deg - 315 ) % 30 == day)? '往亡' : nil # 没を含む
1430
+ end
1431
+
1432
+ # 伏龍
1433
+ notes['伏龍'] ||= {
1434
+ 315 => '庭内去堂', 15 => '門内百日', 115 => '東垣六十日',
1435
+ 175 => '四隅百日', 275 => '竈内四十日'
1436
+ }[longitude]
1437
+
1438
+ # 六十卦
1439
+ div, mod = longitude.divmod(30)
1440
+ notes['六十卦'] ||= mod == 15 ? Notes60_A[(div - 10) % 12] : nil
1441
+ div, mod = longitude.divmod(6)
1442
+ notes['六十卦'] ||= mod == 0 ? Notes60_B[(div - 53) % 60] : nil
1443
+
1444
+ # 彼岸
1445
+ unless notes['彼岸']
1446
+ if dates.range < 11
1447
+ notes['彼岸'] = '彼岸' if longitude % 180 == 2 # 宣明暦以前(没を除いて3日後)
1448
+ else
1449
+ term = dates.cal4note.s_terms.term(date - When.Duration('P7D'), [0,180]) # 近傍の春秋分
1450
+ case dates.s_date.to_i - term.to_i
1451
+ when 2 ; notes['彼岸'] = '彼岸' if dates.range == 11 # 貞享暦(没を含めて3日後)
1452
+ when -5 ; notes['彼岸'] = '彼岸' if longitude > 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(春-6日前))
1453
+ when -1 ; notes['彼岸'] = '彼岸' if longitude <= 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(秋-2日前)
1454
+ when -3 ; notes['彼岸'] = '彼岸' if dates.year >= 1844 # 天保暦以降(秋-4日前)
1455
+ end
1456
+ end
1457
+ notes['彼岸'] = nil unless notes['彼岸'] == '彼岸'
1458
+ end
1459
+
1460
+ notes
1461
+ end
1462
+ end
1463
+ end
1464
+
1465
+ #
1466
+ # 太陽黄経による暦注
1467
+ #
1468
+ class Japanese::SolarTermsRevised < Japanese::SolarTerms
1469
+
1470
+ # 土用策
1471
+ DoyoShift = When::TM::PeriodDuration.new([0,0,12.1747411317])
1472
+
1473
+ # 日付に対応する座標
1474
+ #
1475
+ # @param [When::TM::TemporalPosition] date 日付
1476
+ # @param [Numeric] delta 周期の補正(土用の時刻の補正に使用,デフォルト 0)
1477
+ #
1478
+ # @return [Array<Integer>] Array< Integer, 0 or 1 or 2 >
1479
+ #
1480
+ # [Integer] 対応する座標
1481
+ #
1482
+ # [0 or 1 or 2] 座標の進み(0 なら 没, 2 なら滅)
1483
+ #
1484
+ def position(date, delta=0)
1485
+ return super if date.most_significant_coordinate >= 1869
1486
+ date = date.floor
1487
+ p0, p1 = [date, date.succ].map {|d| (30.0 * @formula.time_to_cn(d-DoyoShift) - @margin + 12).floor}
1488
+ [p1 % @den, p1 - p0]
1489
+ end
1490
+
1491
+ #
1492
+ # イベント日付(時刻付)
1493
+ #
1494
+ # @private
1495
+ def event_time(date, event_name, event)
1496
+ return super if date.most_significant_coordinate >= 1869
1497
+ etime = term(date + When.Duration('P3D'), [-15,30], When::SYSTEM) + DoyoShift
1498
+ if formula.respond_to?(:year_length) && formula.denominator && formula.denominator < 100000
1499
+ fraction = etime.clk_time.local_time
1500
+ fraction += When::TM::Duration::DAY * (etime.to_i - date.to_i)
1501
+ fraction = (fraction / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
1502
+ fraction = fraction.to_i if fraction == fraction.to_i
1503
+ event_name + "(#{fraction}/#{formula.denominator})"
1504
+ else
1505
+ etime.events = [event_name]
1506
+ etime
1507
+ end
1508
+ end
1509
+ end
1510
+ end