when_exe 0.3.7 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +210 -171
  3. data/bin/irb.rc +1 -0
  4. data/lib/when_exe.rb +78 -53
  5. data/lib/when_exe/basictypes.rb +27 -8
  6. data/lib/when_exe/calendarnote.rb +848 -805
  7. data/lib/when_exe/calendartypes.rb +110 -240
  8. data/lib/when_exe/coordinates.rb +2440 -2175
  9. data/lib/when_exe/core/compatibility.rb +1 -1
  10. data/lib/when_exe/core/duration.rb +13 -11
  11. data/lib/when_exe/core/extension.rb +38 -45
  12. data/lib/when_exe/ephemeris.rb +43 -14
  13. data/lib/when_exe/ephemeris/eclipse.rb +149 -0
  14. data/lib/when_exe/ephemeris/notes.rb +39 -7
  15. data/lib/when_exe/icalendar.rb +2 -6
  16. data/lib/when_exe/inspect.rb +1408 -1399
  17. data/lib/when_exe/parts/enumerator.rb +486 -477
  18. data/lib/when_exe/parts/resource.rb +1101 -1069
  19. data/lib/when_exe/parts/timezone.rb +6 -5
  20. data/lib/when_exe/region/babylonian.rb +405 -405
  21. data/lib/when_exe/region/bahai.rb +21 -61
  22. data/lib/when_exe/region/chinese/epochs.rb +81 -81
  23. data/lib/when_exe/region/chinese/twins.rb +51 -51
  24. data/lib/when_exe/region/christian.rb +7 -2
  25. data/lib/when_exe/region/coptic.rb +1 -1
  26. data/lib/when_exe/region/discordian.rb +9 -16
  27. data/lib/when_exe/region/french.rb +1 -1
  28. data/lib/when_exe/region/hanke_henry.rb +57 -0
  29. data/lib/when_exe/region/indian.rb +41 -73
  30. data/lib/when_exe/region/international_fixed.rb +97 -0
  31. data/lib/when_exe/region/iranian.rb +203 -203
  32. data/lib/when_exe/region/japanese.rb +13 -13
  33. data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
  34. data/lib/when_exe/region/japanese/notes.rb +1482 -1383
  35. data/lib/when_exe/region/japanese/residues.rb +726 -721
  36. data/lib/when_exe/region/japanese/twins.rb +37 -37
  37. data/lib/when_exe/region/jewish.rb +2 -2
  38. data/lib/when_exe/region/pax.rb +60 -0
  39. data/lib/when_exe/region/positivist.rb +100 -0
  40. data/lib/when_exe/region/roman.rb +333 -334
  41. data/lib/when_exe/region/shire.rb +3 -20
  42. data/lib/when_exe/region/thai.rb +2 -2
  43. data/lib/when_exe/region/tibetan.rb +3 -3
  44. data/lib/when_exe/region/tranquility.rb +208 -0
  45. data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
  46. data/lib/when_exe/region/vietnamese.rb +4 -4
  47. data/lib/when_exe/region/world.rb +9 -13
  48. data/lib/when_exe/region/world_season.rb +89 -0
  49. data/lib/when_exe/region/zoroastrian.rb +4 -2
  50. data/lib/when_exe/tmobjects.rb +14 -4
  51. data/lib/when_exe/tmposition.rb +239 -81
  52. data/lib/when_exe/tmreference.rb +57 -28
  53. data/lib/when_exe/version.rb +1 -1
  54. data/link_to_online_documents +6 -3
  55. data/test/examples/today.rb +1 -1
  56. data/test/scripts.rb +23 -0
  57. data/test/scripts/2.ext.rb +169 -0
  58. data/test/scripts/2.rb +169 -0
  59. data/test/scripts/3.ext.rb +133 -0
  60. data/test/scripts/3.rb +134 -0
  61. data/test/scripts/4.ext.rb +112 -0
  62. data/test/scripts/4.min.rb +65 -0
  63. data/test/scripts/4.rb +136 -0
  64. data/test/scripts/5.ext.rb +78 -0
  65. data/test/scripts/5.rb +81 -0
  66. data/test/scripts/6.gcal.rb +131 -0
  67. data/test/scripts/6.rb +205 -0
  68. data/test/scripts/6.tz.rb +105 -0
  69. data/test/scripts/7.phase.rb +109 -0
  70. data/test/scripts/7.rb +95 -0
  71. data/test/scripts/7.term.rb +128 -0
  72. data/test/scripts/7.week.rb +84 -0
  73. data/test/scripts/8.ext.rb +61 -0
  74. data/test/scripts/8.rb +62 -0
  75. data/test/scripts/9.ext.rb +131 -0
  76. data/test/scripts/9.rb +130 -0
  77. data/test/scripts/chinese-luni-solar.rb +52 -0
  78. data/test/{examples → scripts}/geometric_complex.rb +41 -41
  79. data/test/scripts/geometric_complex.txt +18 -0
  80. data/test/scripts/korea.rb +59 -0
  81. data/test/scripts/thai-reviewed.txt +211 -0
  82. data/test/scripts/thai.rb +36 -0
  83. data/test/scripts/thai.txt +210 -0
  84. data/test/test.rb +7 -0
  85. data/test/test/basictypes.rb +22 -0
  86. data/test/test/coordinates.rb +2 -1
  87. data/test/test/ephemeris.rb +34 -2
  88. data/test/test/icalendar.rb +12 -0
  89. data/test/test/inspect.rb +37 -1
  90. data/test/test/parts.rb +4 -3
  91. data/test/test/region/armenian.rb +20 -0
  92. data/test/test/region/bahai.rb +58 -0
  93. data/test/test/region/chinese.rb +14 -3
  94. data/test/test/region/christian.rb +16 -35
  95. data/test/test/region/discordian.rb +20 -0
  96. data/test/test/region/indian.rb +30 -2
  97. data/test/test/region/japanese.rb +24 -0
  98. data/test/test/region/jewish.rb +2 -0
  99. data/test/test/region/m17n.rb +9 -0
  100. data/test/test/region/reforms.rb +121 -0
  101. data/test/test/region/residue.rb +17 -11
  102. data/test/test/region/shire.rb +58 -0
  103. data/test/test/region/swedish.rb +45 -0
  104. data/test/test/region/zoroastrian.rb +58 -0
  105. data/test/test/tmobjects.rb +74 -0
  106. data/test/test/tmposition.rb +468 -397
  107. data/when_exe.gemspec +2 -2
  108. metadata +49 -6
