when_exe 0.3.8 → 0.3.9

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +210 -210
  3. data/lib/when_exe.rb +923 -919
  4. data/lib/when_exe/basictypes.rb +1 -1
  5. data/lib/when_exe/calendartypes.rb +4 -4
  6. data/lib/when_exe/coordinates.rb +5 -1
  7. data/lib/when_exe/ephemeris.rb +1 -1
  8. data/lib/when_exe/locales/locale.rb +3 -2
  9. data/lib/when_exe/region/bahai.rb +2 -2
  10. data/lib/when_exe/region/chinese.rb +1030 -1030
  11. data/lib/when_exe/region/chinese/epochs.rb +887 -919
  12. data/lib/when_exe/region/discordian.rb +5 -5
  13. data/lib/when_exe/region/east_asian.rb +256 -0
  14. data/lib/when_exe/region/french.rb +1 -1
  15. data/lib/when_exe/region/indian.rb +7 -7
  16. data/lib/when_exe/region/international_fixed.rb +2 -2
  17. data/lib/when_exe/region/iranian.rb +1 -1
  18. data/lib/when_exe/region/islamic.rb +102 -103
  19. data/lib/when_exe/region/japanese/epochs.rb +426 -426
  20. data/lib/when_exe/region/japanese/nihon_shoki.rb +46 -47
  21. data/lib/when_exe/region/japanese/notes.rb +1482 -1482
  22. data/lib/when_exe/region/japanese/twins.rb +3 -3
  23. data/lib/when_exe/region/japanese/weeks.rb +2 -2
  24. data/lib/when_exe/region/jewish.rb +5 -0
  25. data/lib/when_exe/region/korean.rb +209 -203
  26. data/lib/when_exe/region/positivist.rb +2 -2
  27. data/lib/when_exe/region/roman.rb +1 -1
  28. data/lib/when_exe/region/ryukyu.rb +50 -48
  29. data/lib/when_exe/region/shire.rb +2 -2
  30. data/lib/when_exe/region/thai.rb +1 -1
  31. data/lib/when_exe/region/tibetan.rb +15 -15
  32. data/lib/when_exe/region/tranquility.rb +2 -2
  33. data/lib/when_exe/region/vietnamese.rb +167 -167
  34. data/lib/when_exe/region/world.rb +3 -3
  35. data/lib/when_exe/region/world_season.rb +2 -2
  36. data/lib/when_exe/region/yerm.rb +4 -2
  37. data/lib/when_exe/region/zoroastrian.rb +1 -1
  38. data/lib/when_exe/tmreference.rb +140 -128
  39. data/lib/when_exe/version.rb +1 -1
  40. data/test/examples/Spatial.m17n +3 -3
  41. data/test/test.rb +2 -1
  42. data/test/test/coordinates.rb +2 -2
  43. data/test/test/region/chinese.rb +2 -2
  44. data/test/test/region/islamic.rb +38 -2
  45. data/test/test/region/japanese.rb +2 -2
  46. data/test/test/region/vietnamese.rb +2 -2
  47. data/test/test/region/yerm.rb +156 -146
  48. metadata +3 -3
  49. data/lib/when_exe/region/far_east.rb +0 -188
@@ -53,10 +53,10 @@ module When
53
53
  [DayOfWeek, "label:[Thursday, 木曜日, /date/day_names/4]", {'delta'=>7}],
54
54
  [DayOfWeek, "label:[Friday, 金曜日, /date/day_names/5]", {'delta'=>7}],
55
55
  [DayOfWeek, "label:[Saturday, 土曜日, /date/day_names/6]", {'delta'=>7}],
56
- [DayOfWeek, "label:[Worldsday=, 週外日=]", {'delta'=>366}],
56
+ [DayOfWeek, "label:[Worldsday=en:The_World_Calendar#Features, 週外日=]", {'delta'=>366}],
57
57
  ],
58
58
 
59
- "[Common_Week]"
59
+ "[Common_Week=]"
60
60
  ]
61
61
  ]]
62
62
 
@@ -159,7 +159,7 @@ module When
159
159
  #
