This commit is contained in:
65
lib/ezdoc/style.rb
Normal file
65
lib/ezdoc/style.rb
Normal file
@@ -0,0 +1,65 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Ezdoc
|
||||
class Style
|
||||
attr_reader :name, :bold, :italic, :underline, :color, :size, :font,
|
||||
:align, :indent, :spacing_before, :spacing_after
|
||||
|
||||
ALIGNMENTS = %i[left center right justify].freeze
|
||||
|
||||
def initialize(name, bold: nil, italic: nil, underline: nil, color: nil,
|
||||
size: nil, font: nil, align: nil, indent: nil,
|
||||
spacing_before: nil, spacing_after: nil)
|
||||
@name = name
|
||||
@bold = bold
|
||||
@italic = italic
|
||||
@underline = underline
|
||||
@color = normalize_color(color)
|
||||
@size = size
|
||||
@font = font
|
||||
@align = validate_align(align)
|
||||
@indent = indent
|
||||
@spacing_before = spacing_before
|
||||
@spacing_after = spacing_after
|
||||
end
|
||||
|
||||
def style_id
|
||||
name.to_s.split("_").map(&:capitalize).join
|
||||
end
|
||||
|
||||
def display_name
|
||||
name.to_s.split("_").map(&:capitalize).join(" ")
|
||||
end
|
||||
|
||||
def paragraph_properties?
|
||||
!!(align || indent || spacing_before || spacing_after)
|
||||
end
|
||||
|
||||
def text_properties?
|
||||
!!(bold || italic || underline || color || size || font)
|
||||
end
|
||||
|
||||
# Size in half-points for OOXML (14pt = 28 half-points)
|
||||
def size_half_points
|
||||
size ? (size * 2).to_i : nil
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def normalize_color(color)
|
||||
return nil if color.nil?
|
||||
|
||||
hex = color.to_s.sub(/^#/, "").upcase
|
||||
return hex if hex.match?(/\A[0-9A-F]{6}\z/)
|
||||
|
||||
raise ArgumentError, "Invalid color: #{color}. Use 6-digit hex (e.g., 'FF0000')"
|
||||
end
|
||||
|
||||
def validate_align(align)
|
||||
return nil if align.nil?
|
||||
return align if ALIGNMENTS.include?(align)
|
||||
|
||||
raise ArgumentError, "Invalid alignment: #{align}. Use #{ALIGNMENTS.join(", ")}"
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user