@@ -86,7 +86,18 @@ module When::CalendarTypes
86
86
  def universal_time(sdn=nil)
87
87
  return super - @time_standard.localtime_difference unless sdn
88
88
  time = When::TM::JulianDate._d_to_t(sdn-0.5)
89
- @time_standard.to_dynamical_time(time) - When::TimeStandard.to_dynamical_time(time) - @time_standard.localtime_difference
89
+ @time_standard.to_dynamical_time(time) - When::TimeStandard.to_dynamical_time(time)
90
+ end
91
+
92
+ # この時法の時刻を128秒単位の実数に変換する
93
+ #
94
+ # @param [Array<Numeric>] clk_time
95
+ # @param [Integer] sdn 参照事象の通し番号(ダミー)
96
+ #
97
+ # @return [Numeric]
98
+ #
99
+ def to_local_time(clk_time, sdn=nil)
100
+ super - universal_time(sdn)
90
101
  end
91
102
 
92
103
  #
@@ -177,13 +188,13 @@ module When::CalendarTypes
177
188
  'rule_table' => table
178
189
  }
179
190
  list = ''
180
- while range.include?(date[YEAR])
181
- month = date[MONTH] * 1
191
+ while range.include?(date[When::YEAR])
192
+ month = date[When::MONTH] * 1
182
193
  char = Pattern[month..month]
183
- char = char.downcase unless date.length(MONTH) == length
194
+ char = char.downcase unless date.length(When::MONTH) == length
184
195
  list += char
185
196
  succ = date + duration
186
- unless date[YEAR] == succ[YEAR]
197
+ unless date[When::YEAR] == succ[When::YEAR]
187
198
  table << list
188
199
  list = ''
189
200
  end
@@ -845,7 +856,7 @@ module When::CalendarTypes
845
856
 
846
857
  # オブジェクトの正規化
