Class: Tui::SegmentWriter

Inherits:
Object
  • Object
show all
Includes:
Helpers
Defined in:
lib/tui.rb

Defined Under Namespace

Classes: EmojiSegment, FillSegment

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Helpers

#accent, #bold, #dim, #emoji, #fill, #highlight

Constructor Details

#initialize(z_index: 1) ⇒ SegmentWriter

Returns a new instance of SegmentWriter.



685
686
687
688
689
690
# File 'lib/tui.rb', line 685

def initialize(z_index: 1)
  @segments = []
  @z_index = z_index
  @has_wide = false
  @width_delta = 0  # Extra width from wide chars (width - bytecount)
end

Instance Attribute Details

#z_indexObject

Returns the value of attribute z_index.



683
684
685
# File 'lib/tui.rb', line 683

def z_index
  @z_index
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


747
748
749
# File 'lib/tui.rb', line 747

def empty?
  @segments.empty?
end

#has_wide?Boolean

Returns:

  • (Boolean)


707
708
709
# File 'lib/tui.rb', line 707

def has_wide?
  @has_wide
end

#to_s(width: nil) ⇒ Object



725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
# File 'lib/tui.rb', line 725

def to_s(width: nil)
  rendered = String.new
  @segments.each do |segment|
    case segment
    when FillSegment
      raise ArgumentError, "fill requires width context" unless width
      rendered << render_fill(segment, rendered, width)
    when EmojiSegment
      rendered << segment.to_s
    else
      rendered << segment.to_s
    end
  end
  rendered
end

#visible_width(rendered_str) ⇒ Object

Fast width calculation using precomputed emoji widths



742
743
744
745
# File 'lib/tui.rb', line 742

def visible_width(rendered_str)
  stripped = rendered_str.include?("\e") ? rendered_str.gsub(ANSI_STRIP_RE, '') : rendered_str
  @has_wide ? stripped.length + @width_delta : stripped.length
end

#write(text = "") ⇒ Object Also known as: <<



692
693
694
695
696
697
698
699
700
701
702
703
704
705
# File 'lib/tui.rb', line 692

def write(text = "")
  return self if text.nil?
  if text.respond_to?(:empty?) && text.empty?
    return self
  end

  segment = normalize_segment(text)
  if segment.is_a?(EmojiSegment)
    @has_wide = true
    @width_delta += segment.width_delta
  end
  @segments << segment
  self
end

#write_bold(text) ⇒ Object



717
718
719
# File 'lib/tui.rb', line 717

def write_bold(text)
  write(style_segment(text, :bold) { |value| bold(value) })
end

#write_dim(text) ⇒ Object



713
714
715
# File 'lib/tui.rb', line 713

def write_dim(text)
  write(style_segment(text, :dim) { |value| dim(value) })
end

#write_highlight(text) ⇒ Object



721
722
723
# File 'lib/tui.rb', line 721

def write_highlight(text)
  write(style_segment(text, :highlight) { |value| highlight(value) })
end