33
34
35
36
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
|
# File 'lib/ruby3mf/content_types.rb', line 33
def self.parse(zip_entry)
found_types = {}
found_overrides = {}
Log3mf.context "parse" do |l|
begin
doc = XmlVal.validate_parse(zip_entry)
l.warning '[Content_Types].xml must contain exactly one root node' unless doc.children.size == 1
l.warning '[Content_Types].xml must contain root name Types' unless doc.children.first.name == "Types"
required_content_types = ['application/vnd.openxmlformats-package.relationships+xml']
extensions = doc.css(*['Default']).map{|node| node.attributes['Extension']&.value}.flatten
l.error :duplicate_content_extension_types unless extensions.uniq.length == extensions.length
l.error :empty_default_extension if extensions.include?("")
override_extensions = doc.css(*['Override']).map{|node| node.attributes['PartName']&.value}.flatten
l.error :duplicate_content_override_types unless override_extensions.uniq.length == override_extensions.length
found_types = Hash[*doc.css(*['Default']).map{|node| [node.attributes['Extension']&.value&.downcase,node.attributes['ContentType']&.value]}.flatten]
found_overrides = Hash[*doc.css(*['Override']).map{|node| [node.attributes['PartName']&.value&.downcase,node.attributes['ContentType']&.value]}.flatten]
required_content_types.each do |req_type|
l.error :invalid_content_type, mt: req_type unless found_types.values.include?(req_type)
end
doc.css(*['Default']).each do |node|
extension = node['Extension']&.downcase
l.info "Setting type hash #{extension}=#{node['ContentType']}"
end
doc.css(*['Override']).each do |node|
l.error :empty_override_part_name if node['PartName']&.downcase&.empty?
end
doc.css('Types').xpath('.//*').select do |node|
l.warning "[Content_Types].xml:#{node.line} contains unexpected element #{node.name}", page: 10 unless ['Default', 'Override'].include?(node.name)
end
rescue Nokogiri::XML::SyntaxError => e
l.error :content_types_invalid_xml, e: "#{e}"
end
end
return new(found_types, found_overrides)
end
|