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.



737
738
739
740
741
742
# File 'lib/tui.rb', line 737

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.



735
736
737
# File 'lib/tui.rb', line 735

def z_index
  @z_index
end

Instance Method Details

#empty?Boolean

Returns:

  • (Boolean)


806
807
808
# File 'lib/tui.rb', line 806

def empty?
  @segments.empty?
end

#has_wide?Boolean

Returns:

  • (Boolean)


759
760
761
# File 'lib/tui.rb', line 759

def has_wide?
  @has_wide
end

#to_s(width: nil) ⇒ Object



777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
# File 'lib/tui.rb', line 777

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



794
795
796
797
798
799
800
801
802
803
804
# File 'lib/tui.rb', line 794

def visible_width(rendered_str)
  if @has_wide
    # Has emoji - use delta: string length + extra width from wide chars
    stripped = rendered_str.include?("\e") ? rendered_str.gsub(/\e\[[0-9;]*[A-Za-z]/, '') : rendered_str
    stripped.length + @width_delta
  else
    # Pure ASCII - just string length
    stripped = rendered_str.include?("\e") ? rendered_str.gsub(/\e\[[0-9;]*[A-Za-z]/, '') : rendered_str
    stripped.length
  end
end

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



744
745
746
747
748
749
750
751
752
753
754
755
756
757
# File 'lib/tui.rb', line 744

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



769
770
771
# File 'lib/tui.rb', line 769

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

#write_dim(text) ⇒ Object



765
766
767
# File 'lib/tui.rb', line 765

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

#write_highlight(text) ⇒ Object



773
774
775
# File 'lib/tui.rb', line 773

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