openxml/openxml-docx

View on GitHub
lib/openxml/docx/properties/tab.rb

Summary

Maintainability
A
0 mins
Test Coverage
module OpenXml
  module Docx
    module Properties
      class Tab < BaseProperty
        attr_reader :position, :type, :leader

        VALID_TYPES = %i(bar center clear decimal end num start left right)
        VALID_LEADERS = [nil, :dot, :heavy, :hyphen, :middleDot, :none, :underscore]

        def initialize(position, type, leader=nil)
          self.position = position
          self.type = type
          self.leader = leader
        end

        def position=(value)
          raise ArgumentError, invalid_position_message unless valid_position?(value)
          @position = value
        end

        def type=(value)
          raise ArgumentError, invalid_type_message unless valid_type?(value)
          @type = value
        end

        def leader=(value)
          raise ArgumentError, invalid_leader_message unless valid_leader?(value)
          @leader = value
        end

        def to_xml(xml)
          xml["w"].public_send(tag, xml_attributes)
        end

      private

        def xml_attributes
          attrs = { "w:pos" => position,
                    "w:val" => type}
          attrs["w:leader"] = leader if leader
          attrs
        end

        def invalid_position_message
          "Invalid position: must be an integer"
        end

        def valid_position?(value)
          value.is_a?(Integer)
        end

        def invalid_type_message
          "Invalid type: must be one of: #{VALID_TYPES.join(", ")}"
        end

        def valid_type?(value)
          VALID_TYPES.member? value
        end

        def invalid_leader_message
          "Invalid leader: must be one of: #{VALID_LEADERS.join(", ")}"
        end

        def valid_leader?(value)
          VALID_LEADERS.member? value
        end

      end
    end
  end
end