160
160
  # World calendar based on Gregorian calendar
161
161
  #
162
- World = [YearLengthTableBased, {
162
+ World = [SolarYearTableBased, {
163
163
  'label' => 'World::World',
164
164
  'rule_table' => {
165
165
  365 => {'Length'=>[31,30,30]*3 + [31,30,31]},
@@ -60,7 +60,7 @@ module When
60
60
  [DayOfWeek, "label:[OutOfWeek=, 週外日=]", {'delta'=>366}]
61
61
  ],
62
62
 
63
- "[Common_Week]"
63
+ "[Common_Week=]"
64
64
  ]
65
65
  ]]
66
66
 
@@ -72,7 +72,7 @@ module When
72
72
  #
73
73
  # WorldSeason calendar based on Gregorian calendar
74
74
  #
75
- WorldSeason = [YearLengthTableBased, {
75
+ WorldSeason = [SolarYearTableBased, {
76
76
  'label' => 'WorldSeason::WorldSeason',
77
77
  'indices' => [
78
78
  When.Index('WorldSeasonWeekNotes::month::Month', {:unit =>4}),
@@ -54,17 +54,19 @@ module When
54
54
  when /\A(\d+)\((\d+)\z/ ; m, d = [ $1, $2]
55
55
  when /\A(\d+)\z/ ; d = $1
56
56
 
57
+ when /\A(-?\d+)-(\d+)\)(\d+)\)(\d+)\z/ ; c, y, m, d = [$1, $4, $3, $2]
58
+
57
59
  when /\A(\d+)\)(\d+)\)(\d+)[-\)](-?\d+)\z/; c, y, m, d = [$4, $3, $2, $1]
58
60
  when /\A(\d+)\)(\d+)-(-?\d+)\z/ ; c, y, m, d = [$3, $2, $1 ]
59
61
  when /\A(\d+)-(-\d+)\z/ ; c, y, m, d = [$2, $1 ]
60
62
  when /\A(-\d+)\z/ ; c, y, m, d = [$1 ]
61
63
  when /\A(\d+)\)(\d+)\)(\d+)\z/ ; y, m, d = [ $3, $2, $1]
62
64
  when /\A(\d+)\)(\d+)\z/ ; m, d = [ $2, $1]
63
- else ; c, y, m, d = [ ]
65
+ else ; c, y, m, d = [ ]
64
66
  end
65
67
 
66
68
  ordered = [c, y, m, d]
67
- ordered.pop until ordered.last
69
+ ordered.pop until ordered.last || ordered.empty?
68
70
  raise ArgumentError, "can't parse #{source}" if ordered.empty? || ordered.include?(nil)
69
71
  ordered.map {|n| n.to_s}.join('-')
70
72
  end
