lib/vedeu/dsl/helpers/align.rb
# frozen_string_literal: true
module Vedeu
module DSL
# Aligns a text value based on given options when building views.
#
# @api private
#
class Align
extend Forwardable
include Vedeu::Common
def_delegators :alignment,
:centre_aligned?,
:left_aligned?,
:right_aligned?,
:unaligned?
# @param value [String]
# @param options [Hash]
# @option options align [Symbol]
# @option options name [String|Symbol]
# @option options pad [String]
# @option options width [Fixnum]
# @return [Vedeu::DSL::Align]
def initialize(value = '', options = {})
@value = value || ''
@options = defaults.merge!(options)
end
# @return [String]
def text
if unaligned?
value
elsif left_aligned?
left
elsif centre_aligned?
centre
elsif right_aligned?
right
else
value
end
end
protected
# @!attribute [r] options
# @return [Hash]
attr_reader :options
# @!attribute [r] value
# @return [String]
attr_reader :value
private
# @return [Vedeu::Coercers::Alignment]
def alignment
@_alignment ||= Vedeu::Coercers::Alignment.coerce(options[:align])
end
# The value padded to width, centralized.
#
# @return [String]
def centre
value.center(width, options[:pad])
end
alias center centre
# @macro defaults_method
def defaults
{
align: :left,
name: nil,
pad: ' ',
width: nil,
}
end
# @macro geometry_by_name
def geometry
@_geometry ||= Vedeu.geometries.by_name(options[:name])
end
# The value padded to width, left justified. See {#width}.
#
# @return [String]
def left
value.ljust(width, options[:pad])
end
# The value padded to width, right justified.
#
# @return [String]
def right
value.rjust(width, options[:pad])
end
# Return the width given in the options. If no :width option was
# set, but a :name option was set, then we can use the width of
# the interface to determine the correct width to use. There is
# a caveat in this; if the :align option was set to :left, but
# no :width provided, then we don't want to use the interface's
# width. The reason being, is that there may be another stream
# in this line which will not appear by default as it will be
# push right out of the visible area.
#
# Return the width of the interface when a name is given,
# otherwise use the given width.
#
# @return [Fixnum]
def width
if present?(options[:width])
options[:width]
elsif present?(options[:name])
if left_aligned?
value.size
else
geometry.bordered_width
end
else
value.size
end
end
end # Align
end # DSL
end # Vedeu