when_exe 0.3.8 → 0.3.9

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