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) 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
@@ -28,7 +28,7 @@ module When
28
28
 
29
29
  # 省略時 Namespace
30
30
  DefaultNamespaces = Hash.new {|hash, key|
31
- hash[key] = "http://#{key}.wikipedia.org/wiki/"
31
+ hash[key] = "https://#{key}.wikipedia.org/wiki/"
32
32
  }.update({
33
33
  'mailto' => false,
34
34
  'https' => false,
@@ -57,12 +57,16 @@ module When
57
57
 
58
58
  # Wikipedia の URL の正規表現
59
59
  # @private
60
- Ref = /\Ahttp:\/\/(.+?)\.wikipedia\.org\/wiki\/([^#]+?)\z/
60
+ Ref = /\Ahttps?:\/\/(.+?)\.wikipedia\.org\/wiki\/([^#]+?)\z/
61
61
 
62
62
  # Wikipedia の多言語リンクの正規表現
63
63
  # @private
64
64
  Link = /<li class="interlanguage-link interwiki-(.+?)"><a href="\/\/(.+?)\.wikipedia\.org\/wiki\/(.+?)" title="(.+?) – /
65
65
 
66
+ # NUL for Escape
67
+ # @private
68
+ NUL = 0.chr
69
+
66
70
  class << self
67
71
 
68
72
  # Wikipedia の連続的な参照を抑制するための遅延時間/秒
@@ -75,7 +79,7 @@ module When
75
79
  #
76
80
  # @param [Hash] options 下記の通り
77
81
  # @option options [Hash] :alias Locale の読み替えパターンを Hash で指定する。
78
- # @option options [Hash] :namespace_foramt 名前空間定義の省略時に名前空間生成に用いる書式
82
+ # @option options [Hash] :namespace_format 名前空間定義の省略時に名前空間生成に用いる書式
79
83
  # @option options [Hash] :unification 漢字の包摂パターンを Hash で指定する。
80
84
  # @option options [Numeric] :wikipedia_interval Wikipedia の連続的な参照を抑制するための遅延時間/秒
81
85
  #
@@ -85,7 +89,7 @@ module When
85
89
  #
86
90
  def _setup_(options={})
87
91
  @aliases = options[:alias] || DefaultAlias
88
- @namespaces = options[:namespace_foramt] || DefaultNamespaces
92
+ @namespaces = options[:namespace_format] || DefaultNamespaces
89
93
  @unifications = options[:unification] || DefaultUnification
90
94
  @wikipedia_interval = options[:wikipedia_interval]
91
95
  end
@@ -96,7 +100,7 @@ module When
96
100
  #
97
101
  def _setup_info
98
102
  {:alias => _alias,
99
- :namespace_foramt => _namespaces,
103
+ :namespace_format => _namespaces,
100
104
  :unification => _unification,
101
105
  :wikipedia_interval => @wikipedia_interval}
102
106
  end
@@ -134,6 +138,29 @@ module When
134
138
  source
135
139
  end
136
140
 
141
+ # 暦要素を含む文字列を Hash に分解する
142
+ #
143
+ # @param [String] date_time 暦要素を含む文字列
144
+ # @param [String or Hash] format 分解する書式
145
+ # @param [String] locale 言語指定
146
+ #
147
+ # @return [Hash] 暦要素を分解格納した Hash
148
+ #
149
+ def _to_date_time_hash(date_time, format, locale=nil)
150
+ if locale
151
+ format = format.kind_of?(String) ?
152
+ translate(format, locale) :
153
+ _hash_value(format, locale)
154
+ unless locale == 'en'
155
+ regexp, hash = _trans_table(locale)
156
+ date_time = date_time.gsub(regexp) {|match| hash[match]}
157
+ end
158
+ end
159
+ ::DateTime._strptime(date_time, format)
160
+ rescue NameError
161
+ raise "Please require standard library 'Date' or 'DateTime'"
162
+ end
163
+
137
164
  # 包摂リストに登録されている文字を包摂する
138
165
  #
139
166
  # @param [When::Locale] source 文字を包摂しようとする国際化文字列
@@ -243,20 +270,27 @@ module When
243
270
  }
244
271
  end
245
272
 
246
- # locale 指定を解析して Hash の値を取り出す
273
+ # locale 指定を解析して key の値を取り出す
247
274
  # @private
248
- def _hash_value(hash, locale, defaults=['', 'en'])
275
+ def _hash_key(hash, locale, defaults=['', 'en'])
249
276
  locale = locale.sub(/\..*/, '')
250
- return hash[locale] if hash[locale]
251
- return _hash_value(hash, _alias[locale], defaults) if _alias[locale]
252
- language = locale.sub(/-.*/, '')
253
- return hash[language] if hash[language]
277
+ return locale if hash.key?(locale)
278
+ return _hash_key(hash, _alias[locale], defaults) if _alias.key?(locale)
279
+ language = locale.sub(/[-_].*/, '')
280
+ return language if hash.key?(language)
254
281
  defaults.each do |default|
255
- return hash[default] if hash[default]
282
+ return default if hash.key?(default)
256
283
  end
257
284
  return nil
258
285
  end
259
286
 
287
+ # locale 指定を解析して Hash の値を取り出す
288
+ # @private
289
+ def _hash_value(hash, locale, defaults=['', 'en'])
290
+ key = _hash_key(hash, locale, defaults)
291
+ key ? hash[key] : nil
292
+ end
293
+
260
294
  # 漢字の包摂パターン
261
295
  # @private
262
296
  def _unification
@@ -269,12 +303,23 @@ module When
269
303
  access_key = access_key.split(/\//).map {|key| key =~ /\A[0-9]+\z/ ? key.to_i : key}
270
304
  locale = locale.sub(/\..*/, '')
271
305
  [locale, locale.sub(/-.*/, '')].each do |loc|
272
- symbol = ('Locale_' + loc.sub(/-/,'_')).to_sym
306
+ symbol = ('Locale_' + loc.gsub(/-/,'_')).to_sym
273
307
  return {locale=>access_key.inject(const_get(symbol)) {|hash, key| hash = hash[key]}} if const_defined?(symbol)
274
308
  end
275
309
  return nil
276
310
  end
277
311
 
312
+ # DBpedia IRI の取得
313
+ #
314
+ # @param [String] source もとの URI
315
+ #
316
+ # @return [String] DBpedia IRI
317
+ # @private
318
+ def _dbpedia(source)
319
+ return nil unless Ref =~ source
320
+ return "http://#{$1=='en' ? '' : $1+'.'}dbpedia.org/resource/#{CGI.unescape($2)}"
321
+ end
322
+
278
323
  private
279
324
 
280
325
  # Locale の読み替えパターン
@@ -298,7 +343,7 @@ module When
298
343
  # wikipedia の読み込み
299
344
  def _wikipedia_object(path, locale, file, query, interval, options)
300
345
  # 採取済みデータ
301
- title = URI.decode(file.gsub('_', ' '))
346
+ title = CGI.unescape(file.gsub('_', ' '))
302
347
  mode = "".respond_to?(:force_encoding) ? ':utf-8' : ''
303
348
  dir = When::Parts::Resource.root_dir + '/data/wikipedia/' + locale
304
349
  FileUtils.mkdir_p(dir) unless FileTest.exist?(dir)
@@ -325,7 +370,7 @@ module When
325
370
  contents = nil
326
371
  begin
327
372
  OpenURI
328
- source = open(path, 'r'+mode)
373
+ source = URI.send(:open, path, 'r'+mode, {:ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE})
329
374
  contents = source.read
330
375
  ensure
331
376
  @wikipedia_last_access = Time.now.to_f
@@ -343,7 +388,7 @@ module When
343
388
  }
344
389
  contents.scan(Link) do |link|
345
390
  word[:names][$2] = $4
346
- word[:link ][$2] = "http://#{$2}.wikipedia.org/wiki/#{$3}"
391
+ word[:link ][$2] = "https://#{$2}.wikipedia.org/wiki/#{$3}"
347
392
  end
348
393
  object = When::BasicTypes::M17n.new(word)
349
394
 
@@ -380,6 +425,21 @@ module When
380
425
  object._pool['..'] += '?' + query if query
381
426
  object
382
427
  end
428
+
429
+ # 月名と週名の翻訳テーブル
430
+ def _trans_table(locale)
431
+ return @trans_table[locale] if @trans_table && @trans_table[locale]
432
+ hash = Hash[*(%w(_m:Calendar::Month::* _m:Calendar::Abbr_Month::*
433
+ _co:Common::Week::* _co:Common::Abbr_Day::*).inject([]) {|list, iri|
434
+ list.concat(When.Resource(iri).map {|resource|
435
+ label = resource.kind_of?(When::BasicTypes::M17n) ? resource : resource.label
436
+ [label.translate(locale), label.translate('en')]
437
+ })
438
+ }.sort_by {|pair| -(pair.first.length*100+pair.last.length)}).flatten]
439
+ regexp = /#{hash.keys.sort_by {|key| -key.length}.join('|')}/
440
+ @trans_table ||= {}
441
+ @trans_table[locale] = [regexp, hash]
442
+ end
383
443
  end
384
444
 
385
445
  # ローケール指定時の文字列
@@ -438,6 +498,16 @@ module When
438
498
  return Locale._hash_value(@link, loc.sub('_', '-'))
439
499
  end
440
500
 
501
+ # 特定 locale に対応した DBpedia URI の取得
502
+ #
503
+ # @param [String] loc locale の指定
504
+ #
505
+ # @return [String] loc に対応した DBpedia URI
506
+ #
507
+ def dbpedia(loc='')
508
+ Locale._dbpedia(reference(loc))
509
+ end
510
+
441
511
  # 部分文字列
442
512
  #
443
513
  # @param [Range] range String#[] と同様の指定方法で範囲を指定する
@@ -764,7 +834,7 @@ module When
764
834
  # encode URI from patterns %%(...) or %.(...) and replace space to '_'
765
835
  def _encode(source)
766
836
  source.gsub(' ','_').gsub(/%.<.+?>/) { |match|
767
- URI.encode(match[3..-2]).gsub('%', match[1..1])
837
+ CGI.escape(match[3..-2]).gsub('%', match[1..1])
768
838
  }
769
839
  end
770
840
  end
@@ -1,62 +1,62 @@
1
- # -*- coding: utf-8 -*-
2
- =begin
3
- Copyright (C) 2014 Takashi SUGA
4
-
5
- You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
- =end
7
-
8
- module When
9
- module Locale
10
- class << self
11
-
12
- #
13
- # Generate Regexp for transliteration
14
- #
15
- # @param [Hash] hash transliteration table
16
- #
17
- # @return [Regexp] Regexp for transliteration
18
- #
19
- def transliteration_keys(hash)
20
- Regexp.new((hash.keys.sort_by {|key| -key.length} + ['%.*?[A-Za-z]']).join('|'))
21
- end
22
-
23
- #
24
- # Generate Hash of {locale=>Regexp} for transliteration
25
- #
26
- # @param [Hash] hash transliteration table hash
27
- #
28
- # @return [Hash{String=>Regexp}] Hash of {locale=>Regexp} for transliteration
29
- #
30
- def transliteration_keys_hash(hash)
31
- Hash[*(hash.keys.map {|locale|
32
- [locale, transliteration_keys(hash[locale])]
33
- }).flatten]
34
- end
35
-
36
- alias :_method_missing :method_missing
37
-
38
- #
39
- # Registlation of conversion method
40
- #
41
- def method_missing(name, *args, &block)
42
- table_name = name.to_s.upcase
43
- return _method_missing(name, *args, &block) unless table_name !~ /_/ && const_defined?(table_name)
44
- table_obj = const_get(table_name)
45
- default = table_obj.keys.first
46
- locale = args[1] || default
47
- const_set(table_name + '_keys', transliteration_keys_hash(table_obj)) unless const_defined?(table_name + '_keys')
48
- return send(name, args[0], locale) if respond_to?(name)
49
- instance_eval %Q{
50
- def #{name}(string, locale='#{default}')
51
- string.gsub(#{table_name}_keys[locale]) do |code|
52
- #{table_name}[locale][code] || code
53
- end
54
- end
55
- }
56
- args[0].gsub(const_get("#{table_name}_keys")[locale]) do |code|
57
- table_obj[locale][code] || code
58
- end
59
- end
60
- end
61
- end
62
- end
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2014 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ module When
9
+ module Locale
10
+ class << self
11
+
12
+ #
13
+ # Generate Regexp for transliteration
14
+ #
15
+ # @param [Hash] hash transliteration table
16
+ #
17
+ # @return [Regexp] Regexp for transliteration
18
+ #
19
+ def transliteration_keys(hash)
20
+ Regexp.new((hash.keys.sort_by {|key| -key.length} + ['%.*?[A-Za-z]']).join('|'))
21
+ end
22
+
23
+ #
24
+ # Generate Hash of {locale=>Regexp} for transliteration
25
+ #
26
+ # @param [Hash] hash transliteration table hash
27
+ #
28
+ # @return [Hash{String=>Regexp}] Hash of {locale=>Regexp} for transliteration
29
+ #
30
+ def transliteration_keys_hash(hash)
31
+ Hash[*(hash.keys.map {|locale|
32
+ [locale, transliteration_keys(hash[locale])]
33
+ }).flatten]
34
+ end
35
+
36
+ alias :_method_missing :method_missing
37
+
38
+ #
39
+ # Registlation of conversion method
40
+ #
41
+ def method_missing(name, *args, &block)
42
+ table_name = name.to_s.upcase
43
+ return _method_missing(name, *args, &block) unless table_name !~ /_/ && const_defined?(table_name)
44
+ table_obj = const_get(table_name)
45
+ default = table_obj.keys.first
46
+ locale = args[1] || default
47
+ const_set(table_name + '_keys', transliteration_keys_hash(table_obj)) unless const_defined?(table_name + '_keys')
48
+ return send(name, args[0], locale) if respond_to?(name)
49
+ instance_eval %Q{
50
+ def #{name}(string, locale='#{default}')
51
+ string.gsub(#{table_name}_keys[locale]) do |code|
52
+ #{table_name}[locale][code] || code
53
+ end
54
+ end
55
+ }
56
+ args[0].gsub(const_get("#{table_name}_keys")[locale]) do |code|
57
+ table_obj[locale][code] || code
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -232,9 +232,6 @@ module When
232
232
  calendars[0] ||= When::Gregorian
233
233
  result = dates.map {|date|
234
234
  date = When.when?(date)
235
- opts = {}
236
- opts[:location] = date.location if date.location
237
- opts[:clock ] = date.clock if date.respond_to?(:clock) && date.clock
238
235
  list = calendars.dup
239
236
  (0...calendars.size).to_a.reverse.each do |i|
240
237
  case list[i]
@@ -257,15 +254,13 @@ module When
257
254
 
258
255
  if methods.size == 0
259
256
  list.map {|calendar|
260
- calendar.kind_of?(Class) ?
261
- yield(calendar.new(date, opts.dup)) :
262
- yield(calendar.^(calendar.rate_of_clock == date.time_standard.rate_of_clock ? date.to_i : date, opts))
257
+ yield(date_for_calendar(calendar, date, options))
263
258
  }
264
259
  else
265
260
  list.map {|calendar|
266
- date_for_calendar = calendar.^(calendar.rate_of_clock == date.time_standard.rate_of_clock ? date.to_i : date, opts)
261
+ date_for_cal = date_for_calendar(calendar, date, options)
267
262
  methods.map {|method|
268
- date_for_calendar.send(method[0].to_sym, method[1], &block)
263
+ date_for_cal.send(method[0].to_sym, method[1], &block)
269
264
  }
270
265
  }
271
266
  end
@@ -274,6 +269,17 @@ module When
274
269
  return result
275
270
  end
276
271
 
272
+ # 当該 Calendar or CalendarEra の TemporalPosition を生成
273
+ def date_for_calendar(calendar, date, options)
274
+ opts = {}
275
+ opts[:location] = date.location if date.location
276
+ opts[:clock ] = calendar.rate_of_clock == 1.0 ? options[:clock] :
277
+ calendar.time_basis if date.respond_to?(:clock)
278
+ calendar.kind_of?(Class) ?
279
+ calendar.new(date, opts) :
280
+ calendar.^([calendar.rate_of_clock,date.time_standard.rate_of_clock].uniq == [1.0] ? date.to_i : date, opts)
281
+ end
282
+
277
283
  # JSONで通信するために Symbol を String に変換する
278
284
  def _to_string(source)
279
285
  case source
@@ -0,0 +1,42 @@
1
+ # -*- coding: utf-8 -*-
2
+ =begin
3
+ Copyright (C) 2015 Takashi SUGA
4
+
5
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
6
+ =end
7
+
8
+ module When
9
+ module Namespace
10
+
11
+ # XML Schema Definition
12
+ XSD = 'http://www.w3.org/2001/XMLSchema'
13
+
14
+ # Resource Description Framework
15
+ RDF = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'
16
+
17
+ # Resource Description Framework Schema
18
+ RDFS = 'http://www.w3.org/2000/01/rdf-schema#'
19
+
20
+ # RDF 1.1 Concepts and Abstract Syntax
21
+ RDFC = 'http://www.w3.org/TR/rdf11-concepts/#'
22
+
23
+ # Web Ontology Language
24
+ OWL = 'http://www.w3.org/2002/07/owl#'
25
+
26
+ # Dublin Core
27
+ DC = 'http://purl.org/dc/elements/1.1/'
28
+
29
+ # Dublin Core Terms
30
+ DCQ = 'http://purl.org/dc/terms/'
31
+
32
+ # Dublin Core Types
33
+ DCT = 'http://purl.org/dc/dcmitype/'
34
+
35
+ # Friend of a Friend
36
+ FOAF = 'http://xmlns.com/foaf/0.1/'
37
+
38
+ # RDF Site Summary
39
+ RSS = 'http://purl.org/rss/1.0/'
40
+
41
+ end
42
+ 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
@@ -188,7 +188,7 @@ module When::Parts
188
188
  # [ false - ない ]
189
189
  #
190
190
  def has_next?
191
- return (@count_limit != 0) && (@current != nil)
191
+ return (@count_limit != 0) && !@current.nil?
192
192
  end
193
193
 
194
194
  #
@@ -238,7 +238,17 @@ module When::Parts
238
238
  @count += 1
239
239
  _exclude(@current) if @current
240
240
  end
241
- return value
241
+ @delayed && value.respond_to?(:apply_delayed_options) ?
242
+ value.apply_delayed_options(@delayed) :
243
+ value
244
+ end
245
+
246
+ # 終端要素は含む
247
+ #
248
+ # @return [Boolean]
249
+ #
250
+ def exclude_end
251
+ false
242
252
  end
243
253
 
244
254
  # オブジェクトの生成
@@ -262,6 +272,7 @@ module When::Parts
262
272
  @options = self.class._options(args)
263
273
  @exdate = @options.delete(:exdate)
264
274
  @exevent = @options.delete(:exevent)
275
+ @delayed = @options.delete(:delayed)
265
276
  @parent, *rest = args
266
277
  _range(rest)
267
278
  _rewind
@@ -302,7 +313,7 @@ module When::Parts
302
313
  end
303
314
  end
304
315
  previous = @processed._include?(value)
305
- @processed |= value if previous == false
316
+ @processed |= value unless previous
306
317
  registered = (previous==value) ? previous : value
307
318
  registered = registered.first if registered.kind_of?(GeometricComplex)
308
319
  registered.events ||=[]
@@ -341,7 +352,7 @@ module When::Parts
341
352
  # eql? はオーバーライドしない
342
353
  #
343
354
  def self._sort(list, direction)
344
- list = list.sort
355
+ list = (0...list.size).to_a.map {|i| [list[i], i]}.sort.map {|e| e[0]}
345
356
  prev = nil
346
357
  list.delete_if do |x|
347
358
  if (x == prev)