@@ -185,7 +185,7 @@ module When
185
185
  Fasli = [{'Epoch'=>{
186
186
  'ZRE'=>{'origin_of_MSC'=>1737},
187
187
  'YZ' =>{'origin_of_MSC'=>-630}
188
- }}, TableBasedWithSunset, {
188
+ }}, SolarYearTableBasedWithSunset, {
189
189
  'label' => 'Zoroastrian::Fasli',
190
190
  'indices' => [
191
191
  When.Index('ZoroastrianNotes::month::Month', {:unit =>13}),
@@ -1355,9 +1355,133 @@ module When::TM
1355
1355
  end
1356
1356
  end
1357
1357
 
1358
- protected
1358
+ private
1359
1359
 
1360
- # @private
1360
+ # オブジェクトの正規化
1361
+ def _normalize(args=[], options={})
1362
+ # area, period
1363
+ term_options = {:namespace=>@namespace, :locale=>@locale, :options=>options}
1364
+ @area = m17n(@area, nil, nil, term_options) if @area.instance_of?(String)
1365
+ @period = m17n(@period, nil, nil, term_options) if @period.instance_of?(String)
1366
+
1367
+ # 暦年代の上下限
1368
+ @lower_bound = {}
1369
+ @upper_bound = {}
1370
+
1371
+ # other attributes
1372
+ if @child && @child.length>0
1373
+ _non_leaf_era(args, term_options)
1374
+ _register_calendar_era unless _pool['..'].kind_of?(CalendarEra)
1375
+ @child.each do |era|
1376
+ era.send(:_register_calendar_era)
1377
+ end
1378
+ else
1379
+ _set_leaf_era(args, term_options)
1380
+ _normalize_leaf_era unless @epoch[0].indeterminated_position == When::TimeValue::Min
1381
+ end
1382
+ end
1383
+
1384
+ def _non_leaf_era(args, term_options)
1385
+ @label = m17n(@label, nil, nil, term_options) if @label.instance_of?(String)
1386
+ if @label
1387
+ @label._pool['..'] = self # TODO ここを ||= にすると leaf? の判定がおかしくなる
1388
+ @_pool[@label.to_s] = @label
1389
+ end
1390
+
1391
+ # reference_date, reference_event & label
1392
+ @reference_date = @child[0].reference_date
1393
+ @reference_event = @child[0].reference_event
1394
+ @epoch_year = 0 # @child[0].epoch_year
1395
+ @julian_reference = @child[0].julian_reference
1396
+
1397
+ # options
1398
+ @options ||= {}
1399
+ @options.update({'area'=>@area, 'period'=>@period})
1400
+
1401
+ # epoch
1402
+ @epoch = []
1403
+ @child.each do |c|
1404
+ c.epoch.each do |e|
1405
+ @epoch << e unless e == @epoch[-1]
1406
+ end
1407
+ end
1408
+ end
1409
+
1410
+ def _set_leaf_era(args, term_options)
1411
+ # 変数の読み込み
1412
+ reference_date, reference_event, *epochs = args
1413
+
1414
+ # reference_date & label
1415
+ if reference_date
1416
+ @reference_date = reference_date
1417
+ @label ||= m17n(@reference_date[/\A\[[^\]]+\]|^[^-+0-9]+/], nil, nil, term_options)
1418
+ end
1419
+ @label._pool['..'] ||= self
1420
+ @_pool[@label.to_s] = @label
1421
+
1422
+ # reference_event
1423
+ @reference_event = reference_event if reference_event
1424
+ @reference_event ||= ""
1425
+ @reference_event = DefaultEvents[@reference_event] if DefaultEvents[@reference_event]
1426
+ @reference_event = m17n(@reference_event, nil, nil, term_options) if @reference_event.instance_of?(String)
1427
+ @reference_event._pool['..'] ||= self
1428
+ @_pool[@reference_event.to_s] = @reference_event
1429
+
1430
+ # options
1431
+ term_options[:options][:query] ||= {}
1432
+ @options ||= {}
1433
+ @options.update(term_options[:options][:query])
1434
+ @options.update({'area'=>@area, 'period'=>@period})
1435
+
1436
+ # epoch
1437
+ @epoch ||= epochs
1438
+ @epoch[0] ||= '-Infinity'
1439
+ @epoch[1] ||= '+Infinity'
1440
+ term_options[:options][:frame] ||= When::Gregorian
1441
+ epoch = ''
1442
+ @epoch = @epoch.map {|e|
1443
+ case e
1444
+ when ''
1445
+ When.when?('+Infinity')
1446
+ when String
1447
+ d, f = e.split(/\^{1,2}/)
1448
+ term_options[:options][:frame] = When.Resource(f, '_c:') if (f)
1449
+ d.split(/;/).each do |v|
1450
+ v.strip!
1451
+ if (v =~ /\A[-+\d]|^Now$|^Unknown$|^[-+]Infinity\z/i)
1452
+ epoch = v
1453
+ break
1454
+ end
1455
+ k, c = v.split(/\s*[:=]\s*/, 2)
1456
+ if (c.kind_of?(String))
1457
+ code = m17n(c.gsub(/%2C/,','), nil, nil, term_options)
1458
+ @_pool[code.to_s] ||= code
1459
+ @options[k] = term_options[:options][:query][k] = @_pool[code.to_s]
1460
+ else
1461
+ @options.delete(k)
1462
+ term_options[:options][:query].delete(k)
1463
+ end
1464
+ end
1465
+ When.when?(epoch, @options.merge({:frame=>term_options[:options][:frame], :validate=>:epoch}))
1466
+ else
1467
+ e
1468
+ end
1469
+ }
1470
+
1471
+ # normalize for last era
1472
+ last_era = _pool['..'].child[-1] if _pool['..'].kind_of?(CalendarEra)
1473
+ if last_era
1474
+ if last_era.epoch[0].indeterminated_position == When::TimeValue::Min
1475
+ last_era.epoch[0].frame = @epoch[0].frame
1476
+ last_era.epoch[1] = @epoch[0]
1477
+ last_era.send(:_normalize_leaf_era)
1478
+ elsif last_era.epoch[-1].indeterminated_position == When::TimeValue::Max
1479
+ last_era.epoch[-1] = @epoch[0]
1480
+ end
1481
+ end
1482
+ end
1483
+
1484
+ # 先端の暦年代の正規化
1361
1485
  def _normalize_leaf_era
1362
1486
  # r_date and others
1363
1487
  case @reference_date
@@ -1435,7 +1559,7 @@ module When::TM
1435
1559
  end
1436
1560
  end
1437
1561
 
1438
- # @private
1562
+ # 暦年代の検索表への登録
1439
1563
  def _register_calendar_era
1440
1564
  return unless @label.kind_of?(When::BasicTypes::M17n)
1441
1565
 
@@ -1488,11 +1612,11 @@ module When::TM
1488
1612
  end
1489
1613
 
1490
1614
  # インデクス登録
1491
- ((@area||{}).values + [nil]).each do |a|
1615
+ (_expand_sharp((@area||{}).values) + [nil]).each do |a|
1492
1616
  self.class[a] ||= {}
1493
- ((@period||{}).values + [nil]).each do |p|
1617
+ (_expand_sharp((@period||{}).values) + [nil]).each do |p|
1494
1618
  self.class[a][p] ||= {}
1495
- (@label.values + [nil]).each do |k|
1619
+ (_expand_sharp(@label.values) + [nil]).each do |k|
1496
1620
  self.class[a][p][k] ||= {}
1497
1621
  [@epoch_year, nil].each do |e|
1498
1622
  self.class[a][p][k][e] ||= []
@@ -1503,130 +1627,18 @@ module When::TM
1503
1627
  end
1504
1628
  end
1505
1629
 
1506
- private
1507
-
1508
- # オブジェクトの正規化
1509
- def _normalize(args=[], options={})
1510
- # area, period
1511
- term_options = {:namespace=>@namespace, :locale=>@locale, :options=>options}
1512
- @area = m17n(@area, nil, nil, term_options) if @area.instance_of?(String)
1513
- @period = m17n(@period, nil, nil, term_options) if @period.instance_of?(String)
1514
-
1515
- # 暦年代の上下限
1516
- @lower_bound = {}
1517
- @upper_bound = {}
1518
-
1519
- # other attributes
1520
- if @child && @child.length>0
1521
- _non_leaf_era(args, term_options)
1522
- _register_calendar_era unless _pool['..'].kind_of?(CalendarEra)
1523
- @child.each do |era|
1524
- era._register_calendar_era
1525
- end
1526
- else
1527
- _set_leaf_era(args, term_options)
1528
- _normalize_leaf_era unless @epoch[0].indeterminated_position == When::TimeValue::Min
1529
- end
1530
- end
1531
-
1532
- def _non_leaf_era(args, term_options)
1533
- @label = m17n(@label, nil, nil, term_options) if @label.instance_of?(String)
1534
- if @label
1535
- @label._pool['..'] = self # TODO ここを ||= にすると leaf? の判定がおかしくなる
1536
- @_pool[@label.to_s] = @label
1537
- end
1538
-
1539
- # reference_date, reference_event & label
1540
- @reference_date = @child[0].reference_date
1541
- @reference_event = @child[0].reference_event
1542
- @epoch_year = 0 # @child[0].epoch_year
1543
- @julian_reference = @child[0].julian_reference
1544
-
1545
- # options
1546
- @options ||= {}
1547
- @options.update({'area'=>@area, 'period'=>@period})
1548
-
1549
- # epoch
1550
- @epoch = []
1551
- @child.each do |c|
1552
- c.epoch.each do |e|
1553
- @epoch << e unless e == @epoch[-1]
1554
- end
1555
- end
1556
- end
1557
-
1558
- def _set_leaf_era(args, term_options)
1559
- # 変数の読み込み
1560
- reference_date, reference_event, *epochs = args
1561
-
1562
- # reference_date & label
1563
- if reference_date
1564
- @reference_date = reference_date
1565
- @label ||= m17n(@reference_date[/\A\[[^\]]+\]|^[^-+0-9]+/], nil, nil, term_options)
1566
- end
1567
- @label._pool['..'] ||= self
1568
- @_pool[@label.to_s] = @label
1569
-
1570
- # reference_event
1571
- @reference_event = reference_event if reference_event
1572
- @reference_event ||= ""
1573
- @reference_event = DefaultEvents[@reference_event] if DefaultEvents[@reference_event]
1574
- @reference_event = m17n(@reference_event, nil, nil, term_options) if @reference_event.instance_of?(String)
1575
- @reference_event._pool['..'] ||= self
1576
- @_pool[@reference_event.to_s] = @reference_event
1577
-
1578
- # options
1579
- term_options[:options][:query] ||= {}
1580
- @options ||= {}
1581
- @options.update(term_options[:options][:query])
1582
- @options.update({'area'=>@area, 'period'=>@period})
1583
-
1584
- # epoch
1585
- @epoch ||= epochs
1586
- @epoch[0] ||= '-Infinity'
1587
- @epoch[1] ||= '+Infinity'
1588
- term_options[:options][:frame] ||= When::Gregorian
1589
- epoch = ''
1590
- @epoch = @epoch.map {|e|
1591
- case e
1592
- when ''
1593
- When.when?('+Infinity')
1594
- when String
1595
- d, f = e.split(/\^{1,2}/)
1596
- term_options[:options][:frame] = When.Resource(f, '_c:') if (f)
1597
- d.split(/;/).each do |v|
1598
- v.strip!
1599
- if (v =~ /\A[-+\d]|^Now$|^Unknown$|^[-+]Infinity\z/i)
1600
- epoch = v
1601
- break
1602
- end
1603
- k, c = v.split(/\s*[:=]\s*/, 2)
1604
- if (c.kind_of?(String))
1605
- code = m17n(c.gsub(/%2C/,','), nil, nil, term_options)
1606
- @_pool[code.to_s] ||= code
1607
- @options[k] = term_options[:options][:query][k] = @_pool[code.to_s]
1608
- else
1609
- @options.delete(k)
1610
- term_options[:options][:query].delete(k)
1611
- end
1612
- end
1613
- When.when?(epoch, @options.merge({:frame=>term_options[:options][:frame], :validate=>:epoch}))
1630
+ # '#' つきの年号を '#'つきと'#'なしに展開する
1631
+ # また <...> や (..) の '<','(' と '>',')' を取り去ったものも登録する
1632
+ def _expand_sharp(list)
1633
+ list.map {|name|
1634
+ case name
1635
+ when /\A[\(<](.+)[\)>]\z/, /\A(.+)\?\z/
1636
+ [name, $1]
1614
1637
  else
1615
- e
1638
+ parts = name.split('#', 2)
1639
+ parts.size < 2 ? name : [name, parts.last]
1616
1640
  end
1617
- }
1618
-
1619
- # normalize for last era
1620
- last_era = _pool['..'].child[-1] if _pool['..'].kind_of?(CalendarEra)
1621
- if last_era
1622
- if last_era.epoch[0].indeterminated_position == When::TimeValue::Min
1623
- last_era.epoch[0].frame = @epoch[0].frame
1624
- last_era.epoch[1] = @epoch[0]
1625
- last_era._normalize_leaf_era
1626
- elsif last_era.epoch[-1].indeterminated_position == When::TimeValue::Max
1627
- last_era.epoch[-1] = @epoch[0]
1628
- end
1629
- end
1641
+ }.flatten
1630
1642
  end
