when_exe 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
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