847
858
  #
848
- # YearLengthTableBased+オブジェクトの性質定義を初期設定します。
859
+ # PatternTableBasedLuniSolarWithEphemeris オブジェクトの性質定義を初期設定します。
849
860
  #
850
861
  def _normalize(args=[], options={})
851
862
  @engine = When.Calendar(@engine)
@@ -1050,20 +1061,56 @@ module When::CalendarTypes
1050
1061
  end
1051
1062
 
1052
1063
  #
1053
- # 年初を太陽黄経で決定する暦
1064
+ # 年初を太陽黄経または別の暦で決定する暦
1054
1065
  #
1055
1066
  class YearLengthTableBased < TableBased
1056
1067
 
1068
+ module CalendarBased
1069
+
1070
+ # 年初の通日(別の暦使用)
1071
+ #
1072
+ # @param [Numeric] year 年
1073
+ #
1074
+ # @return [Integer] 年初の通日
1075
+ #
1076
+ def _new_year_sdn(year)
1077
+ @engine._coordinates_to_number(year + @diff_to_CE - @engine.diff_to_CE, @engine_month, @engine_day)
1078
+ end
1079
+
1080
+ # オブジェクトの正規化
1081
+ def _normalize_engine
1082
+ Rational
1083
+ @engine_month = @engine_month ? @engine_month.to_i - @indices[-2].base : 0
1084
+ @engine_day = @engine_day ? @engine_day.to_i - @indices[-1].base : 0
1085
+ @engine = When.Calendar(@engine || When::Gregorian)
1086
+ end
1087
+ end
1088
+
1057
1089
  # 天体暦アルゴリズム
1058
1090
  #
1059
1091
  # @return [Array<When::Ephemeris::Formula>]
1060
1092
  #
1061
1093
  attr_reader :formula
1062
1094
 
1063
- #protected
1064
-
1065
1095
  private
1066
1096
 
1097
+ # 年初の通日(天体暦使用)
1098
+ #
1099
+ # @param [Numeric] year 年
1100
+ #
1101
+ # @return [Integer] 年初の通日
1102
+ #
1103
+ def _new_year_sdn(year)
1104
+ solar_sdn(@formula[0].cn_to_time(year.to_f + @cycle_offset) + @day_offset)
1105
+ end
1106
+
1107
+ # オブジェクトの正規化
1108
+ def _normalize_engine
1109
+ Rational
1110
+ @cycle_offset = (@cycle_offset||0).to_r
1111
+ @day_offset = (@day_offset||0).to_r
1112
+ end
1113
+
1067
1114
  # 年初の通日
1068
1115
  #
1069
1116
  # @param [Array<Numeric>] date ( y )
@@ -1073,26 +1120,61 @@ module When::CalendarTypes
1073
1120
  # @return [Integer] 年初の通日
1074
1121
  #
1075
1122
  def _sdn_(date)
1076
- y = +date[0]
1077
- t = @formula[0].cn_to_time(y.to_f + @cycle_offset)
1078
- return solar_sdn(t + @day_offset)
1123
+ _new_year_sdn(+date[0])
1079
1124
  end
1080
1125
 
1081
1126
  # オブジェクトの正規化
1082
1127
  #
1083
- # YearLengthTableBased+オブジェクトの性質定義を初期設定します。
1128
+ # YearLengthTableBased オブジェクトの性質定義を初期設定します。
1084
1129
  #
1085
1130
  def _normalize(args=[], options={})
1086
1131
 
1087
- Rational
1088
- @cycle_offset = (@cycle_offset||0).to_r
1089
- @day_offset = (@day_offset||0).to_r
1090
- @formula = 'Formula?formula=1S'
1091
-
1132
+ extend CalendarBased unless @formula || @location || @long || @lat || @alt || @time_basis
1133
+ _normalize_engine
1092
1134
  super
1093
1135
  end
1094
1136
  end
1095
1137
 
