when_exe 0.3.2 → 0.3.3
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.
- data/LICENSE.ja.txt +25 -25
- data/LICENSE.txt +31 -31
- data/bin/locales.rb +2 -1
- data/bin/when.rb.config +1 -1
- data/lib/when_exe.rb +70 -48
- data/lib/when_exe/basictypes.rb +99 -65
- data/lib/when_exe/calendartypes.rb +40 -178
- data/lib/when_exe/coordinates.rb +156 -62
- data/lib/when_exe/core/compatibility.rb +10 -0
- data/lib/when_exe/core/extension.rb +40 -0
- data/lib/when_exe/ephemeris.rb +112 -50
- data/lib/when_exe/icalendar.rb +125 -91
- data/lib/when_exe/inspect.rb +100 -48
- data/lib/when_exe/locales/ar.rb +48 -48
- data/lib/when_exe/locales/bg.rb +1 -1
- data/lib/when_exe/locales/bs.rb +4 -2
- data/lib/when_exe/locales/ca.rb +1 -1
- data/lib/when_exe/locales/en_CA.rb +3 -4
- data/lib/when_exe/locales/en_IE.rb +88 -0
- data/lib/when_exe/locales/en_US.rb +87 -0
- data/lib/when_exe/locales/es_CR.rb +84 -0
- data/lib/when_exe/locales/es_EC.rb +85 -0
- data/lib/when_exe/locales/es_PA.rb +85 -0
- data/lib/when_exe/locales/fr.rb +39 -39
- data/lib/when_exe/locales/hu.rb +15 -14
- data/lib/when_exe/locales/it.rb +1 -1
- data/lib/when_exe/locales/ja.rb +2 -2
- data/lib/when_exe/locales/locales.rb +7 -0
- data/lib/when_exe/locales/lt.rb +21 -19
- data/lib/when_exe/locales/ms.rb +84 -0
- data/lib/when_exe/locales/nl.rb +2 -2
- data/lib/when_exe/locales/ru.rb +1 -1
- data/lib/when_exe/locales/uk.rb +1 -1
- data/lib/when_exe/locales/ur.rb +84 -0
- data/lib/when_exe/mini_application.rb +44 -43
- data/lib/when_exe/parts/enumerator.rb +3 -3
- data/lib/when_exe/parts/geometric_complex.rb +6 -1
- data/lib/when_exe/parts/locale.rb +49 -18
- data/lib/when_exe/parts/method_cash.rb +61 -0
- data/lib/when_exe/parts/resource.rb +221 -106
- data/lib/when_exe/parts/timezone.rb +70 -33
- data/lib/when_exe/region/bahai.rb +2 -2
- data/lib/when_exe/region/balinese.rb +40 -43
- data/lib/when_exe/region/chinese.rb +93 -33
- data/lib/when_exe/region/chinese_calendar.rb +117 -1
- data/lib/when_exe/region/chinese_epoch.rb +65 -10
- data/lib/when_exe/region/christian.rb +97 -2
- data/lib/when_exe/region/ephemeric_notes.rb +353 -0
- data/lib/when_exe/region/french.rb +1 -1
- data/lib/when_exe/region/geologicalage.rb +171 -171
- data/lib/when_exe/region/indian.rb +18 -14
- data/lib/when_exe/region/iranian.rb +1 -1
- data/lib/when_exe/region/japanese.rb +49 -12
- data/lib/when_exe/region/japanese_notes.rb +838 -507
- data/lib/when_exe/region/japanese_residues.rb +724 -662
- data/lib/when_exe/region/javanese.rb +7 -7
- data/lib/when_exe/region/mayan.rb +19 -17
- data/lib/when_exe/region/nihon_shoki.rb +3 -3
- data/lib/when_exe/region/residue.rb +29 -28
- data/lib/when_exe/region/shire.rb +2 -2
- data/lib/when_exe/region/tibetan.rb +87 -5
- data/lib/when_exe/region/world.rb +1 -1
- data/lib/when_exe/timestandard.rb +85 -7
- data/lib/when_exe/tmobjects.rb +32 -4
- data/lib/when_exe/tmposition.rb +104 -55
- data/lib/when_exe/tmreference.rb +157 -60
- data/lib/when_exe/version.rb +2 -2
- data/test/examples/JapanHolidays.ics +3 -3
- data/test/examples/JapanHolidaysRFC6350.ics +499 -0
- data/test/examples/Residue.m17n +3 -2
- data/test/examples/Spatial.m17n +3 -3
- data/test/examples/USA-DST.ics +27 -27
- data/test/examples/today.rb +1 -1
- data/test/test.rb +4 -2
- data/test/test/basictypes.rb +40 -15
- data/test/test/coordinates.rb +9 -4
- data/test/test/icalendar.rb +24 -14
- data/test/test/inspect.rb +5 -3
- data/test/test/parts.rb +11 -2
- data/test/test/region/chinese.rb +4 -4
- data/test/test/region/civil.rb +124 -0
- data/test/test/region/geologicalage.rb +5 -2
- data/test/test/region/indian.rb +2 -0
- data/test/test/region/japanese.rb +156 -1
- data/test/test/region/jewish.rb +3 -3
- data/test/test/region/m17n.rb +9 -9
- data/test/test/region/mayan.rb +122 -5
- data/test/test/region/residue.rb +1 -1
- data/test/test/tmobjects.rb +27 -64
- data/test/test/tmposition.rb +48 -1
- data/test/test/tmreference.rb +66 -4
- data/when_exe.gemspec +1 -1
- metadata +15 -6
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
=begin
|
|
3
|
-
Copyright (C) 2011-
|
|
3
|
+
Copyright (C) 2011-2014 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
|
|
@@ -19,16 +19,33 @@ module When::Parts
|
|
|
19
19
|
LabelProperty = nil
|
|
20
20
|
|
|
21
21
|
# @private
|
|
22
|
-
class
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
class ContentLine
|
|
23
|
+
|
|
24
|
+
RFC6350 = {
|
|
25
|
+
"\\\\" => "\\",
|
|
26
|
+
"\\n" => "\n",
|
|
27
|
+
"\\N" => "\n",
|
|
28
|
+
"\\;" => ";",
|
|
29
|
+
"\\:" => ":"
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
RFC6868 = {
|
|
33
|
+
"^n" => "\n",
|
|
34
|
+
"^^" => "^",
|
|
35
|
+
"^'" => '"'
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
attr_reader :predicate
|
|
39
|
+
attr_accessor :object
|
|
40
|
+
attr_reader :attribute
|
|
26
41
|
attr_accessor :namespace
|
|
27
|
-
|
|
42
|
+
attr_accessor :same_altid
|
|
43
|
+
attr_reader :marked
|
|
28
44
|
|
|
29
45
|
def initialize(key, object=nil, marked=nil)
|
|
30
46
|
key = key.downcase.gsub(/-/,'_') if (key==key.upcase)
|
|
31
47
|
@predicate, @namespace = key.split(/:/).reverse
|
|
48
|
+
object = object.gsub(/\^./) {|escape| RFC6868[escape] || escape} if object.instance_of?(String)
|
|
32
49
|
@object = object
|
|
33
50
|
@marked = marked
|
|
34
51
|
@attribute = {}
|
|
@@ -80,21 +97,16 @@ module When::Parts
|
|
|
80
97
|
#
|
|
81
98
|
def [](label)
|
|
82
99
|
|
|
83
|
-
# nil label
|
|
100
|
+
# nil label の場合
|
|
84
101
|
return _pool[label] unless label
|
|
85
102
|
|
|
86
|
-
#
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return terms.inject(self) {|obj,term| obj = obj[term]} if terms.length >= 2
|
|
91
|
-
end
|
|
103
|
+
# 階層がある場合
|
|
104
|
+
terms = Resource._encode(label).split(/::/)
|
|
105
|
+
terms.shift if terms[0] == ''
|
|
106
|
+
return terms.inject(self) {|obj,term| obj = obj[Resource._decode(term)]} if terms.length >= 2
|
|
92
107
|
|
|
93
108
|
# 階層がない場合
|
|
94
|
-
|
|
95
|
-
label = Resource._extract_prefix(path)
|
|
96
|
-
label += '?' + options if options
|
|
97
|
-
_pool[label.gsub(/%3A%3A/, '::')]
|
|
109
|
+
_pool[Resource._decode(Resource._extract_prefix(terms[0]))]
|
|
98
110
|
end
|
|
99
111
|
|
|
100
112
|
# オブジェクト登録
|
|
@@ -192,13 +204,17 @@ module When::Parts
|
|
|
192
204
|
return iri unless iri.instance_of?(String)
|
|
193
205
|
|
|
194
206
|
# 階層がある場合は、階層をたどる
|
|
207
|
+
iri = Resource._decode(iri)
|
|
208
|
+
iri = $1 while iri =~ /^\((.*)\)$/
|
|
195
209
|
iri = namespace + iri if namespace && iri !~ /^[_a-z\d]+:[^:]/i
|
|
196
|
-
root, *leaves= iri.split(/::/)
|
|
197
|
-
|
|
210
|
+
root, *leaves= Resource._encode(iri).split(/::/)
|
|
211
|
+
if leaves.size > 0
|
|
212
|
+
return leaves.inject(_instance(Resource._decode(root))) {|obj,leaf| obj[Resource._decode(leaf)]}
|
|
213
|
+
end
|
|
198
214
|
|
|
199
215
|
# 登録ずみなら、参照
|
|
200
|
-
|
|
201
|
-
|
|
216
|
+
iri = _extract_prefix(iri)
|
|
217
|
+
path, query = iri.split(/\?/, 2)
|
|
202
218
|
if When.multi_thread
|
|
203
219
|
my_mutex = nil
|
|
204
220
|
@_lock_.synchronize do
|
|
@@ -236,21 +252,26 @@ module When::Parts
|
|
|
236
252
|
def _parse(line, type=nil)
|
|
237
253
|
return line unless line.kind_of?(String)
|
|
238
254
|
line.sub!(/\s#.*$/, '')
|
|
239
|
-
return Locale._split($1) if type &&
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
marked, key, property
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
255
|
+
return Locale._split($1) if type && /^#{type}:(.+)$/i =~ line
|
|
256
|
+
tokens = line.scan(/((?:[^\\:]|\\.)+)(?::(?!\z))?|:/).flatten
|
|
257
|
+
return Locale._split(line) unless tokens.size > 1 && /^(\*)?([A-Z][-A-Z_]{0,255})(?:;(.+))?$/i =~ tokens[0]
|
|
258
|
+
marked, key, property = $~[1..3]
|
|
259
|
+
values = tokens[1..-1]
|
|
260
|
+
value = values.join(':') unless values == [nil]
|
|
261
|
+
content = ContentLine.new(key, value, marked)
|
|
262
|
+
value ||= ''
|
|
263
|
+
if property
|
|
264
|
+
content.attribute['.'] = property + ':' + value
|
|
265
|
+
property.scan(/((?:[^\\;]|\\.)+)(?:;(?!\z))?|;/).flatten.each do |pr|
|
|
266
|
+
pr ||= ''
|
|
267
|
+
pr.gsub!(/\\./) {|escape| ContentLine::RFC6350[escape] || escape}
|
|
268
|
+
prop = ContentLine.new(*pr.split(/=/, 2))
|
|
269
|
+
content.attribute[prop.predicate] = prop
|
|
249
270
|
end
|
|
250
271
|
else
|
|
251
|
-
|
|
272
|
+
content.attribute['.'] = value
|
|
252
273
|
end
|
|
253
|
-
return
|
|
274
|
+
return content
|
|
254
275
|
end
|
|
255
276
|
|
|
256
277
|
# @private
|
|
@@ -270,16 +291,72 @@ module When::Parts
|
|
|
270
291
|
return path
|
|
271
292
|
end
|
|
272
293
|
|
|
294
|
+
# @private
|
|
295
|
+
def _replace_tags(source, tags)
|
|
296
|
+
case source
|
|
297
|
+
when String
|
|
298
|
+
target = source.dup
|
|
299
|
+
tags.each_pair do |key, value|
|
|
300
|
+
target.gsub!(/#\{(\?[^=#}]+?=)?#{key}(:.*?)?\}/, '\1' + value) if value.kind_of?(String)
|
|
301
|
+
end
|
|
302
|
+
target.gsub(/#\{.+?(:(.*?))?\}/, '\2')
|
|
303
|
+
when Array
|
|
304
|
+
source.map {|target| _replace_tags(target, tags)}
|
|
305
|
+
when Hash
|
|
306
|
+
target = {}
|
|
307
|
+
source.each_pair do |key, value|
|
|
308
|
+
target[key] = tags[key].kind_of?(Numeric) ? tags[key] : _replace_tags(value, tags)
|
|
309
|
+
end
|
|
310
|
+
target
|
|
311
|
+
else
|
|
312
|
+
source
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
# @private
|
|
317
|
+
def _encode(iri)
|
|
318
|
+
return iri unless iri =~ /\(/
|
|
319
|
+
|
|
320
|
+
iri = iri.dup
|
|
321
|
+
begin
|
|
322
|
+
unless iri.gsub!(/\([^()]*\)/) {|token|
|
|
323
|
+
token.gsub(/[():?&%]/) {|char|'%' + char.ord.to_s(16)}
|
|
324
|
+
}
|
|
325
|
+
raise ArgumentError, 'Brackets do not correspond: ' + iri
|
|
326
|
+
end
|
|
327
|
+
end while iri =~ /\(/
|
|
328
|
+
iri
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
# @private
|
|
332
|
+
def _decode(iri)
|
|
333
|
+
return iri unless iri =~ /%28/
|
|
334
|
+
|
|
335
|
+
iri = iri.dup
|
|
336
|
+
begin
|
|
337
|
+
unless iri.gsub!(/%28.*?%29/) {|token|
|
|
338
|
+
token.gsub(/%([\dA-F]{2})/i) {$1.to_i(16).chr}
|
|
339
|
+
}
|
|
340
|
+
raise ArgumentError, 'Brackets do not correspond: ' + iri
|
|
341
|
+
end
|
|
342
|
+
end while iri =~ /%28/
|
|
343
|
+
iri = $1 if iri =~ /^\((.*)\)$/
|
|
344
|
+
iri
|
|
345
|
+
end
|
|
346
|
+
|
|
273
347
|
private
|
|
274
348
|
|
|
275
349
|
def _create_object(iri, path, query)
|
|
276
350
|
options = {}
|
|
277
351
|
replace = {}
|
|
278
352
|
if query
|
|
279
|
-
options = Hash[*query.split(/&/).map{
|
|
353
|
+
options = Hash[*Resource._encode(query).split(/&/).map{|pair|
|
|
354
|
+
key, value = pair.split(/=/, 2)
|
|
355
|
+
[key, Resource._decode(value)]
|
|
356
|
+
}.flatten]
|
|
280
357
|
keys = options.keys
|
|
281
358
|
keys.each do |key|
|
|
282
|
-
replace[$1] = options.delete(key) if key =~
|
|
359
|
+
replace[$1] = options.delete(key) if key =~ /^([A-Z].*)/
|
|
283
360
|
end
|
|
284
361
|
end
|
|
285
362
|
options['..'] = iri
|
|
@@ -292,6 +369,14 @@ module When::Parts
|
|
|
292
369
|
when Class
|
|
293
370
|
obj = list[0].new(options)
|
|
294
371
|
when Array
|
|
372
|
+
top = list[0][0]
|
|
373
|
+
if top.kind_of?(Hash)
|
|
374
|
+
top.each_pair do |key, value|
|
|
375
|
+
replace.update(value[replace.delete(key)]) if value.kind_of?(Hash) && value.key?(replace[key])
|
|
376
|
+
end
|
|
377
|
+
list[0] = list[0][1..-1]
|
|
378
|
+
list[0] = _replace_tags(list[0], top.merge(replace))
|
|
379
|
+
end
|
|
295
380
|
if list[0][0].kind_of?(Class)
|
|
296
381
|
# 配列の先頭がクラスである場合
|
|
297
382
|
klass, *list = list[0]
|
|
@@ -317,11 +402,10 @@ module When::Parts
|
|
|
317
402
|
parsed = nil
|
|
318
403
|
OpenURI
|
|
319
404
|
begin
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
end
|
|
405
|
+
args = [path, "1".respond_to?(:force_encoding) ? 'r:utf-8' : 'r']
|
|
406
|
+
args << {:ssl_verify_mode=>OpenSSL::SSL::VERIFY_NONE} if path =~ /^https:/
|
|
407
|
+
open(*args) do |file|
|
|
408
|
+
resource = _replace_tags(file.read, replace)
|
|
325
409
|
parsed = (resource[0..5]=='BEGIN:') ? _ics(resource.split(/[\n\r]+/)) :
|
|
326
410
|
_xml(REXML::Document.new(resource).root)
|
|
327
411
|
end
|
|
@@ -339,9 +423,9 @@ module When::Parts
|
|
|
339
423
|
end
|
|
340
424
|
|
|
341
425
|
def _class(path)
|
|
342
|
-
return nil unless (
|
|
343
|
-
list
|
|
344
|
-
|
|
426
|
+
return nil unless path.index(Resource.base_uri) == 0
|
|
427
|
+
list = [When]
|
|
428
|
+
path[Resource.base_uri.length..-1].split(/\//).each do |mod|
|
|
345
429
|
if list[0].const_defined?(mod)
|
|
346
430
|
list.unshift(list[0].const_get(mod))
|
|
347
431
|
else
|
|
@@ -362,19 +446,19 @@ module When::Parts
|
|
|
362
446
|
key = '' if expanded_name == 'xmlns'
|
|
363
447
|
namespace[key] = value.to_s
|
|
364
448
|
end
|
|
365
|
-
obj <<
|
|
449
|
+
obj << ContentLine.new('xmlns:namespace', namespace) if (namespace.size>0)
|
|
366
450
|
xml.each do |e|
|
|
367
451
|
next unless defined? e.name
|
|
368
452
|
if (e.attributes['type'])
|
|
369
453
|
obj << _xml(e, namespace)
|
|
370
454
|
else
|
|
371
|
-
|
|
455
|
+
content = ContentLine.new(e.expanded_name, e.attributes['ref']||e.text)
|
|
372
456
|
e.attributes.each_pair do |key,value|
|
|
373
|
-
attr =
|
|
457
|
+
attr = ContentLine.new(value.name, value)
|
|
374
458
|
attr.namespace = value.prefix
|
|
375
|
-
|
|
459
|
+
content.attribute[key] = attr
|
|
376
460
|
end
|
|
377
|
-
obj <<
|
|
461
|
+
obj << content
|
|
378
462
|
end
|
|
379
463
|
end
|
|
380
464
|
return obj
|
|
@@ -461,7 +545,6 @@ module When::Parts
|
|
|
461
545
|
return @iri if @iri
|
|
462
546
|
root = @_pool['..']
|
|
463
547
|
path = root.instance_of?(String) ? root : label.to_s
|
|
464
|
-
path = path.gsub(/::/, '%3A%3A')
|
|
465
548
|
if root.respond_to?(:iri)
|
|
466
549
|
prefix = root.iri
|
|
467
550
|
path = prefix + '::' + path if prefix
|
|
@@ -482,15 +565,15 @@ module When::Parts
|
|
|
482
565
|
return child[iri * 1]
|
|
483
566
|
when String
|
|
484
567
|
obj = self
|
|
485
|
-
iri.split(/::/).each do |label|
|
|
568
|
+
Resource._encode(iri).split(/::/).each do |label|
|
|
486
569
|
return obj.child if label == '*'
|
|
487
570
|
if obj == Resource
|
|
488
|
-
obj = Resource._instance(label)
|
|
571
|
+
obj = Resource._instance(Resource._decode(label))
|
|
489
572
|
else
|
|
490
573
|
case label
|
|
491
574
|
when '' ; obj = Resource
|
|
492
575
|
when '.' # obj = obj
|
|
493
|
-
else ; obj = obj._pool[
|
|
576
|
+
else ; obj = obj._pool[Resource._decode(label)]
|
|
494
577
|
end
|
|
495
578
|
end
|
|
496
579
|
raise ArgumentError, "IRI not found: #{iri}" unless obj
|
|
@@ -703,13 +786,7 @@ module When::Parts
|
|
|
703
786
|
def _set_variables(options)
|
|
704
787
|
@options = options[:options] || {} if options.key?(:options)
|
|
705
788
|
options.each_pair do |key,value|
|
|
706
|
-
unless (key =~ /^options
|
|
707
|
-
# スキームの":"がエンコーディングされていたら、valueをデコード
|
|
708
|
-
if (value =~ /^\w+%3A/i)
|
|
709
|
-
value.gsub!(/%[0-9A-F]{2}/i) do |c|
|
|
710
|
-
c.sub(/%/,'0x').hex.chr
|
|
711
|
-
end
|
|
712
|
-
end
|
|
789
|
+
unless (key =~ /^options$|^\.|^[A-Z]/)
|
|
713
790
|
case "#{key}"
|
|
714
791
|
when 'namespace' ; value = Locale._namespace(value)
|
|
715
792
|
when 'locale' ; value = Locale._locale(value)
|
|
@@ -721,67 +798,97 @@ module When::Parts
|
|
|
721
798
|
|
|
722
799
|
# 配下のオブジェクトの生成
|
|
723
800
|
def _child(options)
|
|
724
|
-
@child
|
|
725
|
-
query
|
|
726
|
-
options['..']
|
|
727
|
-
|
|
801
|
+
@child = []
|
|
802
|
+
query = options.dup
|
|
803
|
+
options['..'] = self
|
|
804
|
+
leaves = options.delete('.').map {|leaf| Resource._parse(leaf)}
|
|
805
|
+
key_list = []
|
|
806
|
+
properties = {}
|
|
728
807
|
label_candidates = nil
|
|
729
808
|
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
end
|
|
742
|
-
end
|
|
743
|
-
options['.'] = list
|
|
744
|
-
@child << element[0].new(options.dup)
|
|
809
|
+
# ContentLine の処理(namespace, locale, altidの前処理)
|
|
810
|
+
leaves.each do |content|
|
|
811
|
+
next unless content.kind_of?(ContentLine)
|
|
812
|
+
key = content.predicate
|
|
813
|
+
value = content.object
|
|
814
|
+
next options.delete(key) unless value
|
|
815
|
+
case key
|
|
816
|
+
when 'namespace'
|
|
817
|
+
options[key] ||= {}
|
|
818
|
+
if content.attribute['altid']
|
|
819
|
+
options[key][content.attribute['prefix'].object] = content.object
|
|
745
820
|
else
|
|
746
|
-
options.
|
|
747
|
-
@child << self.class.new(*(element + [options]))
|
|
821
|
+
options[key] = options[key].update(Locale._namespace(value))
|
|
748
822
|
end
|
|
823
|
+
when 'locale'
|
|
824
|
+
options[key] = Locale._locale(value)
|
|
825
|
+
else
|
|
826
|
+
_parse_altid(properties, content)
|
|
827
|
+
key_list << key unless key_list.include?(key)
|
|
828
|
+
end
|
|
829
|
+
end
|
|
749
830
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
831
|
+
# ContentLine の処理(一般)
|
|
832
|
+
key_list.each do |key|
|
|
833
|
+
content = properties[key][0]
|
|
834
|
+
value = content.same_altid ? When::BasicTypes::M17n.new(content, options['namespace'], []) : content.object
|
|
835
|
+
value = When::BasicTypes::M17n.new(value, nil, nil, options) if value.instance_of?(String) && value =~ /^\s*\[/
|
|
836
|
+
@_pool[value.to_s] = value if value.kind_of?(When::BasicTypes::M17n)
|
|
837
|
+
if content.marked || key == self.class::LabelProperty
|
|
838
|
+
@label = value
|
|
839
|
+
else
|
|
840
|
+
options[key] = value
|
|
841
|
+
label_candidates ||= value
|
|
842
|
+
end
|
|
843
|
+
end
|
|
844
|
+
|
|
845
|
+
# Array の処理(子オブジェクトの生成)
|
|
846
|
+
leaves.each do |content|
|
|
847
|
+
next unless content.kind_of?(Array)
|
|
848
|
+
if content[0].kind_of?(Class)
|
|
849
|
+
list = []
|
|
850
|
+
content.each do |e|
|
|
851
|
+
if e.kind_of?(Hash)
|
|
852
|
+
list += e.keys.map {|key| Resource::ContentLine.new(key, e[key])}
|
|
760
853
|
else
|
|
761
|
-
|
|
762
|
-
options.delete('.')
|
|
763
|
-
value = m17n(value, nil, nil, options.dup)
|
|
764
|
-
@_pool[value.to_s] = value
|
|
765
|
-
end
|
|
766
|
-
if element.marked || key == self.class::LabelProperty
|
|
767
|
-
@label = value
|
|
768
|
-
else
|
|
769
|
-
options[key] = value
|
|
770
|
-
label_candidates ||= value
|
|
771
|
-
end
|
|
854
|
+
list << e
|
|
772
855
|
end
|
|
773
|
-
else
|
|
774
|
-
options.delete(key)
|
|
775
856
|
end
|
|
857
|
+
options['.'] = list
|
|
858
|
+
@child << content[0].new(options.dup)
|
|
859
|
+
else
|
|
860
|
+
options.delete('.')
|
|
861
|
+
@child << self.class.new(*(content + [options]))
|
|
776
862
|
end
|
|
777
863
|
end
|
|
864
|
+
|
|
865
|
+
# 代表ラベルの設定
|
|
778
866
|
options.update(query)
|
|
779
867
|
unless @label
|
|
780
|
-
raise ArgumentError, "label attribute not found: #{
|
|
868
|
+
raise ArgumentError, "label attribute not found: #{options['.']}" unless label_candidates
|
|
781
869
|
@label = label_candidates
|
|
782
870
|
end
|
|
783
871
|
end
|
|
784
872
|
|
|
873
|
+
# ALTIDを持つ ContentLine の解析
|
|
874
|
+
def _parse_altid(properties, content)
|
|
875
|
+
key = content.predicate
|
|
876
|
+
properties[key] ||= []
|
|
877
|
+
if content.attribute['altid']
|
|
878
|
+
found = false
|
|
879
|
+
(0...properties[key].length).to_a.each do |i|
|
|
880
|
+
prev = properties[key][i]
|
|
881
|
+
if prev.attribute['altid'] && prev.attribute['altid'].object == content.attribute['altid'].object
|
|
882
|
+
content.same_altid = prev
|
|
883
|
+
properties[key][i] = content
|
|
884
|
+
found = true
|
|
885
|
+
break
|
|
886
|
+
end
|
|
887
|
+
end
|
|
888
|
+
end
|
|
889
|
+
properties[key] << content unless found
|
|
890
|
+
end
|
|
891
|
+
|
|
785
892
|
# 配下のオブジェクトの前後関係の設定
|
|
786
893
|
def _sequence
|
|
787
894
|
return unless @child
|
|
@@ -800,12 +907,20 @@ module When::Parts
|
|
|
800
907
|
end
|
|
801
908
|
end
|
|
802
909
|
|
|
910
|
+
alias :__method_missing :method_missing
|
|
911
|
+
|
|
803
912
|
# その他のメソッド
|
|
804
|
-
# When::Parts::
|
|
913
|
+
# When::Parts::Resource で定義されていないメソッドは
|
|
805
914
|
# 処理を @child (type: Array) に委譲する
|
|
806
915
|
#
|
|
807
916
|
def method_missing(name, *args, &block)
|
|
808
|
-
|
|
917
|
+
return __method_missing(name, *args, &block) if When::Parts::MethodCash::Escape.key?(name)
|
|
918
|
+
self.class.module_eval %Q{
|
|
919
|
+
def #{name}(*args, &block)
|
|
920
|
+
@child.send("#{name}", *args, &block)
|
|
921
|
+
end
|
|
922
|
+
} unless When::Parts::MethodCash.escape(name)
|
|
923
|
+
@child.send(name, *args, &block)
|
|
809
924
|
end
|
|
810
925
|
|
|
811
926
|
#
|