when_exe 0.3.6 → 0.3.7

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