Class: XSD::NS

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

Defined Under Namespace

Classes: Assigner, FormatError

Constant Summary collapse

Namespace =
'http://www.w3.org/XML/1998/namespace'
ParseRegexp =

$1 and $2 are necessary.

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(tag2ns = nil) ⇒ NS

Returns a new instance of NS.


35
36
37
38
39
40
41
# File 'lib/xsd/ns.rb', line 35

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

Instance Attribute Details

#default_namespaceObject (readonly)

Returns the value of attribute default_namespace


29
30
31
# File 'lib/xsd/ns.rb', line 29

def default_namespace
  @default_namespace
end

Instance Method Details

#assign(ns, tag = nil) ⇒ Object


43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/xsd/ns.rb', line 43

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

#assigned?(ns) ⇒ Boolean

Returns:

  • (Boolean)

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

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

#assigned_tag?(tag) ⇒ Boolean

Returns:

  • (Boolean)

60
61
62
# File 'lib/xsd/ns.rb', line 60

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

#clone_nsObject


64
65
66
67
68
69
# File 'lib/xsd/ns.rb', line 64

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

#compare(ns, name, rhs) ⇒ Object


81
82
83
84
85
86
87
88
89
90
91
# File 'lib/xsd/ns.rb', line 81

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


126
127
128
129
130
# File 'lib/xsd/ns.rb', line 126

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

#name(name) ⇒ Object


71
72
73
74
75
76
77
78
79
# File 'lib/xsd/ns.rb', line 71

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

#parse(str, local = false) ⇒ Object


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

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

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

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