3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
# File 'lib/ruby3mf/model3mf.rb', line 3
def self.parse(document, zip_entry)
model_doc = nil
Log3mf.context "parsing model" do |l|
begin
model_doc = Nokogiri::XML(zip_entry.get_input_stream) do |config|
config.strict.nonet.noblanks
end
l.info "We Found a Model, and it's XML!"
rescue Nokogiri::XML::SyntaxError => e
l.fatal_error "Model file invalid XML. Exception #{e}"
end
l.context "verifying 3D payload required resources" do |l|
required_resources = model_doc.css("//model//resources//*[path]").collect { |n| n["path"] }
relationship_resources = document.relationships.map { |relationship| relationship[:target] }
missing_resources = (required_resources - relationship_resources)
if missing_resources.empty?
l.info "All model required resources are defined in .rels relationship files."
else
missing_resources.each { |mr|
l.error "Missing required resource: #{mr} Resource referenced in model, but not in .rels relationship file", page: 10
}
end
l.context "verifying 3D resource types" do |l|
model_types = model_doc.css("//model//resources//*[path]").collect { |t| t["contenttype"] }
all_types = document.types.map { |t, v| v }
bad_types = (model_types - all_types)
if bad_types.empty?
l.info "All model resource contenttypes are valid"
else
bad_types.each { |bt|
puts "bad type: #{bt}"
l.error "resource in model has invalid contenttype #{bt}", page: 10
}
end
end
end
end
model_doc
end
|