1138
+ #
1139
+ # 年初を特定の日の日の出で決定する暦
1140
+ #
1141
+ class TableBasedWithSunrise < YearLengthTableBased
1142
+
1143
+ # 年初の通日(天体暦使用)
1144
+ #
1145
+ # @param [Numeric] year 年
1146
+ #
1147
+ # @return [Integer] 年初の通日
1148
+ #
1149
+ def _new_year_sdn(year)
1150
+ event_time = @formula[0].cn_to_time(year.to_f + @cycle_offset)
1151
+ event_date = (event_time + 0.5 + @formula[0].long/360.0).floor
1152
+ sunset_time = @formula[0].sunrise(event_date)
1153
+ event_date -= 1 if sunrise_time > event_time
1154
+ event_date + @day_offset
1155
+ end
1156
+ end
1157
+
1158
+ #
1159
+ # 年初を特定の日の日の入りで決定する暦
1160
+ #
1161
+ class TableBasedWithSunset < YearLengthTableBased
1162
+
1163
+ # 年初の通日(天体暦使用)
1164
+ #
1165
+ # @param [Numeric] year 年
1166
+ #
1167
+ # @return [Integer] 年初の通日
1168
+ #
1169
+ def _new_year_sdn(year)
1170
+ event_time = @formula[0].cn_to_time(year.to_f + @cycle_offset)
1171
+ event_date = (event_time + 0.5 + @formula[0].long/360.0).floor
1172
+ sunset_time = @formula[0].sunset(event_date)
1173
+ event_date += 1 if sunset_time <= event_time
1174
+ event_date + @day_offset
1175
+ end
1176
+ end
1177
+
1096
1178
  # 月日の配当が太陽または月の位置によって決定される暦
1097
1179
  #
1098
1180
  # Calendar based on the ephemeris of the Sun or the Moon
@@ -1154,13 +1236,13 @@ module When::CalendarTypes
1154
1236
  #
1155
1237
  def _length(date)
1156
1238
  y, m = date
1157
- if (m)
1239
+ if m
1158
1240
  # 指定した月に含まれる日の数を返します。
1159
1241
  m += @months_in_year * +y
1160
- return _new_month(m+1) - _new_month(m)
1242
+ _new_month(m+1) - _new_month(m)
1161
1243
  else
1162
1244
  # 指定した年に含まれる月の数を返します。
1163
- return @months_in_year
1245
+ @months_in_year
1164
1246
  end
1165
1247
  end
1166
1248
 
@@ -1175,7 +1257,7 @@ module When::CalendarTypes
1175
1257
  def _sum_(date)
1176
1258
  y, = date
1177
1259
  m = @months_in_year * +y
1178
- return _new_month(m+@months_in_year) - _new_month(m)
1260
+ _new_month(m+@months_in_year) - _new_month(m)
1179
1261
  end
1180
1262
 
1181
1263
  private
@@ -1206,7 +1288,7 @@ module When::CalendarTypes
1206
1288
  # @return [Integer] 月初の通日
1207
1289
  #
1208
1290
  def _new_month_(m)
1209
- return solar_sdn(@formula[0].cn_to_time(m + @cycle_offset))
1291
+ solar_sdn(@formula[0].cn_to_time(m + @cycle_offset))
1210
1292
  end
1211
1293
 
1212
1294
  private
@@ -1239,7 +1321,7 @@ module When::CalendarTypes
1239
1321
  # @return [Integer] 月初の通日
1240
1322
  #
1241
1323
  def _new_month_(m)
1242
- return lunar_sdn(@formula[-1].cn_to_time(m + @cycle_offset))
1324
+ lunar_sdn(@formula[-1].cn_to_time(m + @cycle_offset))
1243
1325
  end
1244
1326
 
1245
1327
  private
@@ -1307,13 +1389,13 @@ module When::CalendarTypes
1307
1389
  #
1308
1390
  def _length(date)
1309
1391
  y, m = date
1310
- if (m)
1392
+ if m
1311
1393
  # 指定した月に含まれる日の数を返します。
1312
1394
  m += _new_year_month(+y)
1313
- return _new_month(m+1) - _new_month(m)
1395
+ _new_month(m+1) - _new_month(m)
1314
1396
  else
1315
1397
  # 指定した年に含まれる月の数を返します。
1316
- return _ids([y]).length
1398
+ _ids([y]).length
1317
1399
  end
1318
1400
  end
1319
1401
 
