37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
# File 'lib/rio/rrl/builder.rb', line 37
def self.build(*a)
a.flatten!
a.push('') if a.empty?
case a[0]
when ?? , ?= , ?_ , ?", ?[, ?#, ?`, ?|, ?z
a[0] = 'rio:'+CHMAP[a[0]]+':'
when ?-
a[0] = ( a.size == 1 ? 'rio:'+CHMAP[a[0]]+':' : 'rio:cmdio:' )
when ?$
a[0] = 'rio:strio:'
when ::String
case a[0]
when /^[a-zA-Z]:/
a[0] = 'rio:file:///'+a[0]
when /^[a-z][a-z]+:/
a[0] = 'rio:'+a[0] unless a[0] =~ /^rio:/
when %r|^//|
a[0] = 'rio:file:'+a[0]
when %r|^/|
a[0] = 'file://'+a[0]
else
return Factory.instance.riorl_class('path').new(*a)
end
when RIO::Rio
a[0] = a[0].rl
return build(*a)
when ::RIO::RRL::Base
a0 = a.shift.uri
cl = Factory.instance.riorl_class(a0.scheme)
o = cl.new(a0,*a) unless cl.nil?
return o
when ::Alt::URI::Base
a0 = a.shift
cl = Factory.instance.riorl_class(a0.scheme)
o = cl.new(a0,*a) unless cl.nil?
return o
when ::RIO::URIRef
a0 = a.shift
cl = Factory.instance.riorl_class(a0.scheme)
o = cl.new(a0,*a) unless cl.nil?
return o
when ::Symbol
case a[0]
when :_
a[0] = 'sysio:'
when :""
a[0] = 'strio:'
when :|
a[0] = 'cmdpipe:'
when :-
a[0] = ( a.size == 1 ? 'stdio:' : 'cmdio:' )
when :zpath
a0 = a.shift
cl = Factory.instance.riorl_class(a0.to_s)
o = cl.new(*a) unless cl.nil?
return o
else
a[0] = 'rio:' + a[0].to_s + ':'
end
when ::NilClass
a[0] = 'rio:null:'
when ::IO
a.unshift('rio:sysio:')
when ::StringIO
a.unshift('rio:strio:')
else
a[0] = a[0].to_s
return build(*a)
end
a0 = a.shift
sch = /^(rio:)?([^:]+):/.match(a0)[2]
cl = Factory.instance.riorl_class(sch)
cl.parse(a0,*a) unless cl.nil?
end
|