when_exe 0.3.8 → 0.3.9

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