Class: Tui::SegmentWriter
- Inherits:
-
Object
- Object
- Tui::SegmentWriter
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
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 end
|
Instance Attribute Details
#z_index ⇒ Object
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
806
807
808
|
# File 'lib/tui.rb', line 806
def empty?
@segments.empty?
end
|
#has_wide? ⇒ 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
stripped = rendered_str.include?("\e") ? rendered_str.gsub(/\e\[[0-9;]*[A-Za-z]/, '') : rendered_str
stripped.length + @width_delta
else
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
|