zakuro 0.5.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +3 -0
- data/README.md +22 -7
- data/VERSION +1 -0
- data/doc/operation/transfer.rb +8 -8
- data/lib/zakuro/calculation/base/gengou.rb +128 -0
- data/lib/zakuro/calculation/base/linear_gengou.rb +76 -0
- data/lib/zakuro/calculation/base/operated_year.rb +5 -15
- data/lib/zakuro/calculation/base/year.rb +26 -14
- data/lib/zakuro/calculation/era/gengou/abstract_scroll.rb +209 -0
- data/lib/zakuro/calculation/era/gengou/dated_scroll.rb +30 -0
- data/lib/zakuro/calculation/era/gengou/internal/connector.rb +107 -0
- data/lib/zakuro/calculation/era/gengou/internal/counter.rb +214 -0
- data/lib/zakuro/calculation/era/gengou/internal/publisher.rb +104 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_list.rb +230 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/abstract_range.rb +193 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_list.rb +48 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/dated_range.rb +30 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/empty_link.rb +158 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/named_list.rb +125 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve/named_range.rb +75 -0
- data/lib/zakuro/calculation/era/gengou/internal/reserve.rb +41 -0
- data/lib/zakuro/calculation/era/gengou/named_scroll.rb +30 -0
- data/lib/zakuro/calculation/era/version/internal/crawler.rb +51 -0
- data/lib/zakuro/calculation/era/version/internal/range.rb +39 -0
- data/lib/zakuro/calculation/era/version/version.rb +24 -0
- data/lib/zakuro/calculation/monthly/first_day.rb +3 -2
- data/lib/zakuro/calculation/monthly/month.rb +88 -2
- data/lib/zakuro/calculation/monthly/operated_month.rb +3 -3
- data/lib/zakuro/calculation/range/abstract_full_range.rb +172 -0
- data/lib/zakuro/calculation/range/{operated_range.rb → abstract_operation_range.rb} +17 -15
- data/lib/zakuro/calculation/range/dated_full_range.rb +32 -0
- data/lib/zakuro/calculation/range/dated_operation_range.rb +33 -0
- data/lib/zakuro/calculation/range/named_full_range.rb +38 -0
- data/lib/zakuro/calculation/range/named_operation_range.rb +36 -0
- data/lib/zakuro/calculation/range/operated_solar_terms.rb +36 -19
- data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +54 -0
- data/lib/zakuro/calculation/range/transfer/year_boundary.rb +25 -21
- data/lib/zakuro/calculation/summary/internal/month.rb +84 -0
- data/lib/zakuro/calculation/summary/{single.rb → internal/operation.rb} +6 -37
- data/lib/zakuro/calculation/summary/japan/range.rb +152 -0
- data/lib/zakuro/calculation/summary/japan/single.rb +118 -0
- data/lib/zakuro/calculation/summary/japan/specifier/single_day.rb +91 -0
- data/lib/zakuro/calculation/summary/western/range.rb +124 -0
- data/lib/zakuro/calculation/summary/western/single.rb +113 -0
- data/lib/zakuro/calculation/summary/western/specifier/multiple_day.rb +169 -0
- data/lib/zakuro/calculation/summary/western/specifier/single_day.rb +93 -0
- data/lib/zakuro/condition.rb +15 -2
- data/lib/zakuro/era/japan/calendar.rb +133 -0
- data/lib/zakuro/era/japan/gengou/alignment/aligner.rb +121 -0
- data/lib/zakuro/era/japan/gengou/alignment/division.rb +168 -0
- data/lib/zakuro/era/japan/gengou/alignment/line.rb +175 -0
- data/lib/zakuro/era/japan/gengou/alignment/linear_gengou.rb +187 -0
- data/lib/zakuro/era/japan/gengou/alignment.rb +55 -0
- data/lib/zakuro/era/japan/gengou/resource/parser.rb +243 -0
- data/lib/zakuro/era/japan/gengou/resource/type.rb +293 -0
- data/lib/zakuro/era/japan/gengou/resource/validator.rb +347 -0
- data/lib/zakuro/era/japan/gengou/resource/yaml/set-001-until-south.yaml +1870 -0
- data/lib/zakuro/era/japan/gengou/resource/yaml/set-002-from-north.yaml +810 -0
- data/lib/zakuro/era/japan/gengou/resource/yaml/set-003-modern.yaml +50 -0
- data/lib/zakuro/era/japan/gengou/resource.rb +33 -0
- data/lib/zakuro/era/japan/gengou.rb +26 -80
- data/lib/zakuro/era/japan/version.rb +151 -0
- data/lib/zakuro/era/{western.rb → western/calendar.rb} +9 -9
- data/lib/zakuro/exception/case/pattern.rb +35 -0
- data/lib/zakuro/exception/case/preset.rb +51 -0
- data/lib/zakuro/exception/case/template.rb +48 -0
- data/lib/zakuro/exception/cause.rb +28 -0
- data/lib/zakuro/exception/exception.rb +37 -0
- data/lib/zakuro/exception/zakuro_error.rb +28 -0
- data/lib/zakuro/gateway/locale/date.rb +127 -0
- data/lib/zakuro/gateway/locale/range.rb +67 -0
- data/lib/zakuro/gateway/range.rb +99 -0
- data/lib/zakuro/gateway/single.rb +70 -0
- data/lib/zakuro/merchant.rb +15 -4
- data/lib/zakuro/operation/month/parser.rb +10 -10
- data/lib/zakuro/operation/month/type.rb +32 -32
- data/lib/zakuro/operation/month/validator.rb +51 -51
- data/lib/zakuro/operation/yaml/month.yaml +3736 -3736
- data/lib/zakuro/output/logger.rb +17 -3
- data/lib/zakuro/output/response.rb +5 -5
- data/lib/zakuro/result/data/day.rb +43 -0
- data/lib/zakuro/result/data/gengou.rb +35 -0
- data/lib/zakuro/result/data/month.rb +63 -0
- data/lib/zakuro/result/data/single_day.rb +48 -0
- data/lib/zakuro/result/data/solar_term.rb +35 -0
- data/lib/zakuro/result/data/year.rb +45 -0
- data/lib/zakuro/result/operation/month/annotation.rb +40 -0
- data/lib/zakuro/result/operation/month/bundle.rb +36 -0
- data/lib/zakuro/result/operation/month/history.rb +54 -0
- data/lib/zakuro/result/operation/operation.rb +44 -0
- data/lib/zakuro/result/result.rb +21 -2
- data/lib/zakuro/tools/typeconv.rb +38 -0
- data/lib/zakuro/tools/typeof.rb +4 -1
- data/lib/zakuro/version/context.rb +24 -3
- data/lib/zakuro/version/daien/daien.rb +1 -26
- data/lib/zakuro/version/genka/genka.rb +1 -26
- data/lib/zakuro/version/gihou/gihou.rb +1 -30
- data/lib/zakuro/version/gregorio/gregorio.rb +1 -9
- data/lib/zakuro/version/houryaku/houryaku.rb +1 -9
- data/lib/zakuro/version/joukyou/joukyou.rb +1 -9
- data/lib/zakuro/version/kansei/kansei.rb +1 -9
- data/lib/zakuro/version/senmyou/README.md +11 -7
- data/lib/zakuro/version/senmyou/senmyou.rb +1 -30
- data/lib/zakuro/version/tenpou/tenpou.rb +1 -9
- data/zakuro.gemspec +1 -3
- metadata +74 -22
- data/lib/zakuro/calculation/base/multi_gengou.rb +0 -101
- data/lib/zakuro/calculation/base/multi_gengou_roller.rb +0 -218
- data/lib/zakuro/calculation/range/full_range.rb +0 -210
- data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +0 -82
- data/lib/zakuro/calculation/specifier/single_day.rb +0 -109
- data/lib/zakuro/era/japan/gengou/parser.rb +0 -167
- data/lib/zakuro/era/japan/gengou/type.rb +0 -178
- data/lib/zakuro/era/japan/gengou/validator.rb +0 -236
- data/lib/zakuro/era/japan/reki.rb +0 -91
- data/lib/zakuro/era/japan/yaml/set-001-until-south.yaml +0 -1121
- data/lib/zakuro/era/japan/yaml/set-002-from-north.yaml +0 -485
- data/lib/zakuro/era/japan/yaml/set-003-modern.yaml +0 -28
- data/lib/zakuro/result/data.rb +0 -187
- data/lib/zakuro/result/operation.rb +0 -114
- data/lib/zakuro/version/abstract_version.rb +0 -29
- data/lib/zakuro/version.rb +0 -7
- data/lib/zakuro/version_factory.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 294b07e6f6f82cad6ed7d5332d96a0c147ee1cbcbb842faa745918f1d8fbac2e
|
4
|
+
data.tar.gz: 41341f57aab606cea9a86c75aa4dbef8a8d247421d7428ddf5f1e442afc1b8db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9f3aee8d972a13e41ae98cb6b600f2032e833380a845513b2a738bf045e7d36a719a2e31161fd90f23194bdee4e0a690dc931934ad30ab0940742f20ea0f7bc7
|
7
|
+
data.tar.gz: 8c8ea9c23b11c28910cbfcdad25dec4720f919a1bbb0551737f8cf82cc62cd59621dcdd4770580d81c7a4a1c8d8859765e3ae7cd39592369a25dd89e1da9932d
|
data/Makefile
CHANGED
data/README.md
CHANGED
@@ -30,7 +30,9 @@ Or install it yourself as:
|
|
30
30
|
|
31
31
|
開発途中です。
|
32
32
|
|
33
|
-
|
33
|
+
1日検索/期間検索に対応しております。
|
34
|
+
|
35
|
+
下記表で対応済の暦は使用可能です。
|
34
36
|
|
35
37
|
|開始日|暦 |計算方法|対応|
|
36
38
|
|:----|:----|:----|:----|
|
@@ -71,6 +73,11 @@ western_date = Date.new(1685, 2, 3)
|
|
71
73
|
merchant.offer(condition: { date: western_date })
|
72
74
|
puts merchant.commit.to_json
|
73
75
|
# => {"data":{"year":{"first_gengou":{"name":"貞享","number":1},"second_gengou":{"name":"","number":-1},"zodiac_name":"甲子","total_days":354},"month":{"number":12,"leaped":false,"days_name":"大","first_day":{"number":1,"zodiac_name":"壬辰","remainder":"28-4182","western_date":"1685-01-05"},"odd_solar_terms":[{"index":1,"remainder":"30-890"}],"even_solar_terms":[{"index":2,"remainder":"45-2726"}]},"day":{"number":30,"zodiac_name":"辛酉","remainder":"57-4182","western_date":"1685-02-03"}},"operation":{"operated":false,"month":{"current":{"id":"","western_date":"","page":-1,"number":-1,"annotations":[]},"parent":{"id":"","western_date":"","page":-1,"number":-1,"annotations":[]}},"original":{"year":{"first_gengou":{"name":"貞享","number":1},"second_gengou":{"name":"","number":-1},"zodiac_name":"甲子","total_days":354},"month":{"number":12,"leaped":false,"days_name":"大","first_day":{"number":1,"zodiac_name":"壬辰","remainder":"28-4182","western_date":"1685-01-05"},"odd_solar_terms":[{"index":1,"remainder":"30-890"}],"even_solar_terms":[{"index":2,"remainder":"45-2726"}]},"day":{"number":30,"zodiac_name":"辛酉","remainder":"57-4182","western_date":"1685-02-03"}}}}
|
76
|
+
|
77
|
+
# 期間検索
|
78
|
+
merchant = Zakuro::Merchant.new(condition: { range: {start: Date.new(862, 2, 3), last: Date.new(862, 2, 4)}})
|
79
|
+
puts merchant.commit.to_json
|
80
|
+
{"list":[{"data":{"year":{"first_gengou":{"name":"貞観","number":4},"second_gengou":{"name":"","number":-1},"zodiac_name":"壬午","total_days":354},"month":{"number":1,"leaped":false,"days_name":"大","first_day":{"number":1,"zodiac_name":"庚午","remainder":"6-1282","western_date":"0862-02-03"},"odd_solar_terms":[{"index":5,"remainder":"34-5368"}],"even_solar_terms":[{"index":4,"remainder":"19-3532"}]},"day":{"number":1,"zodiac_name":"庚午","remainder":"6-1282","western_date":"0862-02-03"}},"operation":{"operated":false,"month":{"current":{"id":"","western_date":"","page":-1,"number":-1,"annotations":[]},"parent":{"id":"","western_date":"","page":-1,"number":-1,"annotations":[]}},"original":{"year":{"first_gengou":{"name":"貞観","number":4},"second_gengou":{"name":"","number":-1},"zodiac_name":"壬午","total_days":354},"month":{"number":1,"leaped":false,"days_name":"大","first_day":{"number":1,"zodiac_name":"庚午","remainder":"6-1282","western_date":"0862-02-03"},"odd_solar_terms":[{"index":5,"remainder":"34-5368"}],"even_solar_terms":[{"index":4,"remainder":"19-3532"}]},"day":{"number":1,"zodiac_name":"庚午","remainder":"6-1282","western_date":"0862-02-03"}}}},{"data":{"year":{"first_gengou":{"name":"貞観","number":4},"second_gengou":{"name":"","number":-1},"zodiac_name":"壬午","total_days":354},"month":{"number":1,"leaped":false,"days_name":"大","first_day":{"number":1,"zodiac_name":"庚午","remainder":"6-1282","western_date":"0862-02-03"},"odd_solar_terms":[{"index":5,"remainder":"34-5368"}],"even_solar_terms":[{"index":4,"remainder":"19-3532"}]},"day":{"number":2,"zodiac_name":"辛未","remainder":"7-1282","western_date":"0862-02-04"}},"operation":{"operated":false,"month":{"current":{"id":"","western_date":"","page":-1,"number":-1,"annotations":[]},"parent":{"id":"","western_date":"","page":-1,"number":-1,"annotations":[]}},"original":{"year":{"first_gengou":{"name":"貞観","number":4},"second_gengou":{"name":"","number":-1},"zodiac_name":"壬午","total_days":354},"month":{"number":1,"leaped":false,"days_name":"大","first_day":{"number":1,"zodiac_name":"庚午","remainder":"6-1282","western_date":"0862-02-03"},"odd_solar_terms":[{"index":5,"remainder":"34-5368"}],"even_solar_terms":[{"index":4,"remainder":"19-3532"}]},"day":{"number":2,"zodiac_name":"辛未","remainder":"7-1282","western_date":"0862-02-04"}}}}]}
|
74
81
|
```
|
75
82
|
|
76
83
|
# 条件
|
@@ -80,13 +87,15 @@ puts merchant.commit.to_json
|
|
80
87
|
| 項目名 | キー名 | hash内キー名 | データ型 | 備考 |
|
81
88
|
|----------------|---------|--------------|----------|--------------------|
|
82
89
|
| 基準日 | date | | Date | 西暦日 |
|
83
|
-
| | | | String |
|
84
|
-
| 範囲(開始日)
|
85
|
-
|
|
90
|
+
| | | | String | 和暦日/西暦日 |
|
91
|
+
| 範囲(開始日) | range | start | Date | 西暦日 |
|
92
|
+
| | | | String | 和暦日/西暦日 |
|
93
|
+
| 範囲(終了日) | | last | Date | 西暦日 |
|
94
|
+
| | | | String | 和暦日/西暦日 |
|
86
95
|
| 列 | columns | | Array | 取得したい列の列名 |
|
87
96
|
| オプション | options | | Array | 取得オプション |
|
88
97
|
|
89
|
-
現時点では `date`
|
98
|
+
現時点では `date` と `range` のみ対応中です。
|
90
99
|
|
91
100
|
## オプション
|
92
101
|
|
@@ -119,6 +128,12 @@ puts merchant.commit.to_json
|
|
119
128
|
| 日付情報 | data | | | Zakuro::Result::Data::SingleDay | - | 運用値(計算値は運用情報内を参照のこと)|
|
120
129
|
| 運用情報 | operation | | | Zakuro::Result::Operation::Bundle | - | - |
|
121
130
|
|
131
|
+
### Zakuro::Result::Range
|
132
|
+
|
133
|
+
| 項目名 | キー名 | - | - | データ型 | 参考値 | 備考 |
|
134
|
+
|----------|-----------|---|---|---------------------------------------|--------|---------------------------------------|
|
135
|
+
| 日リスト | list | | | Array\<Zakuro::Result::Data::Single\> | - | 範囲内の日付情報すべて |
|
136
|
+
|
122
137
|
### Zakuro::Result::SingleDay
|
123
138
|
|
124
139
|
| 項目名 | キー名 | - | - | データ型 | 参考値 | 備考 |
|
@@ -176,8 +191,8 @@ puts merchant.commit.to_json
|
|
176
191
|
| 月初日の西暦日 | | western_date | | String | 0937-02-13 | 計算値 |
|
177
192
|
| 原文頁数 | | page | | Integer | 178 | |
|
178
193
|
| 原文注釈番号 | | number | | Integer | 1 | |
|
179
|
-
| 注釈 | | annotations | | Array
|
180
|
-
| 注釈内容 | | | description | String | 計算は51乙卯であるが,
|
194
|
+
| 注釈 | | annotations | | Array\<Zakuro::Result::Operation::MonthAnnotation\> | | |
|
195
|
+
| 注釈内容 | | | description | String | 計算は51乙卯であるが, 日本紀略に甲寅朔とある。<br>正月甲寅朔のユリウス暦日は2月13日となる。(元旦日食 をさけるための変更か) | |
|
181
196
|
| 注釈補記 | | | note | String | - | 原文訂正 |
|
182
197
|
|
183
198
|
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.7.0
|
data/doc/operation/transfer.rb
CHANGED
@@ -39,25 +39,25 @@ table.each do |row|
|
|
39
39
|
'diffs' => {
|
40
40
|
'month' => {
|
41
41
|
'number' => {
|
42
|
-
'
|
43
|
-
'
|
42
|
+
'src' => month_str_to_number(row['月(計)']),
|
43
|
+
'dest' => month_str_to_number(row['月(実)'])
|
44
44
|
},
|
45
45
|
'leaped' => {
|
46
|
-
'
|
47
|
-
'
|
46
|
+
'src' => month_str_to_leaped(row['月(計)']),
|
47
|
+
'dest' => month_str_to_leaped(row['月(実)'])
|
48
48
|
},
|
49
49
|
'days' => {
|
50
|
-
'
|
51
|
-
'
|
50
|
+
'src' => row['月大小(計)'],
|
51
|
+
'dest' => row['月大小(実)']
|
52
52
|
}
|
53
53
|
},
|
54
54
|
'solar_term' => {
|
55
|
-
'
|
55
|
+
'src' => {
|
56
56
|
'index' => row['中気番号(計)'],
|
57
57
|
'to' => row['中気移動先'],
|
58
58
|
'zodiac_name' => row['中気(計)']
|
59
59
|
},
|
60
|
-
'
|
60
|
+
'dest' => {
|
61
61
|
'index' => row['中気番号(実)'],
|
62
62
|
'from' => row['中気移動元'],
|
63
63
|
'zodiac_name' => row['中気(実)']
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../era/western/calendar'
|
4
|
+
|
5
|
+
# :nodoc:
|
6
|
+
module Zakuro
|
7
|
+
# :nodoc:
|
8
|
+
module Calculation
|
9
|
+
# :nodoc:
|
10
|
+
module Base
|
11
|
+
#
|
12
|
+
# Gengou 元号
|
13
|
+
#
|
14
|
+
class Gengou
|
15
|
+
# @return [Western::Calendar] 開始日
|
16
|
+
attr_reader :start_date
|
17
|
+
# @return [Western::Calendar] 終了日
|
18
|
+
attr_reader :last_date
|
19
|
+
# @return [Array<LinearGengou>] 1行目元号
|
20
|
+
attr_reader :first_line
|
21
|
+
# @return [Array<LinearGengou>] 2行目元号
|
22
|
+
attr_reader :second_line
|
23
|
+
|
24
|
+
#
|
25
|
+
# 初期化
|
26
|
+
#
|
27
|
+
# @param [Western::Calendar] start_date 開始日
|
28
|
+
# @param [Western::Calendar] last_date 終了日
|
29
|
+
# @param [Array<LinearGengou>] first_line 1行目元号
|
30
|
+
# @param [Array<LinearGengou>] second_line 2行目元号
|
31
|
+
#
|
32
|
+
def initialize(start_date: Western::Calendar.new, last_date: Western::Calendar.new,
|
33
|
+
first_line: [], second_line: [])
|
34
|
+
@start_date = start_date
|
35
|
+
@last_date = last_date
|
36
|
+
@first_line = first_line
|
37
|
+
@second_line = second_line
|
38
|
+
end
|
39
|
+
|
40
|
+
#
|
41
|
+
# 1行目元号を取得する
|
42
|
+
#
|
43
|
+
# @param [Western::Calendar] date 西暦日
|
44
|
+
#
|
45
|
+
# @return [LinearGengou] 1行目元号
|
46
|
+
#
|
47
|
+
def match_first_line(date: Western::Calendar)
|
48
|
+
@first_line.each do |line|
|
49
|
+
return line.clone if line.include?(date: date)
|
50
|
+
end
|
51
|
+
|
52
|
+
LinearGengou.new
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# 2行目元号を取得する
|
57
|
+
#
|
58
|
+
# @param [Western::Calendar] date 西暦日
|
59
|
+
#
|
60
|
+
# @return [LinearGengou] 2行目元号
|
61
|
+
#
|
62
|
+
def match_second_line(date: Western::Calendar)
|
63
|
+
@second_line.each do |line|
|
64
|
+
return line.clone if line.include?(date: date)
|
65
|
+
end
|
66
|
+
|
67
|
+
LinearGengou.new
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
# 元号を取得する
|
72
|
+
#
|
73
|
+
# @param [String] name 元号名
|
74
|
+
#
|
75
|
+
# @return [LinearGengou] 元号
|
76
|
+
#
|
77
|
+
def match_by_name(name:)
|
78
|
+
result = match_first_line_by_name(name: name)
|
79
|
+
return result unless result.invalid?
|
80
|
+
|
81
|
+
result = match_second_line_by_name(name: name)
|
82
|
+
|
83
|
+
result
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# 1行目元号を取得する
|
88
|
+
#
|
89
|
+
# @param [String] name 元号名
|
90
|
+
#
|
91
|
+
# @return [LinearGengou] 1行目元号
|
92
|
+
#
|
93
|
+
def match_first_line_by_name(name:)
|
94
|
+
@first_line.each do |line|
|
95
|
+
return line.clone if line.name == name
|
96
|
+
end
|
97
|
+
|
98
|
+
LinearGengou.new
|
99
|
+
end
|
100
|
+
|
101
|
+
#
|
102
|
+
# 2行目元号を取得する
|
103
|
+
#
|
104
|
+
# @param [String] name 元号名
|
105
|
+
#
|
106
|
+
# @return [LinearGengou] 2行目元号
|
107
|
+
#
|
108
|
+
def match_second_line_by_name(name:)
|
109
|
+
@second_line.each do |line|
|
110
|
+
return line.clone if line.name == name
|
111
|
+
end
|
112
|
+
|
113
|
+
LinearGengou.new
|
114
|
+
end
|
115
|
+
|
116
|
+
#
|
117
|
+
# 不正か
|
118
|
+
#
|
119
|
+
# @return [True] 不正
|
120
|
+
# @return [False] 不正なし
|
121
|
+
#
|
122
|
+
def invalid?
|
123
|
+
@first_line.size.zero? && @second_line.size.zero?
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../era/western/calendar'
|
4
|
+
|
5
|
+
# :nodoc:
|
6
|
+
module Zakuro
|
7
|
+
# :nodoc:
|
8
|
+
module Calculation
|
9
|
+
# :nodoc:
|
10
|
+
module Base
|
11
|
+
#
|
12
|
+
# LinearGengou 直列元号
|
13
|
+
#
|
14
|
+
class LinearGengou
|
15
|
+
INVALID_YEAR = -1
|
16
|
+
|
17
|
+
# @return [Western::Calendar] 開始日
|
18
|
+
attr_reader :start_date
|
19
|
+
# @return [Western::Calendar] 終了日
|
20
|
+
attr_reader :last_date
|
21
|
+
# @return [String] 元号名
|
22
|
+
attr_reader :name
|
23
|
+
# @return [Integer] 年
|
24
|
+
attr_reader :year
|
25
|
+
|
26
|
+
#
|
27
|
+
# 初期化
|
28
|
+
#
|
29
|
+
# @param [Western::Calendar] start_date 開始日
|
30
|
+
# @param [Western::Calendar] last_date 終了日
|
31
|
+
# @param [String] name 元号名
|
32
|
+
# @param [Integer] 元号年
|
33
|
+
#
|
34
|
+
def initialize(start_date: Western::Calendar.new, last_date: Western::Calendar.new,
|
35
|
+
name: '', year: INVALID_YEAR)
|
36
|
+
@start_date = start_date
|
37
|
+
@last_date = last_date
|
38
|
+
@name = name
|
39
|
+
@year = year
|
40
|
+
end
|
41
|
+
|
42
|
+
#
|
43
|
+
# 不正か
|
44
|
+
#
|
45
|
+
# @return [True] 不正
|
46
|
+
# @return [False] 不正なし
|
47
|
+
#
|
48
|
+
def invalid?
|
49
|
+
@name == '' || @year == INVALID_YEAR
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# 範囲内か
|
54
|
+
#
|
55
|
+
# @param [Western::Calendar] date 西暦日
|
56
|
+
#
|
57
|
+
# @return [True] 範囲内
|
58
|
+
# @return [False] 範囲外
|
59
|
+
#
|
60
|
+
def include?(date: Western::Calendar.new)
|
61
|
+
return false if invalid?
|
62
|
+
|
63
|
+
return false if @start_date.invalid?
|
64
|
+
|
65
|
+
return false if @last_date.invalid?
|
66
|
+
|
67
|
+
return false if date < @start_date
|
68
|
+
|
69
|
+
return false if date > @last_date
|
70
|
+
|
71
|
+
true
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative './year'
|
4
|
-
|
4
|
+
|
5
|
+
require_relative '../../version/context'
|
5
6
|
|
6
7
|
# :nodoc:
|
7
8
|
module Zakuro
|
@@ -16,23 +17,12 @@ module Zakuro
|
|
16
17
|
#
|
17
18
|
# 初期化
|
18
19
|
#
|
19
|
-
# @param [
|
20
|
+
# @param [Context] context 暦コンテキスト
|
20
21
|
# @param [Array<OperatedMonth>] months 年内の全ての月
|
21
22
|
# @param [Integer] total_days 年の日数
|
22
|
-
# @param [Western::Calendar] new_year_date 元旦
|
23
23
|
#
|
24
|
-
def initialize(
|
25
|
-
|
26
|
-
super(multi_gengou: multi_gengou, new_year_date: new_year_date,
|
27
|
-
months: months, total_days: total_days)
|
28
|
-
end
|
29
|
-
|
30
|
-
def commit
|
31
|
-
super
|
32
|
-
|
33
|
-
return if months.empty?
|
34
|
-
|
35
|
-
@new_year_date = months[0].first_day.western_date
|
24
|
+
def initialize(context: Context.new, months: [], total_days: 0)
|
25
|
+
super(context: context, months: months, total_days: total_days)
|
36
26
|
end
|
37
27
|
|
38
28
|
#
|
@@ -2,6 +2,10 @@
|
|
2
2
|
|
3
3
|
require_relative '../cycle/zodiac'
|
4
4
|
|
5
|
+
require_relative '../../era/western/calendar'
|
6
|
+
|
7
|
+
require_relative '../../version/context'
|
8
|
+
|
5
9
|
# :nodoc:
|
6
10
|
module Zakuro
|
7
11
|
# :nodoc:
|
@@ -12,28 +16,23 @@ module Zakuro
|
|
12
16
|
# Year 年
|
13
17
|
#
|
14
18
|
class Year
|
15
|
-
# @return [
|
16
|
-
attr_reader :
|
19
|
+
# @return [Context] 暦コンテキスト
|
20
|
+
attr_reader :context
|
17
21
|
# @return [Array<Month>] 年内の全ての月
|
18
22
|
attr_reader :months
|
19
23
|
# @return [Integer] 年の日数
|
20
24
|
attr_reader :total_days
|
21
|
-
# @return [Western::Calendar] 元旦
|
22
|
-
attr_reader :new_year_date
|
23
25
|
|
24
26
|
#
|
25
27
|
# 初期化
|
26
28
|
#
|
27
|
-
# @param [
|
29
|
+
# @param [Context] context 暦コンテキスト
|
28
30
|
# @param [Array<Month>] months 年内の全ての月
|
29
31
|
# @param [Integer] total_days 年の日数
|
30
|
-
# @param [Western::Calendar] new_year_date 元旦
|
31
32
|
#
|
32
|
-
def initialize(
|
33
|
-
|
34
|
-
@multi_gengou = multi_gengou
|
33
|
+
def initialize(context: Context.new, months: [], total_days: 0)
|
34
|
+
@context = context
|
35
35
|
@months = months
|
36
|
-
@new_year_date = new_year_date
|
37
36
|
@total_days = total_days
|
38
37
|
end
|
39
38
|
|
@@ -58,21 +57,34 @@ module Zakuro
|
|
58
57
|
# @return [MultiGengou] 自身
|
59
58
|
#
|
60
59
|
def next_year
|
61
|
-
@multi_gengou.next_year
|
62
|
-
|
63
|
-
@new_year_date += @total_days
|
64
60
|
@total_days = 0
|
65
61
|
|
66
62
|
self
|
67
63
|
end
|
68
64
|
|
65
|
+
#
|
66
|
+
# 年初を取得する
|
67
|
+
#
|
68
|
+
# @return [Western::Calendar] 年初
|
69
|
+
#
|
70
|
+
def new_year_date
|
71
|
+
return Western::Calendar.new unless months
|
72
|
+
|
73
|
+
return Western::Calendar.new if months.size.zero?
|
74
|
+
|
75
|
+
@months[0].western_date
|
76
|
+
end
|
77
|
+
|
69
78
|
#
|
70
79
|
# 十干十二支を取得する
|
71
80
|
#
|
72
81
|
# @return [String] 十干十二支
|
73
82
|
#
|
74
83
|
def zodiac_name
|
75
|
-
|
84
|
+
date = new_year_date
|
85
|
+
return '' if date.invalid?
|
86
|
+
|
87
|
+
Cycle::Zodiac.year_name(western_year: date.year)
|
76
88
|
end
|
77
89
|
|
78
90
|
#
|
@@ -0,0 +1,209 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../era/western/calendar'
|
4
|
+
require_relative '../../base/gengou'
|
5
|
+
require_relative '../../base/linear_gengou'
|
6
|
+
require_relative './internal/connector'
|
7
|
+
require_relative './internal/publisher'
|
8
|
+
|
9
|
+
# :nodoc:
|
10
|
+
module Zakuro
|
11
|
+
# :nodoc:
|
12
|
+
module Calculation
|
13
|
+
# :nodoc:
|
14
|
+
module Gengou
|
15
|
+
# AbstractScroll
|
16
|
+
#
|
17
|
+
# 元号スクロール
|
18
|
+
#
|
19
|
+
class AbstractScroll
|
20
|
+
# @return [Western::Calendar] 月初日
|
21
|
+
attr_reader :monthly_start_date
|
22
|
+
# @return [Western::Calendar] 月末日
|
23
|
+
attr_reader :monthly_last_date
|
24
|
+
# @return [Reserve::AbstractRange] 予約範囲
|
25
|
+
attr_reader :range
|
26
|
+
# @return [Array<Counte>] 1行目元号
|
27
|
+
attr_reader :first_gengou
|
28
|
+
# @return [Array<Counte>] 2行目元号
|
29
|
+
attr_reader :second_gengou
|
30
|
+
# @return [Connector] 行変更済元号
|
31
|
+
attr_reader :connector
|
32
|
+
|
33
|
+
#
|
34
|
+
# 初期化
|
35
|
+
#
|
36
|
+
# @param [Reserve::AbstractRange] range 予約範囲
|
37
|
+
#
|
38
|
+
def initialize(range:)
|
39
|
+
@monthly_start_date = Western::Calendar.new
|
40
|
+
@monthly_last_date = Western::Calendar.new
|
41
|
+
@range = range
|
42
|
+
@first_gengou = []
|
43
|
+
@second_gengou = []
|
44
|
+
@ignited = false
|
45
|
+
@connector = Connector.new
|
46
|
+
end
|
47
|
+
|
48
|
+
#
|
49
|
+
# 進める
|
50
|
+
#
|
51
|
+
# @param [Monthly::Month] month 月
|
52
|
+
#
|
53
|
+
def run(month:)
|
54
|
+
unless @ignited
|
55
|
+
# 開始日の検索を行う
|
56
|
+
@ignited = ignite(month: month)
|
57
|
+
return
|
58
|
+
end
|
59
|
+
|
60
|
+
# 時間を進める
|
61
|
+
advance(month: month)
|
62
|
+
end
|
63
|
+
|
64
|
+
#
|
65
|
+
# 元号開始を試みる
|
66
|
+
#
|
67
|
+
# @param [Monthly::Month] month 月
|
68
|
+
#
|
69
|
+
# @return [True] 開始あり
|
70
|
+
# @return [False] 開始なし
|
71
|
+
#
|
72
|
+
def ignite(month:)
|
73
|
+
return false unless ignitable?(month: month)
|
74
|
+
|
75
|
+
japan_start_date = @range.japan_start_date
|
76
|
+
|
77
|
+
western_start_date = @range.western_start_date
|
78
|
+
|
79
|
+
# 今月初日(和暦日が1月2日であれば、開始日の1日前が初日)
|
80
|
+
@monthly_start_date = western_start_date.clone - japan_start_date.day + 1
|
81
|
+
|
82
|
+
# 今月末
|
83
|
+
@monthly_last_date = @monthly_start_date.clone + month.days - 1
|
84
|
+
|
85
|
+
update_current_gengou
|
86
|
+
|
87
|
+
true
|
88
|
+
end
|
89
|
+
|
90
|
+
#
|
91
|
+
# 進める
|
92
|
+
#
|
93
|
+
# @param [Monthly::Month] month 月
|
94
|
+
#
|
95
|
+
def advance(month:)
|
96
|
+
@monthly_start_date = @monthly_last_date.clone + 1
|
97
|
+
|
98
|
+
@monthly_last_date = @monthly_start_date.clone + month.days - 1
|
99
|
+
|
100
|
+
next_year if month.number == 1 && !month.leaped?
|
101
|
+
|
102
|
+
update_current_gengou
|
103
|
+
end
|
104
|
+
|
105
|
+
#
|
106
|
+
# 共通の元号に変換する
|
107
|
+
#
|
108
|
+
# @return [Base::Gengou] 元号
|
109
|
+
#
|
110
|
+
def to_gengou
|
111
|
+
start_date = @monthly_start_date.clone
|
112
|
+
last_date = @monthly_last_date.clone
|
113
|
+
|
114
|
+
# 行を超えた元号切り替え処理
|
115
|
+
continue_year
|
116
|
+
|
117
|
+
Publisher.run(
|
118
|
+
start_date: start_date, last_date: last_date,
|
119
|
+
first_gengou: @first_gengou, second_gengou: @second_gengou
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
123
|
+
#
|
124
|
+
# 開始西暦年を取得する
|
125
|
+
#
|
126
|
+
# @return [Integer] 開始西暦年
|
127
|
+
#
|
128
|
+
def western_start_year
|
129
|
+
@range.western_start_year
|
130
|
+
end
|
131
|
+
|
132
|
+
#
|
133
|
+
# 終了西暦年を取得する
|
134
|
+
#
|
135
|
+
# @return [Integer] 終了西暦年
|
136
|
+
#
|
137
|
+
def western_last_year
|
138
|
+
@range.western_last_year
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
#
|
144
|
+
# 行を跨ぐ元号年を継続させる
|
145
|
+
#
|
146
|
+
def continue_year
|
147
|
+
@connector.update(lines: [@first_gengou, @second_gengou])
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# 現在月に合わせて元号を更新する
|
152
|
+
#
|
153
|
+
def update_current_gengou
|
154
|
+
start_date = @monthly_start_date
|
155
|
+
last_date = @monthly_last_date
|
156
|
+
first_gengou = @range.collect_first(start_date: start_date, last_date: last_date)
|
157
|
+
second_gengou = @range.collect_second(start_date: start_date,
|
158
|
+
last_date: last_date)
|
159
|
+
|
160
|
+
@first_gengou = replace_gengou(source: @first_gengou, destination: first_gengou)
|
161
|
+
@second_gengou = replace_gengou(source: @second_gengou, destination: second_gengou)
|
162
|
+
end
|
163
|
+
|
164
|
+
#
|
165
|
+
# 元号を差し替える
|
166
|
+
#
|
167
|
+
# @param [Array<Counter>] source 元の元号
|
168
|
+
# @param [Array<Counter>] destination 次の元号
|
169
|
+
#
|
170
|
+
# @return [Array<Counter>] 差し替え結果
|
171
|
+
#
|
172
|
+
def replace_gengou(source: [], destination: [])
|
173
|
+
return destination if destination.size.zero?
|
174
|
+
|
175
|
+
return destination if source.size.zero?
|
176
|
+
|
177
|
+
last = source[-1]
|
178
|
+
destination[0] = last if destination[0].name == last.name
|
179
|
+
|
180
|
+
destination
|
181
|
+
end
|
182
|
+
|
183
|
+
#
|
184
|
+
# 開始可能か
|
185
|
+
#
|
186
|
+
# @param [Monthly::Month] month 月
|
187
|
+
#
|
188
|
+
# @return [True] 開始可
|
189
|
+
# @return [True] 開始不可
|
190
|
+
#
|
191
|
+
def ignitable?(month:)
|
192
|
+
return false unless @monthly_start_date.invalid?
|
193
|
+
|
194
|
+
japan_start_date = @range.japan_start_date
|
195
|
+
|
196
|
+
japan_start_date.same_month?(leaped: month.leaped?, month: month.number)
|
197
|
+
end
|
198
|
+
|
199
|
+
#
|
200
|
+
# 次年にする
|
201
|
+
#
|
202
|
+
def next_year
|
203
|
+
@first_gengou.each(&:next_year)
|
204
|
+
@second_gengou.each(&:next_year)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|