when_exe 0.4.2 → 0.5.0

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 (144) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE.ja.txt +8 -21
  3. data/LICENSE.txt +5 -27
  4. data/README.md +25 -79
  5. data/bin/.pryrc +9 -0
  6. data/bin/make_ttl.rb +3 -2
  7. data/bin/make_ttl.rb.config +3 -3
  8. data/lib/when_exe.rb +101 -5
  9. data/lib/when_exe/basictypes.rb +47 -16
  10. data/lib/when_exe/calendarnote.rb +27 -18
  11. data/lib/when_exe/calendartypes.rb +12 -50
  12. data/lib/when_exe/coordinates.rb +37 -391
  13. data/lib/when_exe/ephemeris.rb +53 -14
  14. data/lib/when_exe/ephemeris/eclipse.rb +8 -8
  15. data/lib/when_exe/ephemeris/moon.rb +333 -333
  16. data/lib/when_exe/ephemeris/notes.rb +29 -17
  17. data/lib/when_exe/ephemeris/phase_table.rb +825 -0
  18. data/lib/when_exe/ephemeris/term_table.rb +603 -0
  19. data/lib/when_exe/events.rb +1888 -0
  20. data/lib/when_exe/google_api.rb +26 -31
  21. data/lib/when_exe/icalendar.rb +129 -12
  22. data/lib/when_exe/inspect.rb +5 -5
  23. data/lib/when_exe/linkeddata.rb +43 -23
  24. data/lib/when_exe/locales/akt.rb +63 -0
  25. data/lib/when_exe/locales/encoding_conversion.rb +134 -134
  26. data/lib/when_exe/locales/iast.rb +90 -90
  27. data/lib/when_exe/locales/locale.rb +88 -18
  28. data/lib/when_exe/locales/transliteration_table.rb +62 -62
  29. data/lib/when_exe/mini_application.rb +14 -8
  30. data/lib/when_exe/namespace.rb +42 -0
  31. data/lib/when_exe/parts/enumerator.rb +16 -5
  32. data/lib/when_exe/parts/geometric_complex.rb +52 -2
  33. data/lib/when_exe/parts/method_cash.rb +229 -224
  34. data/lib/when_exe/parts/resource.rb +65 -35
  35. data/lib/when_exe/parts/timezone.rb +25 -34
  36. data/lib/when_exe/region/balinese.rb +5 -3
  37. data/lib/when_exe/region/chinese.rb +39 -11
  38. data/lib/when_exe/region/chinese/calendars.rb +1016 -1016
  39. data/lib/when_exe/region/chinese/epochs.rb +7 -7
  40. data/lib/when_exe/region/chinese/notes.rb +3 -3
  41. data/lib/when_exe/region/chinese/twins.rb +134 -11
  42. data/lib/when_exe/region/dee.rb +4 -4
  43. data/lib/when_exe/region/discordian.rb +1 -1
  44. data/lib/when_exe/region/geologicalage.rb +139 -128
  45. data/lib/when_exe/region/hanke_henry.rb +4 -4
  46. data/lib/when_exe/region/indian.rb +77 -8
  47. data/lib/when_exe/region/international_fixed.rb +3 -3
  48. data/lib/when_exe/region/islamic.rb +1 -1
  49. data/lib/when_exe/region/japanese.rb +12 -8
  50. data/lib/when_exe/region/japanese/calendars.rb +397 -397
  51. data/lib/when_exe/region/japanese/eclipses.rb +1194 -1194
  52. data/lib/when_exe/region/japanese/epochs.rb +8 -4
  53. data/lib/when_exe/region/japanese/location.rb +93 -0
  54. data/lib/when_exe/region/japanese/nihon_shoki.rb +70 -70
  55. data/lib/when_exe/region/japanese/notes.rb +57 -18
  56. data/lib/when_exe/region/japanese/residues.rb +33 -11
  57. data/lib/when_exe/region/japanese/twins.rb +27 -14
  58. data/lib/when_exe/region/japanese/weeks.rb +7 -7
  59. data/lib/when_exe/region/korean.rb +384 -384
  60. data/lib/when_exe/region/location.rb +40 -0
  61. data/lib/when_exe/region/martian.rb +1 -1
  62. data/lib/when_exe/region/mayan.rb +2 -2
  63. data/lib/when_exe/region/roman.rb +2 -2
  64. data/lib/when_exe/region/ryukyu.rb +101 -101
  65. data/lib/when_exe/region/saudi_arabian.rb +57 -0
  66. data/lib/when_exe/region/shire.rb +1 -1
  67. data/lib/when_exe/region/world.rb +3 -3
  68. data/lib/when_exe/region/zoroastrian.rb +1 -1
  69. data/lib/when_exe/spatial.rb +611 -0
  70. data/lib/when_exe/timestandard.rb +9 -7
  71. data/lib/when_exe/tmobjects.rb +34 -2
  72. data/lib/when_exe/tmposition.rb +225 -1322
  73. data/lib/when_exe/tmptypes.rb +1279 -0
  74. data/lib/when_exe/tmreference.rb +42 -7
  75. data/lib/when_exe/version.rb +3 -3
  76. data/test/events/example-datasets +6 -0
  77. data/test/events/history-dataset.csv +22 -0
  78. data/test/events/japanese-holiday-index.csv +28 -0
  79. data/test/events/japanese-holiday.csv +94 -0
  80. data/test/events/japanese-holiday.ttl +948 -0
  81. data/test/events/make_events_ttl.rb +18 -0
  82. data/test/events/mori_wikichoshi.csv +14 -0
  83. data/test/events/ndl_koyomi.csv +220 -0
  84. data/test/events/ndl_koyomi_index.csv +44 -0
  85. data/test/events/primeminister-dataset.csv +19 -0
  86. data/test/events/shogun-dataset.csv +22 -0
  87. data/test/events/test-history-dataset-edge-sparql.csv +26 -0
  88. data/test/events/test-history-dataset-edge.csv +27 -0
  89. data/test/events/test-history-dataset-sparql.csv +22 -0
  90. data/test/events/test-history-dataset.csv +23 -0
  91. data/test/events/test-history-events-edge.ttl +89 -0
  92. data/test/events/test-history-events.csv +6 -0
  93. data/test/examples/JapanHolidays.ics +2 -2
  94. data/test/examples/JapanHolidaysRFC6350.ics +3 -3
  95. data/test/examples/Residue.m17n +2 -2
  96. data/test/examples/Spatial.m17n +3 -3
  97. data/test/examples/Terms.m17n +3 -3
  98. data/test/scripts/8.ext.rb +6 -6
  99. data/test/scripts/8.rb +6 -6
  100. data/test/scripts/geometric_complex.rb +41 -41
  101. data/test/scripts/korea.rb +59 -59
  102. data/test/scripts/thai.rb +36 -36
  103. data/test/test.rb +6 -0
  104. data/test/test/basictypes.rb +431 -431
  105. data/test/test/calendarnote.rb +86 -86
  106. data/test/test/calendartypes.rb +97 -97
  107. data/test/test/coordinates.rb +399 -397
  108. data/test/test/ephemeris.rb +115 -115
  109. data/test/test/ephemeris/moon.rb +14 -14
  110. data/test/test/ephemeris/planets.rb +14 -14
  111. data/test/test/ephemeris/sun.rb +14 -14
  112. data/test/test/events.rb +32 -0
  113. data/test/test/google_api.rb +45 -32
  114. data/test/test/inspect.rb +153 -153
  115. data/test/test/parts.rb +488 -488
  116. data/test/test/region/armenian.rb +20 -20
  117. data/test/test/region/bahai.rb +58 -58
  118. data/test/test/region/balinese.rb +34 -34
  119. data/test/test/region/chinese.rb +229 -229
  120. data/test/test/region/christian.rb +226 -226
  121. data/test/test/region/coptic.rb +27 -27
  122. data/test/test/region/discordian.rb +20 -20
  123. data/test/test/region/french.rb +33 -33
  124. data/test/test/region/geologicalage.rb +17 -17
  125. data/test/test/region/indian.rb +14 -1
  126. data/test/test/region/iran.rb +54 -54
  127. data/test/test/region/islamic.rb +64 -54
  128. data/test/test/region/japanese.rb +281 -261
  129. data/test/test/region/jewish.rb +63 -63
  130. data/test/test/region/m17n.rb +21 -21
  131. data/test/test/region/mayan.rb +17 -16
  132. data/test/test/region/reforms.rb +2 -2
  133. data/test/test/region/residue.rb +7 -7
  134. data/test/test/region/shire.rb +58 -58
  135. data/test/test/region/swedish.rb +45 -45
  136. data/test/test/region/thai.rb +116 -116
  137. data/test/test/region/tibetan.rb +30 -30
  138. data/test/test/region/vietnamese.rb +102 -102
  139. data/test/test/region/zoroastrian.rb +58 -58
  140. data/test/test/timestandard.rb +81 -81
  141. data/test/test/tmobjects.rb +402 -402
  142. data/test/test/tmposition.rb +66 -4
  143. data/test/test/tmreference.rb +157 -157
  144. metadata +36 -93
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2015 Takashi SUGA
3
+ Copyright (C) 2015-2021 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -8,7 +8,8 @@
8
8
  #