@@ -1329,7 +1411,7 @@ module When::CalendarTypes
1329
1411
  #
1330
1412
  def _sum_(date)
1331
1413
  y = +date[0]
1332
- return _new_month(_new_year_month(y+1)) - _new_month(_new_year_month(y))
1414
+ _new_month(_new_year_month(y+1)) - _new_month(_new_year_month(y))
1333
1415
  end
1334
1416
 
1335
1417
  # 太陽月初の通日
@@ -1368,216 +1450,4 @@ module When::CalendarTypes
1368
1450
  super
1369
1451
  end
1370
1452
  end
1371
-
1372
- #
1373
- # 日時要素の境界 - Border
1374
- #
1375
- class Border < When::TM::ReferenceSystem
1376
- #
1377
- # 境界の振舞
1378
- #
1379
- # @return [Numeric]
1380
- #
1381
- # Pair(-1,+1) - 暦年/暦日が進む(境界が前年/日にあり、境界後が当年/日の扱いになる)
1382
- #
1383
- # Pair( 0, 0) - 暦年/暦日が戻る(境界が当年/日にあり、境界前が前年/日の扱いになる)
1384
- #
1385
- def behavior
1386
- @border[0]
1387
- end
1388
-
1389
- # 境界の取得
1390
- #
1391
- # @param [Array<Numeric>] date 境界を計算する年/日
1392
- # @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
1393
- #
1394
- # @return [Array<Numeric>] その年/日の境界
1395
- #
1396
- def border(date=[], frame=nil)
1397
- last = date.length-1
1398
- return @border if last<0
1399
- bDate = date[0..last] + @border[(last+1)..-1]
1400
- branch = @border[last] * 0
1401
- bDate[last] = When::Coordinates::Pair.new(date[last] * 1, branch)
1402
- return bDate
1403
- end
1404
-
1405
- # 境界の正規化
1406
- #
1407
- # @param [Array<Numeric>] date 境界を計算する年/日
1408
- # @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
1409
- #
1410
- # @return [Array<Numeric>] その年/日の境界
1411
- #
1412
- def _adjust_epoch(date, frame=nil)
1413
- s_date = date.dup
1414
- e_date = border([+date[0]], frame)
1415
- branch = behavior * 0
1416
- branch += 1 if (s_date[1..-1] <=> e_date[1..-1]) < 0
1417
- s_date[0] = When::Coordinates::Pair.new(+s_date[0]-branch, branch)
1418
- return s_date
1419
- end
1420
-
1421
- # 日付の補正
1422
- # @private
1423
- def _date_adjust(source)
1424
- source
1425
- end
1426
-
1427
- private
1428
-
1429
- # 要素の正規化
1430
- def _normalize(args=[], options={})
1431
- @border = When::Coordinates::Pair._en_pair_date_time(@border) if (@border.kind_of?(String))
1432
- end
1433
- end
1434
-
1435
- #
1436
- # 日時要素の境界 - 年/日によって、異なる境界を使用する場合
1437
- #
1438
- class MultiBorder < Border
1439
-
1440
- #
1441
- # 境界の配列
1442
- # @return [Array<When::CalendarTypes::Border>]
1443
- attr_reader :borders
1444
-
1445
- #
1446
- # 境界の振舞
1447
- #
1448
- # @return [Numeric]
1449
- #
1450
- # Pair(-1,+1) - 暦年/暦日が進む(境界が前年/日にあり、境界後が当年/日の扱いになる)
1451
- #
1452
- # Pair( 0, 0) - 暦年/暦日が戻る(境界が当年/日にあり、境界前が前年/日の扱いになる)
1453
- #
1454
- def behavior
1455
- @borders[0][:border].behavior
1456
- end
1457
-
1458
- # 境界の取得
1459
- #
1460
- # @param [Array<Numeric>] date 境界を計算する年/日
1461
- # @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
1462
- #
1463
- # @return [Array<Numeric>] その年/日の境界
1464
- #
1465
- def border(date=[], frame=nil)
1466
- last = date.length-1
1467
- return @borders[0][:boder] if (last<0)
1468
- @borders.each do |border|
1469
- return border[:border].border(date, frame) if date[0] >= border[:key]
1470
- end
1471
- date[0..last]
1472
- end
1473
-
1474
- # 境界の正規化
1475
- #
1476
- # @param [Array<Numeric>] date 境界を計算する年/日
1477
- # @param [When::TM::ReferenceSystem] frame 使用する暦法/時法
1478
- #
1479
- # @return [Array<Numeric>] その年/日の境界
1480
- #
1481
- def _adjust_epoch(date, frame=nil)
1482
- @borders.each do |border|
1483
- next unless date[0] >= border[:key]
1484
- s_date = date.dup
1485
- e_date = border[:border].border(date[0..0], frame)
1486
- branch = border[:border].behavior * 0
1487
- branch += 1 if ((s_date[1..-1] <=> e_date[1..-1]) < 0)
1488
- s_date[0] = When::Coordinates::Pair.new(+s_date[0]-branch, branch)
1489
- return s_date
1490
- end
1491
- date
1492
- end
1493
-
1494
- private
1495
-
1496
- # 要素の正規化
1497
- def _normalize(args=[], options={})
1498
- if @borders.kind_of?(String)
1499
- list = @borders.split(/(\(.+?\))/)
1500
- list.shift if list[0]==''
1501
- list.unshift(-Float::MAX) unless list[0] =~ /\(/
1502
- list.push('0-1-1') if list[-1] =~ /\(/
1503
- @borders = []
1504
- loop do
1505
- key, border, *list = list
1506
- break unless key
1507
- key = $1.to_i if key.kind_of?(String) && /\((.+?)\)/ =~ key
1508
- border = "_c:Border?border=#{border}" unless border =~ /\A[A-Z_]/i
1509
- border = When.Calendar(border)
1510
- @borders << {:key=>key, :border=>border}
1511
- end
1512
- end
1513
- @borders = @borders.sort_by {|border| -border[:key]}
1514
- end
1515
- end
1516
-
1517
- #
1518
- # 日時要素の境界 - 日の出,日の入り
1519
- #
1520
- class DayBorder < Border
1521
-
1522
- # 境界の取得
1523
- #
1524
- # @param [Array<Numeric>] date 境界を計算する日
1525
- # @param [When::TM::ReferenceSystem] clock 使用する時法
1526
- #
1527
- # @return [Array<Numeric>] その日の境界
1528
- #
1529
- # @note 属性 @event によって境界を計算する (see {When::Ephemeris::Formula#day_event})
1530
- #
1531
- def border(date=[], clock=When::UTC)
1532
- return @border unless date[0] && clock.formula
1533
-
1534
- time =
1535
- clock._number_to_coordinates(clock.second *
1536
- clock.time_standard.from_dynamical_time(
1537
- When::TM::JulianDate._d_to_t(
1538
- clock.formula.first.day_event(
1539
- clock.time_standard.to_dynamical_date(date[0] + @border[0]*0), @event, When.Resource('_ep:Sun'), @height
1540
- ))))
1541
-
1542
- time[0] += When::TM::JulianDate::JD19700101
1543
- time[0] = When::Coordinates::Pair.new(time[0]-@border[0]*0, @border[0]*0) unless @border[0]*0 == 0
1544
- clock._encode(time, false)
1545
- end
1546
-
1547
- # 日付の補正
1548
- # @private
1549
- def _date_adjust(source)
1550
- source * 1 + @border[0] * 0
1551
- end
1552
- end
1553
-
1554
- #
1555
- # 日時要素の境界 - 日の出
1556
- #
1557
- class Sunrise < DayBorder
1558
-
1559
- private
1560
-
1561
- # 要素の正規化
1562
- def _normalize(args=[], options={})
1563
- @border = [0,0,0,0]
1564
- @event = -1
1565
- @height ||= '0'
1566
- end
1567
- end
1568
-
1569
- #
1570
- # 日時要素の境界 - 日の入り
1571
- #
1572
- class Sunset < DayBorder
1573
-
1574
- private
1575
-
1576
- # 要素の正規化
1577
- def _normalize(args=[], options={})
1578
- @border = [When::Coordinates::Pair.new(+1,-1),0,0,0]
1579
- @event = +1
1580
- @height ||= '0'
1581
- end
1582
- end
1583
1453
  end