openxml/openxml-package

View on GitHub
lib/openxml/parts/content_types.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "nokogiri"

module OpenXml
  module Parts
    class ContentTypes < OpenXml::Part
      attr_reader :defaults, :overrides

      REQUIRED_DEFAULTS = {
        "xml" => Types::XML,
        "rels" => Types::RELATIONSHIPS
      }.freeze

      def self.parse(xml)
        document = Nokogiri::XML(xml)
        self.new.tap do |part|
          document.css("Default").each do |default|
            part.add_default default["Extension"], default["ContentType"]
          end
          document.css("Override").each do |default|
            part.add_override default["PartName"], default["ContentType"]
          end
        end
      end

      def initialize(defaults={}, overrides={})
        @defaults = REQUIRED_DEFAULTS.merge(defaults)
        @overrides = overrides
      end

      def add_default(extension, content_type)
        defaults[extension] = content_type
      end

      def add_override(part_name, content_type)
        overrides[part_name] = content_type
      end

      def of(path)
        overrides.fetch(path, defaults[File.extname(path)[1..-1]])
      end

      def to_xml
        build_standalone_xml do |xml|
          xml.Types(xmlns: "http://schemas.openxmlformats.org/package/2006/content-types") {
            defaults.each { |extension, content_type| xml.Default("Extension" => extension, "ContentType" => content_type) }
            overrides.each { |part_name, content_type| xml.Override("PartName" => part_name, "ContentType" => content_type) }
          }
        end
      end

    end
  end
end