9
9
  # GoogleAPI の Calendar API v3 への対応
10
10
  #
11
- # see {Google Calendar API Reference https://developers.google.com/google-apps/calendar/v3/reference/}
11
+ # see {Ruby Quickstart https://developers.google.com/calendar/quickstart/ruby}
12
+ # see {Simple REST client for version V3 of the Calendar API https://googleapis.dev/ruby/google-apis-calendar_v3/v0.1.0/}
12
13
  #
13
14
  module When::GoogleAPI
14
15
 
@@ -17,15 +18,9 @@ module When::GoogleAPI
17
18
  #
18
19
  class Calendar
19
20
 
20
- # APIClient のインスタンス
21
- #
22
- # @return [Google::APIClient]
23
- #
24
- attr_reader :client
25
-
26
21
  # Calendar API のインスタンス
27
22
  #
28
- # @return [Google::APIClient::API]
23
+ # @return [Google::Apis::CalendarV3::CalendarService]
29
24
  #
30
25
  attr_reader :service
31
26
 
@@ -45,24 +40,19 @@ module When::GoogleAPI
45
40
  #
46
41
  # GoogleAPI の Calendar を生成する
47
42
  #
48
- # @param [Google::APIClient] client
49
- # @param [Google::APIClient::API] service
43
+ # @param [Google::Apis::CalendarV3::CalendarService] service
50
44
  # @param [String] calendar_id