1631
1643
 
1632
1644
  # 配下のオブジェクトの前後関係の設定
@@ -6,5 +6,5 @@
6
6
  =end
7
7
 
8
8
  module When
9
- VERSION = "0.3.8"
9
+ VERSION = "0.3.9"
10
10
  end
@@ -9,13 +9,13 @@ BEGIN:B:M17N
9
9
  NAMES:[Locations]
10
10
 
11
11
  BEGIN:CO:SPATIAL
12
- LABEL:[CentralIndia, インド中部]
12
+ LABEL:[CentralIndia=, インド中部=]
13
13
  LONG: +82.5
14
14
  LAT: N23.11
15
15
  END:CO:SPATIAL
16
16
 
17
17
  BEGIN:CO:SPATIAL
18
- LABEL:[NorthIndia, インド北部]
18
+ LABEL:[NorthIndia=, インド北部]
19
19
  LONG: +82.5
20
20
  LAT: +29.0
21
21
  END:CO:SPATIAL
@@ -171,7 +171,7 @@ BEGIN:B:M17N
171
171
  END:CO:SPATIAL
172
172
 
173
173
  BEGIN:CO:SPATIAL
174
- LABEL:[Ujjain, ウッジャイン]
174
+ LABEL:[Ujjain, ウッジャイン=]
175
175
  LONG: +75.8
