Class: XSD::NS

Inherits:
Object show all
Defined in:
lib/xsd/ns.rb

Direct Known Subclasses

SOAP::NS

Defined Under Namespace

Classes: Assigner, FormatError

Constant Summary collapse

Namespace =
'http://www.w3.org/XML/1998/namespace'
KNOWN_TAG =
{
  XSD::Namespace => 'xsd',
  XSD::InstanceNamespace => 'xsi',
}
ParseRegexp =

$1 and $2 are necessary.

Regexp.new('\A([^:]+)(?::(.+))?\z', nil, 'n')

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tag2ns = nil) ⇒ NS

Returns a new instance of NS.



47
48
49
50
51
52
# File 'lib/xsd/ns.rb', line 47

def initialize(tag2ns = nil)
  @tag2ns = tag2ns || ns_default
  @ns2tag = @tag2ns.invert
  @assigner = nil
  @default_namespace = nil
end

Instance Attribute Details

#default_namespaceObject (readonly)

Returns the value of attribute default_namespace.



41
42
43
# File 'lib/xsd/ns.rb', line 41

def default_namespace
  @default_namespace
end

Instance Method Details

#assign(ns, tag = nil) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/xsd/ns.rb', line 59

def assign(ns, tag = nil)
  if tag == ''
    if ns.empty?
      @default_namespace = nil
    else
      @default_namespace = ns
    end
    tag
  else
    @assigner ||= Assigner.new(default_known_tag)
    tag ||= @assigner.assign(ns)
    @ns2tag[ns] = tag
    @tag2ns[tag] = ns
    tag
  end
end

#assigned?(ns) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/xsd/ns.rb', line 76

def assigned?(ns)
  @default_namespace == ns or @ns2tag.key?(ns)
end

#assigned_as_tagged?(ns) ⇒ Boolean

Returns:

  • (Boolean)


80
81
82
# File 'lib/xsd/ns.rb', line 80

def assigned_as_tagged?(ns)
  @ns2tag.key?(ns)
end

#assigned_tag?(tag) ⇒ Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/xsd/ns.rb', line 84

def assigned_tag?(tag)
  @tag2ns.key?(tag)
end

#clone_nsObject



88
89
90
91
92
93
# File 'lib/xsd/ns.rb', line 88

def clone_ns
  cloned = self.class.new(@tag2ns.dup)
  cloned.assigner = @assigner
  cloned.assign(@default_namespace, '') if @default_namespace
  cloned
end

#compare(ns, name, rhs) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
# File 'lib/xsd/ns.rb', line 114

def compare(ns, name, rhs)
  if (ns == @default_namespace)
    return true if (name == rhs)
  end
  @tag2ns.each do |assigned_tag, assigned_ns|
    if assigned_ns == ns && "#{assigned_tag}:#{name}" == rhs
	return true
    end
  end
  false
end

#each_nsObject



159
160
161
162
163
# File 'lib/xsd/ns.rb', line 159

def each_ns
  @ns2tag.each do |ns, tag|
    yield(ns, tag)
  end
end

#known_tagObject



54
55
56
57
# File 'lib/xsd/ns.rb', line 54

def known_tag
  @assigner ||= Assigner.new(default_known_tag)
  @assigner.known_tag
end

#name(qname) ⇒ Object



95
96
97
98
99
100
101
102
103
# File 'lib/xsd/ns.rb', line 95

def name(qname)
  if qname.namespace == @default_namespace
    qname.name
  elsif tag = @ns2tag[qname.namespace]
    "#{tag}:#{qname.name}"
  else
    raise FormatError.new("namespace: #{qname.namespace} not defined yet")
  end
end

#name_attr(qname) ⇒ Object

no default namespace



106
107
108
109
110
111
112
# File 'lib/xsd/ns.rb', line 106

def name_attr(qname)
  if tag = @ns2tag[qname.namespace]
    "#{tag}:#{qname.name}"
  else
    raise FormatError.new("namespace: #{qname.namespace} not defined yet")
  end
end

#parse(str, local = false) ⇒ Object



129
130
131
132
133
134
135
136
# File 'lib/xsd/ns.rb', line 129

def parse(str, local = false)
  if ParseRegexp =~ str
    if (name = $2) and (ns = @tag2ns[$1])
      return XSD::QName.new(ns, name)
    end
  end
  XSD::QName.new(local ? nil : @default_namespace, str)
end

#parse_local(elem) ⇒ Object

For local attribute key parsing

<foo xmlns="urn:a" xmlns:n1="urn:a" bar="1" n1:baz="2" />
  =>
{}bar, {urn:a}baz


142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/xsd/ns.rb', line 142

def parse_local(elem)
  ParseRegexp =~ elem
  if $2
    ns = @tag2ns[$1]
    name = $2
    if !ns
	raise FormatError.new("unknown namespace qualifier: #{$1}")
    end
  elsif $1
    ns = nil
    name = $1
  else
    raise FormatError.new("illegal element format: #{elem}")
  end
  XSD::QName.new(ns, name)
end