51
45
  #
52
- def list(client, service, calendar_id)
46
+ def list(service, calendar_id)
53
47
  events = []
54
- result = client.execute({:api_method => service.events.list,
55
- :parameters => {'calendarId' => calendar_id}})
48
+ result = service.list_events(calendar_id)
56
49
  loop do
57
- events += result.data.items.map {|event| event.to_hash}
58
- page_token = result.data.next_page_token
50
+ events += result.items.map {|event| event.to_h}
51
+ page_token = result.next_page_token
59
52
  break unless page_token
60
- result = client.execute({:api_method => service.events.list,
61
- :parameters => {'calendarId' => calendar_id,
62
- 'pageToken' => page_token}})
53
+ result = service.list_events(calendar_id, page_token: page_token)
63
54
  end
64
55
  calendar = new(events)
65
- calendar.instance_variable_set(:@client, client)
66
56
  calendar.instance_variable_set(:@service, service)
67
57
  calendar.instance_variable_set(:@calendar_id, calendar_id)
68
58
  calendar
@@ -87,7 +77,7 @@ module When::GoogleAPI
87
77
  #
88
78
  def initialize(events)
89
79
  @events = events.map {|event|
90
- next nil unless event['status'] == 'confirmed'
80
+ next nil unless event[:status] == 'confirmed'
91
81
  When::V::Event.new(event)
92
82
  }.compact
93
83
  end
@@ -114,15 +104,18 @@ class When::V::Event
114
104
  iprops = {}
115
105
  gprops.each_pair do |key, value|
116
106
  case key
117
- when 'summary'
118
- iprops['summary'] = value
119
- when 'start', 'end'
107
+ when :start, :end
120
108
  date = 'VALUE=DATE'
121
- date += '-TIME' if value.key?('dateTime')
122
- date += ';TZID=' + value['timeZone'] if value.key?('timeZone')
123
- date += ':' + (value['date'] || value['dateTime'])
124
- iprops['dt' + key] = date
125
- when 'recurrence'
109
+ if value.key?(:date)
110
+ date += ':' + value[:date].strftime('%Y%m%d')
111
+ else
112
+ date += '-TIME'
113
+ date += ':' + value[:date_time].strftime('%Y%m%dT%H%M%S')
114
+ date += value[:date_time].strftime('%z') unless value[:time_zone]
115
+ end
116
+ date.sub!(':', ";TZID=#{value[:time_zone]}:") if value.key?(:time_zone)
117
+ iprops['dt' + key.to_s] = date
118
+ when :recurrence
126
119
  value.map do |line|
127
120
  tag, rule = line.split(':', 2)
128
121
  tag.downcase!
@@ -132,8 +125,10 @@ class When::V::Event
132
125
  iprops[tag] = rule
133
126
  end
134
127
  end
135
- when 'iCalUID'
128
+ when :i_cal_uid
136
129
  iprops['uid'] = value
130
+ when Symbol
131
+ iprops[key.to_s] = value
137
132
  end
138
133
  end
139
134
  iprops
@@ -144,7 +139,7 @@ class When::V::Event
144
139
 
145
140
  # Hash からの属性読み込み
146
141
  def _parse_from_code(options)
