when_exe 0.4.2 → 0.5.0

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