176
176
  LAT: +23.2
177
177
  END:CO:SPATIAL
@@ -61,11 +61,12 @@ require './test/region/balinese'
61
61
  require './test/region/thai'
62
62
  require './test/region/indian'
63
63
  require './test/region/iran'
64
- require './test/region/mayan'
64
+ require './test/region/islamic'
65
65
  require './test/region/jewish'
66
66
  require './test/region/french'
67
67
  require './test/region/coptic'
68
68
  require './test/region/bahai'
69
+ require './test/region/mayan'
69
70
  require './test/region/discordian'
70
71
  require './test/region/zoroastrian'
71
72
  require './test/region/yerm'
@@ -197,12 +197,12 @@ module MiniTest::Coordinates
197
197
  Indian = [
198
198
  ["CentralIndia",
199
199
  "インド中部",
200
- "http://en.wikipedia.org/wiki/CentralIndia",
200
+ nil,
201
201
  23.15 + 1.0/30,
202
202
  82.5],
203
203
  ["NorthIndia",
204
204
  "インド北部",
205
- "http://en.wikipedia.org/wiki/NorthIndia",
205
+ nil,
206
206
  29.0,
207
207
  82.5],
208
208
  ["Agra",
@@ -143,7 +143,7 @@ module MiniTest
143
143
  assert_raises(ArgumentError) { When.when?('天保3(0563).10.01') }
144
144
 
145
145
  date = When.when?('始皇帝26*10.01')
146
- assert_equal([1640641, 1640641, "始皇帝26(-220)*10.01", "十月"],
146
+ assert_equal([1640641, 1640641, "<始皇帝>26(-220)*10.01", "十月"],
147
147
  [date.to_i, date.floor(When::YEAR).to_i, date.to_s, date.name('Month')])
148
148
 
149
149
  cc_221 = When.Resource('_c:Chinese_221')
@@ -223,7 +223,7 @@ module MiniTest
223
223
  assert_raises(ArgumentError) {When.when?('崇徳3.1.30', {'period'=>/後金/})}
224
224
  assert_equal("正徳16(1521).03.14", When.TemporalPosition("正徳", 16, 3, 14, {"period"=>/明/}).to_s)
225
225
  assert_equal("正徳16(1521).03.14", When.when?('正徳16.3.14', {'period'=>/明/}).to_s)
226
- assert_equal("明::崇禎11(1638).01.30", When.when?('崇禎11.1.30', {'period'=>/明/}).to_s)
226
+ assert_equal("中国::明::崇禎11(1638).01.30",When.when?('崇禎11.1.30', {'period'=>/明/}).to_s)
227
227
  end
228
228
  end
229
229
  end