147
- if options.key?('start')
142
+ if options.key?(:start)
148
143
  @google_api_props = options
149
144
  options = self.class.gcal2ical(options)
150
145
  end
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2011-2015 Takashi SUGA
3
+ Copyright (C) 2011-2021 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -528,6 +528,17 @@ module When::V
528
528
  'resources', 'rdate']]
529
529
  # Classes = [V::Root, V::Alarm]
530
530
 
531
+ RegisteredNotes = {
532
+ 'term' => 'SolarTerms',
533
+ 'phase' => 'LunarPhases',
534
+ 'easter' => 'Christian',
535
+ 'christmas' => 'Christian'
536
+ }
537
+
538
+ RegisteredNoteMethods = /\A(#{RegisteredNotes.keys.sort.reverse.join('|')})/
539
+
540
+ DayOfWeek = %w(SU MO TU WE TH FR SA)
541
+
531
542
  class << self
532
543
  include When::Parts::Resource::Pool
533
544
 
@@ -563,7 +574,102 @@ module When::V
563
574
  #
564
575
  # @return [When::TM::IntervalLength]
565
576
  def default_until
566
- @default_until ||= 1000*When::TM::Duration::YEAR
577
+ @default_until ||= 1000*(When::TM::Duration::YEAR / When::TM::Duration::DAY)
578
+ end
579
+
580
+ # ISO8601へ埋め込まれた指定に対応する iterator を生成する
581
+ #
582
+ # @param [When::TM::TemporalPosition] base イベントの始点
583
+ # @param [When::TM::Duration] duration イベントの期間
584
+ # @param [Hash] delayed_options 遅延適用するオブジェクト変換オプション
585
+ #
586
+ # @return [When::Parts::Enumerator]
587
+ #
588
+ def iterator_for_ISO8601(base, duration, delayed_options)
589
+ duration.to_s =~ /\A-?P(\d+)([YM])\z/
590
+ event_options = {'rrule'=>
591
+ case $2
592
+ when 'Y' ; {'FREQ'=>'YEARLY', 'INTERVAL'=>$1.to_i}
593
+ when 'M' ; {'FREQ'=>'MONTHLY', 'INTERVAL'=>$1.to_i}
594
+ else ; duration ? {'FREQ'=>duration.set_repeat(false).abs} : {'FREQ'=>'YEARLY'}
595
+ end
596
+ }
597
+ residue_options = delayed_options[:residue]
598
+ frame_len = base.frame.indices.length
599
+ if residue_options
600
+ event_options['rrule'].update(_byyear(residue_options.delete(frame_len-2))) if residue_options[frame_len-2]
601
+ event_options['rrule'].update(_byday(residue_options.delete(frame_len) )) if residue_options[frame_len]
602
+ delayed_options.delete(:residue)
603
+ end
604
+ if base.precision == When::MONTH && event_options['rrule']['FREQ'] == 'YEARLY'
605
+ event_options['rrule'].update({'BYMONTH'=>base[When::MONTH]})
606
+ base = base.floor if event_options['rrule']['BYMONTHDAY']
607
+ end
608
+ case base
609
+ when When::TM::TemporalPosition ; event_options.update({'dtstart' =>base})
610
+ else ; event_options.update({'dtstart' =>base.first,
611
+ 'duration' =>base.last-base.first})
612
+ end
613
+ event_options['duration'] = delayed_options.delete(:duration) if delayed_options[:duration]
614
+ behavior_options = {'1st'=>delayed_options.delete(:first) || "don't care"}
615
+ behavior_options[:delayed] = delayed_options unless delayed_options.empty?
616
+ behavior_options[:direction] = :reverse if duration && duration.sign < 0
617
+ return new(event_options).enum_for(event_options['dtstart'], behavior_options)
618
+ end
619
+
620
+ private
621
+
622
+ # オブジェクト変換オプションの遅延適用のBYYEAR要素
623
+ #
624
+ def _byyear(operation)
625
+ {'BYYEAR'=>_to_ical_hash(When.Residue(operation), 'year', 4)}
626
+ end
627
+
628
+ # オブジェクト変換オプションの遅延適用のBYDAY要素
629
+ #
630
+ def _byday(operation)
631
+ return {'BYDAY'=>_to_ical_hash(operation, 'day', 11)} if operation.kind_of?(When::Coordinates::Residue)
632
+
633
+ residues = []
634
+ result = {}
635
+ byday = {}
636
+
637
+ # イベント、日付
638
+ operation.split('&').each do |element|
639
+ element.strip!
640
+ case element
641
+ when RegisteredNoteMethods ; byday.update({nil=>element})
642
+ when /\A(.+?)#(.+)\z/ ; byday.update({$1=>$2})
643
+ when /\A[-+,\d]+\z/ ; result['BYMONTHDAY'] = element
644
+ else ; residues << element
645
+ end
646
+ end
647
+
648
+ # 剰余類
649
+ unless residues.empty?
650
+ residue = residues.join('&')
651
+ if residue =~ /\A[-+]?\d*(MO|TU|WE|TH|FR|SA|SU)\z/
652
+ result['BYWEEKDAY'] = residue
653
+ else
654
+ resource = When.Residue(residue)
655
+ if resource
656
+ byday.update(_to_ical_hash(resource, 'day', 11))
657
+ else
658
+ result['BYWEEKDAY'] = residue
659
+ end
660
+ end
661
+ end
662
+
663
+ result['BYDAY'] = byday unless byday.empty?
664
+ return result
665
+ end
666
+
667
+ # 剰余のハッシュ化
668
+ def _to_ical_hash(residue, unit, offset)
669
+ operation = ''
670
+ operation << "#{residue.carry < 0 ? residue.carry : residue.carry+1}*" if residue.shifted
671
+ operation << "#{(residue.remainder-offset+residue.units[unit]) % residue.divisor}"
672
+ {residue.divisor=>operation}
567
673
  end
568
674
  end
569
675
 
@@ -941,13 +1047,13 @@ module When::V
941
1047
  super
942
1048
 
943
1049
  @child.each do |prop|
944
- @dtstart = prop.dtstart if (@dtstart==nil || prop.dtstart < @dtstart)
1050
+ @dtstart = prop.dtstart if (@dtstart.nil? || prop.dtstart < @dtstart)
945
1051
  @dtstop = prop.dtstop unless (prop.dtstop.kind_of?(When::TimeValue) &&
946
1052
  @dtstop.kind_of?(When::TimeValue) &&
947
1053
  prop.dtstop <= @dtstop)
948
1054
  [prop.tzoffsetfrom, prop.tzoffsetto].each do |tz|
949
- @daylight = tz if (@daylight==nil || tz.universal_time < @daylight.universal_time)
950
- @standard = tz if (@standard==nil || tz.universal_time > @standard.universal_time)
1055
+ @daylight = tz if (@daylight.nil? || tz.universal_time < @daylight.universal_time)
1056
+ @standard = tz if (@standard.nil? || tz.universal_time > @standard.universal_time)
951
1057
  end
952
1058
  end
953
1059
  @tz_difference = @standard.universal_time - @daylight.universal_time
@@ -1001,7 +1107,7 @@ module When::V
1001
1107
  date = prop.enum_for(current_time, direction, 1).succ
1002
1108
  if (date)
1003
1109
  diff = (date.universal_time - current_time).abs
1004
- if (minimum == nil || minimum > diff)
1110
+ if (minimum.nil? || minimum > diff)
1005
1111
  event = date
1006
1112
  minimum = diff
1007
1113
  end
@@ -1065,6 +1171,7 @@ module When::V
1065
1171
  @options = When::Parts::Enumerator._options(args)
1066
1172
  @exdate = @options.delete(:exdate)
1067
1173
  @exevent = @options.delete(:exevent)
1174
+ @delayed = @options.delete(:delayed)
1068
1175
  @parent, @rule, @dtstart, @duration, *rest = args
1069
1176
  @dtstart = When.when?(@dtstart)
1070
1177
  @rule = self.class._decode_rule(@rule, @dtstart) if (@rule.kind_of?(String))
@@ -1267,7 +1374,7 @@ module When::V
1267
1374
  position = rule[(by_part == 'BYYEAR') ? 'YEARPOS' : 'DAYPOS'][ref]
1268
1375
  start = rule[(by_part == 'BYYEAR') ? 'YEARST' : 'DAYST' ][ref]
1269
1376
  rule[by_part][ref] = ((ref.to_i==0) ? Logic::Enumerator :
1270
- Logic::Residue).new(by_part, list, position, ref, start)
1377
+ Logic::Residue).new(by_part, list, position, ref, start, dtstart)
1271
1378
  end
