xbrlware-ruby19 1.1.2.19
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +4 -0
- data/Rakefile +2 -0
- data/lib/xbrlware-ruby19/cgi_patch.rb +58 -0
- data/lib/xbrlware-ruby19/constants.rb +29 -0
- data/lib/xbrlware-ruby19/context.rb +193 -0
- data/lib/xbrlware-ruby19/date_util.rb +45 -0
- data/lib/xbrlware-ruby19/float_patch.rb +26 -0
- data/lib/xbrlware-ruby19/hash_util.rb +175 -0
- data/lib/xbrlware-ruby19/instance.rb +475 -0
- data/lib/xbrlware-ruby19/item.rb +123 -0
- data/lib/xbrlware-ruby19/linkbase/calculation_linkbase.rb +181 -0
- data/lib/xbrlware-ruby19/linkbase/definition_linkbase.rb +226 -0
- data/lib/xbrlware-ruby19/linkbase/label_linkbase.rb +132 -0
- data/lib/xbrlware-ruby19/linkbase/linkbase.rb +193 -0
- data/lib/xbrlware-ruby19/linkbase/presentation_linkbase.rb +204 -0
- data/lib/xbrlware-ruby19/meta_util.rb +50 -0
- data/lib/xbrlware-ruby19/ns_aware.rb +5 -0
- data/lib/xbrlware-ruby19/taxonomies/ifrs_taxonomy_20090401.rb +8278 -0
- data/lib/xbrlware-ruby19/taxonomies/us_gaap_taxonomy_20090131.rb +40365 -0
- data/lib/xbrlware-ruby19/taxonomy.rb +143 -0
- data/lib/xbrlware-ruby19/unit.rb +43 -0
- data/lib/xbrlware-ruby19/util.rb +86 -0
- data/lib/xbrlware-ruby19/version.rb +22 -0
- data/lib/xbrlware-ruby19/xml_parser.rb +142 -0
- data/lib/xbrlware-ruby19.rb +73 -0
- data/xbrlware-ruby19.gemspec +27 -0
- metadata +109 -0
@@ -0,0 +1,181 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# Author:: xbrlware@bitstat.com
|
4
|
+
#
|
5
|
+
# Copyright:: 2009, 2010 bitstat (http://www.bitstat.com). All Rights Reserved.
|
6
|
+
#
|
7
|
+
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
module Xbrlware
|
21
|
+
module Linkbase
|
22
|
+
class CalculationLinkbase < Linkbase
|
23
|
+
# Creates a CalculationLinkbase.
|
24
|
+
#
|
25
|
+
# linkbase_path::
|
26
|
+
# XBRL Calculation Linkbase source. Tries to load and parse calculationlinkbase from path.
|
27
|
+
#
|
28
|
+
# instance::
|
29
|
+
# Instance object
|
30
|
+
#
|
31
|
+
# label_linkbase::
|
32
|
+
# optional parameter, LabelLinkbase object
|
33
|
+
def initialize(linkbase_path, instance, label_linkbase=nil)
|
34
|
+
super linkbase_path
|
35
|
+
@instance=instance
|
36
|
+
@label_linkbase=label_linkbase
|
37
|
+
@cal_content_optimized=nil
|
38
|
+
end
|
39
|
+
|
40
|
+
def calculation(role=nil)
|
41
|
+
calculations=[]
|
42
|
+
|
43
|
+
if @cal_content_optimized.nil?
|
44
|
+
calc_content=@linkbase_content["calculationLink"]
|
45
|
+
@cal_content_optimized = []
|
46
|
+
calc_content.each_with_index do |cal, index|
|
47
|
+
next if cal["loc"].nil? || cal["calculationArc"].nil?
|
48
|
+
cal["loc"].map! do |e|
|
49
|
+
e["xlink:label"]="#{e['xlink:label']}_#{index}"
|
50
|
+
e
|
51
|
+
end
|
52
|
+
|
53
|
+
cal["calculationArc"].map! do |e|
|
54
|
+
e["xlink:from"]="#{e['xlink:from']}_#{index}"
|
55
|
+
e["xlink:to"]="#{e['xlink:to']}_#{index}"
|
56
|
+
e
|
57
|
+
end
|
58
|
+
selected=@cal_content_optimized.select {|cal_existing| cal_existing["xlink:role"]==cal["xlink:role"]}[0]
|
59
|
+
if selected.nil?
|
60
|
+
@cal_content_optimized << cal
|
61
|
+
else
|
62
|
+
cal["loc"].each do |current|
|
63
|
+
matched_loc=nil
|
64
|
+
selected["loc"].each do |existing|
|
65
|
+
if existing["xlink:href"]==current["xlink:href"]
|
66
|
+
matched_loc=current
|
67
|
+
cal["calculationArc"].each do |arc|
|
68
|
+
arc["xlink:from"] = existing["xlink:label"] if current["xlink:label"]==arc["xlink:from"]
|
69
|
+
arc["xlink:to"] = existing["xlink:label"] if current["xlink:label"]==arc["xlink:to"]
|
70
|
+
end
|
71
|
+
break
|
72
|
+
end
|
73
|
+
end
|
74
|
+
selected["loc"] << current if matched_loc.nil?
|
75
|
+
end
|
76
|
+
selected["calculationArc"] += cal["calculationArc"]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
@cal_content_optimized.each do |cal|
|
82
|
+
next unless cal["xlink:role"]==role unless role.nil?
|
83
|
+
|
84
|
+
if cal["calculationArc"].nil?
|
85
|
+
calculations << Calculation.new(@instance.entity_details, cal["xlink:title"], cal["xlink:role"], @role_map[cal["xlink:role"]])
|
86
|
+
else
|
87
|
+
contexts_and_arcs=arcs(cal)
|
88
|
+
calculations << Calculation.new(@instance.entity_details, cal["xlink:title"], cal["xlink:role"], @role_map[cal["xlink:role"]], contexts_and_arcs["arcs"], contexts_and_arcs["contexts"])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
return calculations[0] unless role.nil?
|
92
|
+
calculations
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
def fetch_label(label_name, pref_label)
|
97
|
+
pref_label="http://www.xbrl.org/2003/role/label" if pref_label.nil?
|
98
|
+
label_obj=@label_linkbase.label(label_name, pref_label)
|
99
|
+
label = label_obj.value unless label_obj.nil?
|
100
|
+
return label
|
101
|
+
end
|
102
|
+
|
103
|
+
def arcs(calc)
|
104
|
+
locators={}
|
105
|
+
calc["loc"].each do |loc|
|
106
|
+
href = loc["xlink:href"]
|
107
|
+
unless href.index("#").nil?
|
108
|
+
locators[loc["xlink:label"]]= href[href.index("#")+1, href.length]
|
109
|
+
else
|
110
|
+
locators[loc["xlink:label"]]=href
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
arc_map={}
|
115
|
+
contexts = Set.new()
|
116
|
+
|
117
|
+
calc["calculationArc"].each do |arc|
|
118
|
+
from_label, to_label=nil, nil
|
119
|
+
unless @label_linkbase.nil?
|
120
|
+
to_label = fetch_label(locators[arc["xlink:to"]], arc["preferredLabel"])
|
121
|
+
from_label = fetch_label(locators[arc["xlink:from"]], arc["preferredLabel"])
|
122
|
+
end
|
123
|
+
|
124
|
+
to = Calculation::CalculationArc.new(arc["xlink:to"], locators[arc["xlink:to"]], arc["xlink:arcrole"], arc["order"], arc["weight"], arc["priority"], arc["use"], to_label)
|
125
|
+
from = Calculation::CalculationArc.new(arc["xlink:from"], locators[arc["xlink:from"]], role=nil, order=nil, weight=nil, priority=nil, use=nil, label=from_label)
|
126
|
+
|
127
|
+
to_item_name = locators[arc["xlink:to"]].gsub(/.*_/, "")
|
128
|
+
from_item_name = locators[arc["xlink:from"]].gsub(/.*_/, "")
|
129
|
+
|
130
|
+
to_item_map=item_map(@instance.item(to_item_name))
|
131
|
+
to.items=to_item_map.values
|
132
|
+
contexts.merge(to_item_map.keys)
|
133
|
+
|
134
|
+
from_item_map=item_map(@instance.item(from_item_name))
|
135
|
+
from.items=from_item_map.values
|
136
|
+
contexts.merge(from_item_map.keys)
|
137
|
+
|
138
|
+
if arc_map.has_key?(from)
|
139
|
+
arc_map[from] << to
|
140
|
+
else
|
141
|
+
arc_map[from]=[to]
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
return {"contexts" => contexts, "arcs" => Linkbase.build_relationship(arc_map)}
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
def item_map(items)
|
150
|
+
item_map={}
|
151
|
+
items.each do |item|
|
152
|
+
item_map[item.context]=item
|
153
|
+
end unless items.nil?
|
154
|
+
item_map
|
155
|
+
end
|
156
|
+
|
157
|
+
public
|
158
|
+
class Calculation < Linkbase::Link
|
159
|
+
|
160
|
+
attr_reader :contexts, :entity_details
|
161
|
+
|
162
|
+
def initialize(entity_details, title, role, href=nil, arcs=nil, contexts=nil)
|
163
|
+
super("Calculation", title, role, href, arcs)
|
164
|
+
@contexts=contexts
|
165
|
+
@entity_details=entity_details
|
166
|
+
end
|
167
|
+
|
168
|
+
class CalculationArc < Linkbase::Link::Arc
|
169
|
+
attr_reader :weight, :use
|
170
|
+
|
171
|
+
def initialize(item_id, href, role=nil, order=nil, weight=nil, priority=nil, use=nil, label=nil)
|
172
|
+
super item_id, href, role, order, priority, label
|
173
|
+
@weight=weight.to_i
|
174
|
+
@use=use
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# Author:: xbrlware@bitstat.com
|
4
|
+
#
|
5
|
+
# Copyright:: 2009, 2010 bitstat (http://www.bitstat.com). All Rights Reserved.
|
6
|
+
#
|
7
|
+
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
module Xbrlware
|
21
|
+
module Linkbase
|
22
|
+
class DefinitionLinkbase < Linkbase
|
23
|
+
|
24
|
+
@@constants = {"primaryItem-hypercube" => "http://xbrl.org/int/dim/arcrole/all",
|
25
|
+
"hypercube-dimension" => "http://xbrl.org/int/dim/arcrole/hypercube-dimension",
|
26
|
+
"dimension-domain" => "http://xbrl.org/int/dim/arcrole/dimension-domain",
|
27
|
+
"domain-member" => "http://xbrl.org/int/dim/arcrole/domain-member"}
|
28
|
+
|
29
|
+
# Creates a DefinitionLinkbase.
|
30
|
+
#
|
31
|
+
# linkbase_path::
|
32
|
+
# XBRL Definition Linkbase source. Tries to load and parse definition linkbase from path.
|
33
|
+
#
|
34
|
+
# label_linkbase::
|
35
|
+
# optional parameter, takes LabelLinkbase object
|
36
|
+
def initialize(linkbase_path, label_linkbase=nil)
|
37
|
+
super linkbase_path
|
38
|
+
@label_linkbase=label_linkbase
|
39
|
+
@def_content_optimized=nil
|
40
|
+
end
|
41
|
+
|
42
|
+
def definition(role=nil)
|
43
|
+
|
44
|
+
definitions=[]
|
45
|
+
|
46
|
+
if @def_content_optimized.nil?
|
47
|
+
def_content=@linkbase_content["definitionLink"]
|
48
|
+
|
49
|
+
@def_content_optimized = []
|
50
|
+
def_content.each_with_index do |_def, index|
|
51
|
+
next if _def["loc"].nil? || _def["definitionArc"].nil?
|
52
|
+
_def["loc"].map! do |e|
|
53
|
+
e["xlink:label"]="#{e['xlink:label']}_#{index}"
|
54
|
+
e
|
55
|
+
end
|
56
|
+
|
57
|
+
_def["definitionArc"].map! do |e|
|
58
|
+
e["xlink:from"]="#{e['xlink:from']}_#{index}"
|
59
|
+
e["xlink:to"]="#{e['xlink:to']}_#{index}"
|
60
|
+
e
|
61
|
+
end
|
62
|
+
selected=@def_content_optimized.select {|def_existing| def_existing["xlink:role"]==_def["xlink:role"]}[0]
|
63
|
+
if selected.nil?
|
64
|
+
@def_content_optimized << _def
|
65
|
+
else
|
66
|
+
_def["loc"].each do |current|
|
67
|
+
matched_loc=nil
|
68
|
+
selected["loc"].each do |existing|
|
69
|
+
if existing["xlink:href"]==current["xlink:href"]
|
70
|
+
matched_loc=current
|
71
|
+
_def["definitionArc"].each do |arc|
|
72
|
+
arc["xlink:from"] = existing["xlink:label"] if current["xlink:label"]==arc["xlink:from"]
|
73
|
+
arc["xlink:to"] = existing["xlink:label"] if current["xlink:label"]==arc["xlink:to"]
|
74
|
+
end
|
75
|
+
break
|
76
|
+
end
|
77
|
+
end
|
78
|
+
selected["loc"] << current if matched_loc.nil?
|
79
|
+
end
|
80
|
+
selected["definitionArc"] += _def["definitionArc"]
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
@def_content_optimized.each do |def_|
|
86
|
+
|
87
|
+
next unless def_["xlink:role"]==role unless role.nil?
|
88
|
+
|
89
|
+
if def_["definitionArc"].nil?
|
90
|
+
definitions << Definition.new(def_["xlink:title"], def_["xlink:role"], @role_map[def_["xlink:role"]])
|
91
|
+
else
|
92
|
+
arcs=arcs(def_)
|
93
|
+
definitions << Definition.new(def_["xlink:title"], def_["xlink:role"], @role_map[def_["xlink:role"]], primary_items(arcs))
|
94
|
+
end
|
95
|
+
end
|
96
|
+
return definitions[0] unless role.nil?
|
97
|
+
definitions
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
def primary_items(arcs)
|
102
|
+
items=Set.new
|
103
|
+
arcs.each do |arc|
|
104
|
+
arc.children.each do |child|
|
105
|
+
if child.role==@@constants["primaryItem-hypercube"]
|
106
|
+
items << arc
|
107
|
+
break
|
108
|
+
end
|
109
|
+
end if arc.has_children?
|
110
|
+
end
|
111
|
+
|
112
|
+
items.each do |primary_item|
|
113
|
+
|
114
|
+
hypercubes=[]
|
115
|
+
primary_item.children.each do |p_child|
|
116
|
+
hypercubes << p_child if p_child.role==@@constants["primaryItem-hypercube"]
|
117
|
+
end if primary_item.has_children?
|
118
|
+
primary_item.children = hypercubes
|
119
|
+
MetaUtil::introduce_instance_alias(primary_item, "hypercubes", "children")
|
120
|
+
|
121
|
+
primary_item.hypercubes.each do |hypercube|
|
122
|
+
dimensions=[]
|
123
|
+
hypercube.children.each do |h_child|
|
124
|
+
dimensions << h_child if h_child.role==@@constants["hypercube-dimension"]
|
125
|
+
end if hypercube.has_children?
|
126
|
+
hypercube.children=dimensions
|
127
|
+
MetaUtil::introduce_instance_alias(hypercube, "dimensions", "children")
|
128
|
+
|
129
|
+
hypercube.dimensions.each do |dimension|
|
130
|
+
domains=[]
|
131
|
+
dimension.children.each do |di_child|
|
132
|
+
domains << di_child if di_child.role==@@constants["dimension-domain"]
|
133
|
+
end if dimension.has_children?
|
134
|
+
dimension.children=domains
|
135
|
+
MetaUtil::introduce_instance_alias(dimension, "domains", "children")
|
136
|
+
|
137
|
+
dimension.domains.each do |domain|
|
138
|
+
members=[]
|
139
|
+
domain.children.each do |do_child|
|
140
|
+
members << do_child if do_child.role==@@constants["domain-member"]
|
141
|
+
end if domain.has_children?
|
142
|
+
MetaUtil::introduce_instance_alias(domain, "members", "children")
|
143
|
+
MetaUtil::introduce_instance_writer(domain, "members", "children")
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
items
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
def arcs(def_)
|
153
|
+
|
154
|
+
locators={}
|
155
|
+
def_["loc"].each do |loc|
|
156
|
+
href = loc["xlink:href"]
|
157
|
+
unless href.index("#").nil?
|
158
|
+
locators[loc["xlink:label"]]= href[href.index("#")+1, href.length]
|
159
|
+
else
|
160
|
+
locators[loc["xlink:label"]]=href
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
arc_map={}
|
165
|
+
|
166
|
+
def_["definitionArc"].each do |arc|
|
167
|
+
|
168
|
+
to_label = nil
|
169
|
+
unless @label_linkbase.nil?
|
170
|
+
to_label_obj=@label_linkbase.label(locators[arc["xlink:to"]], arc["preferredLabel"]) unless arc["preferredLabel"].nil?
|
171
|
+
to_label_obj=@label_linkbase.label(locators[arc["xlink:to"]], "http://www.xbrl.org/2003/role/label") if arc["preferredLabel"].nil?
|
172
|
+
to_label = to_label_obj.value unless to_label_obj.nil?
|
173
|
+
end
|
174
|
+
|
175
|
+
to = Definition::DefinitionArc.new(arc["xlink:to"], locators[arc["xlink:to"]], arc["xlink:arcrole"], arc["order"], arc["priority"], to_label, arc["xbrldt:contextElement"])
|
176
|
+
from = Definition::DefinitionArc.new(arc["xlink:from"], locators[arc["xlink:from"]])
|
177
|
+
|
178
|
+
if arc_map.has_key?(from)
|
179
|
+
arc_map[from] << to
|
180
|
+
else
|
181
|
+
arc_map[from]=[to]
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
return Linkbase.build_relationship(arc_map)
|
186
|
+
end
|
187
|
+
|
188
|
+
public
|
189
|
+
class Definition < Linkbase::Link
|
190
|
+
|
191
|
+
attr_reader :primary_items
|
192
|
+
|
193
|
+
def initialize(title, role, href=nil, primary_items=nil)
|
194
|
+
super("Definition", title, role, href, primary_items)
|
195
|
+
@primary_items=primary_items
|
196
|
+
end
|
197
|
+
|
198
|
+
def dimension_domain_map
|
199
|
+
dim_dom_map={}
|
200
|
+
@primary_items.each do |primary_item|
|
201
|
+
primary_item.hypercubes.each do |hypercube|
|
202
|
+
hypercube.dimensions.each do |dimension|
|
203
|
+
domains=[]
|
204
|
+
dimension.domains.each do |domain|
|
205
|
+
domains << domain.href.sub("_", ":")
|
206
|
+
end
|
207
|
+
dim_dom_map[dimension.href.sub("_", ":")]=domains if domains.size > 0
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end unless @primary_items.nil?
|
211
|
+
dim_dom_map
|
212
|
+
end
|
213
|
+
|
214
|
+
class DefinitionArc < Linkbase::Link::Arc
|
215
|
+
attr_reader :ctx_element
|
216
|
+
|
217
|
+
def initialize(item_id, href, role=nil, order=nil, priority=nil, label=nil, ctx_element=nil)
|
218
|
+
super item_id, href, role, order, priority, label
|
219
|
+
@ctx_element=ctx_element
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
#
|
3
|
+
# Author:: xbrlware@bitstat.com
|
4
|
+
#
|
5
|
+
# Copyright:: 2009, 2010 bitstat (http://www.bitstat.com). All Rights Reserved.
|
6
|
+
#
|
7
|
+
# License:: Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
# you may not use this file except in compliance with the License.
|
9
|
+
# You may obtain a copy of the License at
|
10
|
+
#
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
#
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
16
|
+
# implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
module Xbrlware
|
21
|
+
module Linkbase
|
22
|
+
class LabelLinkbase < Linkbase
|
23
|
+
# Creates a LabelLinkbase.
|
24
|
+
#
|
25
|
+
# linkbase_path::
|
26
|
+
# XBRL Label Linkbase source. Tries to load and parse label linkbase from path.
|
27
|
+
def initialize(linkbase_path)
|
28
|
+
super linkbase_path
|
29
|
+
@label_map={}
|
30
|
+
parse_content
|
31
|
+
end
|
32
|
+
|
33
|
+
def label(item_name, label_role=nil, language=["en-US", "en"])
|
34
|
+
return @label_map[item_name] if label_role.nil?
|
35
|
+
return @label_map[item_name][label_role] unless @label_map[item_name].nil? if language.nil?
|
36
|
+
return @label_map[item_name][label_role][language] unless @label_map[item_name].nil? || @label_map[item_name][label_role].nil? if language.is_a?(String)
|
37
|
+
language.each do |lang|
|
38
|
+
lab = @label_map[item_name][label_role][lang] unless @label_map[item_name].nil? || @label_map[item_name][label_role].nil?
|
39
|
+
return lab unless lab.nil?
|
40
|
+
end if language.is_a?(Array)
|
41
|
+
return nil
|
42
|
+
end
|
43
|
+
|
44
|
+
def inspect
|
45
|
+
self.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
def print(verbose_flag="q")
|
49
|
+
str = StringIO.new
|
50
|
+
@label_map.each do |key, value|
|
51
|
+
str << key
|
52
|
+
if verbose_flag=="v"
|
53
|
+
value.each do |k, v|
|
54
|
+
str << "\n" << "\t"
|
55
|
+
str << " role [" << k << "]"
|
56
|
+
str << "\n" << "\t\t"
|
57
|
+
v.each do |lang, label|
|
58
|
+
str << " lang [" << lang << "] label [" << label.value << "]"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
str << "\n"
|
63
|
+
end
|
64
|
+
puts str.string
|
65
|
+
return self.to_s
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def parse_content()
|
70
|
+
|
71
|
+
label_links=@linkbase_content["labelLink"]
|
72
|
+
label_links.each do |label_content|
|
73
|
+
next if label_content["loc"].nil? || label_content["labelArc"].nil?
|
74
|
+
loc_map=locator_map(label_content["loc"])
|
75
|
+
arc_map=linkarc_map(label_content["labelArc"])
|
76
|
+
|
77
|
+
labels=label_content["label"]
|
78
|
+
labels.each do |label|
|
79
|
+
l=Label.new(label["xlink:type"], label["xlink:role"], label["xlink:label"], label["xml:lang"], label["content"], @role_map[label["xlink:role"]])
|
80
|
+
item_name=loc_map[arc_map[label["xlink:label"]]]
|
81
|
+
if @label_map[item_name].nil?
|
82
|
+
@label_map[item_name]={l.role => {l.lang => l}}
|
83
|
+
else
|
84
|
+
if @label_map[item_name][l.role].nil?
|
85
|
+
@label_map[item_name][l.role] = {l.lang => l}
|
86
|
+
else
|
87
|
+
@label_map[item_name][l.role][l.lang] = l
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def linkarc_map(arcs)
|
95
|
+
arc_map={}
|
96
|
+
arcs.each do |arc|
|
97
|
+
arc_map[arc["xlink:to"]]=arc["xlink:from"]
|
98
|
+
end
|
99
|
+
arc_map
|
100
|
+
end
|
101
|
+
|
102
|
+
def locator_map(locators)
|
103
|
+
locator_map={}
|
104
|
+
locators.each do |loc|
|
105
|
+
href = loc["xlink:href"]
|
106
|
+
unless href.index("#").nil?
|
107
|
+
locator_map[loc["xlink:label"]]=href[href.index("#")+1, href.length]
|
108
|
+
else
|
109
|
+
locator_map[loc["xlink:label"]]=href
|
110
|
+
end
|
111
|
+
end
|
112
|
+
locator_map
|
113
|
+
end
|
114
|
+
|
115
|
+
public
|
116
|
+
class Label
|
117
|
+
|
118
|
+
attr_reader :type, :role, :href, :label, :lang, :value
|
119
|
+
|
120
|
+
def initialize(type, role, label, lang, value, href=nil)
|
121
|
+
@type=type
|
122
|
+
@role=role
|
123
|
+
@label=label
|
124
|
+
@lang=lang
|
125
|
+
@value=value
|
126
|
+
@href=href
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|