when_exe 0.3.7 → 0.3.8

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