when_exe 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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