openxml/openxml-docx

View on GitHub
lib/openxml/docx/root_namespaces.rb

Summary

Maintainability
A
0 mins
Test Coverage
module OpenXml
  module Docx
    module RootNamespaces

      POSSIBLE_NAMESPACES = {
        wpc: "http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas".freeze,
        mo: "http://schemas.microsoft.com/office/mac/office/2008/main".freeze,
        mv: "urn:schemas-microsoft-com:mac:vml".freeze,
        o: "urn:schemas-microsoft-com:office:office".freeze,
        r: "http://schemas.openxmlformats.org/officeDocument/2006/relationships".freeze,
        m: "http://schemas.openxmlformats.org/officeDocument/2006/math".freeze,
        v: "urn:schemas-microsoft-com:vml".freeze,
        wp14: "http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing".freeze,
        wp: "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing".freeze,
        w10: "urn:schemas-microsoft-com:office:word".freeze,
        w14: "http://schemas.microsoft.com/office/word/2010/wordml".freeze,
        w15: "http://schemas.microsoft.com/office/word/2012/wordml".freeze,
        wpg: "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup".freeze,
        wpi: "http://schemas.microsoft.com/office/word/2010/wordprocessingInk".freeze,
        wne: "http://schemas.microsoft.com/office/word/2006/wordml".freeze,
        wps: "http://schemas.microsoft.com/office/word/2010/wordprocessingShape".freeze,
        w: "http://schemas.openxmlformats.org/wordprocessingml/2006/main".freeze,
        mc: "http://schemas.openxmlformats.org/markup-compatibility/2006".freeze,
        a: "http://schemas.openxmlformats.org/drawingml/2006/main".freeze,
        a14: "http://schemas.microsoft.com/office/drawing/2010/main".freeze,
        pic: "http://schemas.openxmlformats.org/drawingml/2006/picture".freeze
      }

      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods

        def use_namespaces(*args)
          args.each do |arg|
            prefix = arg.to_sym
            raise ArgumentError, "Reference to undefined namespace prefix: #{prefix}" if POSSIBLE_NAMESPACES[prefix].nil?
            active_namespaces << prefix unless active_namespaces.include?(prefix)
          end
        end
        alias :use_namespace :use_namespaces

        def can_ignore(*args)
          args.each { |arg| ignorable_namespaces[arg.to_sym] = true }
        end

        def ignorable_namespaces
          @ignorable_namespaces ||= {}
        end

        def active_namespaces
          @active_namespaces ||= []
        end

      end

      private

        def root_namespaces
          namespace_defs = {}
          unless self.class.ignorable_namespaces.empty?
            namespace_defs["mc:Ignorable"] = self.class.ignorable_namespaces.keys.join(" ")
            self.class.use_namespace :mc
          end
          self.class.active_namespaces.map do |prefix|
            namespace_defs["xmlns:#{prefix}"] = POSSIBLE_NAMESPACES[prefix]
          end
          namespace_defs
        end

    end
  end
end