1272
1379
  end
1273
1380
  end
@@ -1295,7 +1402,7 @@ module When::V
1295
1402
  if (dtstart && dtstart.has_time?)
1296
1403
  ['HOUR', 'MINUTE', 'SECOND'].each do |part|
1297
1404
  by_part = 'BY' + part
1298
- if (rule[by_part]==nil && freq_index && freq_index < PostFreqIndex[by_part])
1405
+ if (rule[by_part].nil? && freq_index && freq_index < PostFreqIndex[by_part])
1299
1406
  base = dtstart[PostFreqIndex[by_part]]
1300
1407
  rule[by_part] = Logic.const_get(part.capitalize).new(by_part, base) unless (base == 0)
1301
1408
  end
@@ -1457,7 +1564,7 @@ module When::V
1457
1564
  end
1458
1565
 
1459
1566
  # @private
1460
- def initialize(by_part, list, position, ref, start)
1567
+ def initialize(by_part, list, position, ref, start, dtstart)
1461
1568
  @by_part = by_part
1462
1569
  divisor = When::Coordinates::Pair._en_number(ref)
1463
1570
  @list = list.split(/,/).map {|w|
@@ -1497,7 +1604,7 @@ module When::V
1497
1604
  nth, spec, period = ord
1498
1605
  shift = (period[PostFreqIndex[@by_part]] != 0)
1499
1606
  raise ArgumentError, "n*e+/-s format not permitted" if (nth || shift) && @freq_index >= When::DAY
1500
- if (nth==nil || nth>0)
1607
+ if (nth.nil? || nth>0)
1501
1608
  enum = @ref.enum_for(lower_bound, :forward, {:event=>spec})
1502
1609
  else
1503
1610
  enum = @ref.enum_for(higher_bound, :reverse, {:event=>spec})
@@ -1519,9 +1626,19 @@ module When::V
1519
1626
  end
1520
1627
 
1521
1628
  # @private
1522
- def initialize(by_part, list, position, ref, start)
1629
+ def initialize(by_part, list, position, ref, start, dtstart)
1523
1630
  @by_part = by_part
1524
- @ref = When.Resource(ref, '_n:')
1631
+ @ref =
1632
+ if ref
1633
+ When.Resource(ref, '_n:')
1634
+ else
1635
+ method = list[/\A[^-+\d]+/]
1636
+ if dtstart.frame.note.respond_to?(method)
1637
+ dtstart.frame.note
1638
+ else
1639
+ When.Resource(When::V::Event::RegisteredNotes[method], '_n:')
1640
+ end
1641
+ end
1525
1642
  @start = start
1526
1643
  @list = list.split(/,/).map {|w|
1527
1644
  raise ArgumentError, "The #{by_part} rule format error" unless w =~ /\A(([-+]?\d+)\*)?(.+?)([-+]\d+)?\z/
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2011-2015 Takashi SUGA
3
+ Copyright (C) 2011-2021 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -75,7 +75,7 @@ module When
75
75
  # @return [String] to_h 結果を JSON文字列化したもの
76
76
  #
77
77
  def to_json(options={})
78
- options[:method] = :to_m17n unless options.key?(:method)
78
+ options[:method] = :to_m17n unless options.respond_to?(:key?) && options.key?(:method)
79
79
  JSON.dump(to_h(options))
80
80
  end
81
81
 
@@ -603,7 +603,7 @@ module When
603
603
  form_options[:method] = :to_m17n unless form_options.key?(:method)
604
604
  persistence = options.delete(:persistence) if options.kind_of?(Hash)
605
605
  retrieved = When::CalendarNote::NotesContainer.retrieve(persistence, self.to_i)
606
- return retrieved unless retrieved == false
606
+ return retrieved if retrieved
607
607
  When::CalendarNote::NotesContainer.register(_m17n_form(_notes(options), form_options), persistence, self.to_i)
608
608
  end
609
609
 
@@ -773,7 +773,7 @@ module When
773
773
  # @return [String]
774
774
  #
775
775
  def _to_uri(date)
776
- (date.gsub(/\./, '-').gsub(/%/, '@') + caret_frame).
776
+ (date.gsub(/%/, '@').sub(/(\d{2}:\d{2}:\d{2})\.(\d+)/, '\1%2E\2').gsub(/\./, '-') + caret_frame).
777
777
  gsub(When::Parts::Resource::IRIEncode) {|c| When::Parts::Resource::IRIEncodeTable[c]}
778
778
  end
779
779
 
@@ -1460,7 +1460,7 @@ module When
1460
1460
  # 出力に使用する clk_time の作成
1461
1461
  def _clk_time_for_inspect(precision)
1462
1462
  return @clk_time unless precision && precision > When::DAY
1463
- base = self + When::TM::Duration.new(@clk_time.frame._round_value(precision))
1463
+ base = self + When::TM::PeriodDuration.new(0.5, precision)
1464
1464
  base.clk_time.clk_time[When::HOUR] = @clk_time.clk_time[When::HOUR] + 1 unless self.to_i == base.to_i
1465
1465
  return base.clk_time
1466
1466
  end
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2014-2015 Takashi SUGA
3
+ Copyright (C) 2014-2021 Takashi SUGA
4
4
 
5
5
  You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
6
  =end
@@ -15,6 +15,7 @@ module When
15
15
 
16
16
  Schema = {
17
17
  'reference' => "Locale#reference-instance_method",
18
+ 'dbpedia' => "Locale#dbpedia-instance_method",
18
19
  'label' => "BasicTypes/M17n#label-instance_method",
19
20
  'prev' => "TM/TemporalPosition#prev-instance_method",
20
21
  'succ' => "TM/TemporalPosition#succ-instance_method",
@@ -23,7 +24,6 @@ module When
23
24
  'coordinate' => "TM/CalDate#cal_date-instance_method",
24
25
  'sdn' => "TM/CalDate#to_i-instance_method",
25
26
  'calendarEra' => "TM/CalDate#calendar_era-instance_method",
26
- 'referenceEvent' => "TM/Clock#reference_event-instance_method",
27
27
  'referenceTime' => "TM/Clock#reference_time-instance_method",
28
28
  'utcReference' => "TM/Clock#utc_reference-instance_method",
29
29
  'dateBasis' => "TM/Clock#date_basis-instance_method",
@@ -40,12 +40,19 @@ module When
40
40
  'latitude' => "Coordinates/Spatial#latitude-instance_method",
41
41
  'altitide' => "Coordinates/Spatial#latitude-instance_method",
42
42
  'event' => "CalendarNote#event-instance_method",
43
+ 'note' => "CalendarNote/NoteElement",
44
+ 'id' => "Events/Event#id-instance_method",
45
+ 'group' => "Events/Event#group-instance_method",
46
+ 'start' => "Events/Range#start-instance_method",
47
+ 'until' => "Events/Range#until-instance_method",
48
+ 'west' => "Coordinates/Spatial/Range#west-instance_method",
49
+ 'east' => "Coordinates/Spatial/Range#east-instance_method",
50
+ 'south' => "Coordinates/Spatial/Range#south-instance_method",
51
+ 'north' => "Coordinates/Spatial/Range#north-instance_method",
52
+ 'bottom' => "Coordinates/Spatial/Range#bottom-instance_method",
53
+ 'top' => "Coordinates/Spatial/Range#top-instance_method"
43
54
  }
44
55
 
45
- XSD = 'http://www.w3.org/2001/XMLSchema'
46
- RDFS = 'http://www.w3.org/2000/01/rdf-schema#'
47
- RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
48
-
49
56
  #
50
57
  # @private
51
58
  #
@@ -85,8 +92,9 @@ module When
85
92
  def schema(iri=nil)
86
93
  ts = base_uri.sub(/When\/$/, 'ts#')
87
94
  hash =
88
- {'@context'=>{'ts' => ts},
89
- '@graph' => Schema.keys.map {|id| {'@id'=>'ts:'+id, 'ts:reference'=>{'@id'=>DocRoot + Schema[id]}}}
95
+ {'@context'=>{'rdf'=>When::Namespace::RDF, 'ts' => ts},
96
+ '@graph' => Schema.keys.map {|id| {'@id'=>'ts:'+id, 'rdf:type'=>{'@id'=>'rdf:Property'},
97
+ 'ts:reference'=>{'@id'=>DocRoot + Schema[id]}}}
90
98
  }
91
99
  bless(hash, iri || ts[0..-2])
92
100
  end
@@ -117,7 +125,7 @@ module When
117
125
  JSON.generate(jsonld_hash)
118
126
  else
119
127
  array = JSON::LD::API.toRdf(jsonld_hash)
120
- graph = ::RDF::Graph.new << array
128
+ graph = RDF::Graph.new << array
121
129
  args = [writer]
122
130
  args << {:prefixes=>prefixes} if prefixes
123
131
  graph.dump(*args)
@@ -162,13 +170,13 @@ module When
162
170
  def namespace_prefixes(*resources)
163
171
  base = base_uri.sub(/When\/$/, '')
164
172
  resources.inject({
165
- 'xsd' => [XSD],
166
- 'rdf' => [RDF],
167
- 'rdfs' => [RDFS],
168
- 'owl' => ['http://www.w3.org/2002/07/owl#'],
169
- 'dc' => ['http://purl.org/dc/elements/1.1/'],
170
- 'dcq' => ['http://purl.org/dc/terms/'],
171
- 'dct' => ['http://purl.org/dc/dcmitype/'],
173
+ 'xsd' => [When::Namespace::XSD ],
174
+ 'rdf' => [When::Namespace::RDF ],
175
+ 'rdfs' => [When::Namespace::RDFS],
176
+ 'owl' => [When::Namespace::OWL ],
177
+ 'dc' => [When::Namespace::DC ],
178
+ 'dcq' => [When::Namespace::DCQ ],
179
+ 'dct' => [When::Namespace::DCT ],
172
180
  # 'tp' => [base + 'tp/'],
173
181
  'ts' => [base + 'ts#']
174
182
  }) {|namespace, resource|
@@ -315,6 +323,8 @@ module When
315
323
  hash[key] = value if /^@/ =~ key.to_s
316
324
  end
317
325
  hash[RDF + 'type'] = {'@id'=>base + 'ts/' + self.class.to_s.gsub(/::/, '/')}
326
+ hash[RDFS + 'subPropertyOf'] = {'@id'=>base + 'ts#note'} if kind_of?(When::CalendarNote::NoteElement) ||
327
+ kind_of?(When::Parts::Resource) && /\/notes\// =~ iri && !leaf?
318
328
  if options[:context]
319
329
  options[:prefixes] ||= When::Parts::Resource.namespace_prefixes
320
330
  context = hash['@context'] || {}
@@ -369,18 +379,20 @@ module When
369
379
  # namespace を prefix にコンパクト化する
370
380
  #
371
381
  def compact_namespace_to_prefix(source, prefixes, context=nil)
382
+ return source.map {|element| compact_namespace_to_prefix(element, prefixes, context)} if source.kind_of?(Array)
372
383
  return source unless prefixes
373
384
  prefixes.each_pair do |key, value|
374
- Array(value).each do |prefix|
375
- start = source.index(prefix)
376
- body = source[prefix.length..-1]
385
+ Array(value).each do |namespace|
386
+ namespace = namespace.sub(/([a-z0-9])\z/i, '\1#')
387
+ start = source.index(namespace)
388
+ body = source[namespace.length..-1]
377
389
  return key + ':' + body if start == 0 && body !~ /[:#\/]/
378
390
  end
379
391
  end
380
392
  return source unless context
381
393
  source =~ /\A((.+)([:#\/]))([^:#\/]+)\z/
382
394
  namespace, item = $1.to_s, $4
383
- if namespace =~ /^Ahttp:\/\/([^.]+)\.wikipedia\.org/
395
+ if namespace =~ /^Ahttps?:\/\/([^.]+)\.wikipedia\.org/
384
396
  prefix = "wiki_#{$1}"
385
397
  elsif namespace && namespace.index(When::Parts::Resource.base_uri) == 0
386
398
  label = begin When.Resource(namespace.sub(/::\z/, '')) rescue return source end
@@ -421,7 +433,8 @@ module When
421
433
  hash = {}
422
434
  hash[RDFS + 'label'] = names.keys.map {|key| key=='' ? names[key] : {'@language'=>key, '@value'=>names[key]}}
423
435
  hash[ts + 'label'] = label
424
- hash[ts + 'reference'] = link.values.map {|ref| {'@id'=>ref}}
436
+ hash[ts + 'reference'] = link.values.uniq.map {|ref| {'@id'=>ref}}
437
+ hash[ts + 'dbpedia'] = link.values.uniq.map {|ref| Locale._dbpedia(ref)}.compact.map {|uri| {'@id'=>uri}}
425
438
  hash
426
439
  end
427
440
  end
@@ -458,7 +471,7 @@ module When
458
471
  #
459
472
  def to_uri_linkeddata(*args)
460
473
  date, frame = _to_uri(to_s(*args)).split('^^', 2)
461
- frame += '_' if frame =~ /\d\z/
474
+ frame += '_' if /\d\z/ =~ frame
462
475
  date = "#{frame}(#{date})" if frame
463
476
  When::Parts::Resource.base_uri.sub(/When\/$/, 'tp/') + date
464
477
  end
@@ -562,7 +575,14 @@ module When
562
575
  value =_value_str(note[:note], note[:value])
563
576
  end
564
577
  id = compact_namespace_to_prefix(value, options[:prefixes], context)
565
- hash[compact_namespace_to_prefix(_note_str(note[:note]), options[:prefixes], context)] = (id == value && id !~ /:\/\//) ? id : {'@id'=>id}
578
+ if id.kind_of?(Array)
579
+ (0...id.length).each do |i|
580
+ id[i] = {'@id'=>id[i]} unless id[i] == value[i] && id[i] !~ /:\/\//
581
+ end
582
+ else
583
+ id = {'@id'=>id} unless id == value && id !~ /:\/\//
584
+ end
585
+ hash[compact_namespace_to_prefix(_note_str(note[:note]), options[:prefixes], context)] = id
566
586
  end
567
587
  hash
568
588
  end