reline 0.2.8.pre.4 → 0.2.8.pre.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e7c5785424de4deda942cdd54cab39bc7d96fd79b1451095626996b875a32d9
4
- data.tar.gz: 3afcf3fc84d2b3d4dd48481bca613a8fc08de049983619772e9fcd502caffa83
3
+ metadata.gz: fca2b6f76f8c59a18589d6d730f7f159e25b95e639ae7d6866f772e9bb2655ab
4
+ data.tar.gz: 61b69c3d01f74b957c6a2d646e58021cad4b49031d4fdf6437f2303d417d5f36
5
5
  SHA512:
6
- metadata.gz: c1be959cdf8fc499ec71184bc3768964dbc1eb078085bbd8303a6d9b4b0ade3ccd25a8d90486c620316b38c4dfe7b7fb224d99912ff855bd8bc3fc64946f1d5d
7
- data.tar.gz: cfe31c94298208f8cda2c7fddeba8940e71589c60b06167fcb81e8c0d278055ffd94261713d1aa3a2d6031d6572c3dc9194412d15e57f83d0fb81e87361496c0
6
+ metadata.gz: 561ffdbf39c095852f0a642178d5328329cea072fdc91c32bd11edfdcecb4846414006961b6fe7adbf63c825022a8634d5a563fdeb574d127088b536967e1f9c
7
+ data.tar.gz: 07e62e55ca7a45d3b747724823b26af09d109f9620ba82914cfaf7e6100251bb76bd0de7b01b9829b51e41248a32b028bbbb3617c7d4eedfc2c1d05ab701a236
@@ -538,12 +538,13 @@ class Reline::LineEditor
538
538
  end
539
539
 
540
540
  class Dialog
541
- attr_reader :name
542
- attr_accessor :scroll_top, :column, :vertical_offset, :contents, :lines_backup
541
+ attr_reader :name, :contents, :width
542
+ attr_accessor :scroll_top, :column, :vertical_offset, :lines_backup
543
543
 
544
544
  def initialize(name, proc_scope)
545
545
  @name = name
546
546
  @proc_scope = proc_scope
547
+ @width = nil
547
548
  @scroll_top = 0
548
549
  end
549
550
 
@@ -551,6 +552,17 @@ class Reline::LineEditor
551
552
  @proc_scope.set_cursor_pos(col, row)
552
553
  end
553
554
 
555
+ def width=(v)
556
+ @width = v
557
+ end
558
+
559
+ def contents=(contents)
560
+ @contents = contents
561
+ if contents and @width.nil?
562
+ @width = contents.map{ |line| Reline::Unicode.calculate_width(line, true) }.max
563
+ end
564
+ end
565
+
554
566
  def call
555
567
  @proc_scope.set_dialog(self)
556
568
  @proc_scope.call
@@ -577,10 +589,8 @@ class Reline::LineEditor
577
589
  end
578
590
  dialog.set_cursor_pos(cursor_column, @first_line_started_from + @started_from)
579
591
  dialog_render_info = dialog.call
580
- old_dialog_contents = dialog.contents
581
- old_dialog_column = dialog.column
582
- old_dialog_vertical_offset = dialog.vertical_offset
583
- start = 0
592
+ dialog.width = dialog_render_info.width if dialog_render_info and dialog_render_info.width
593
+ old_dialog = dialog.clone
584
594
  if dialog_render_info and dialog_render_info.contents and not dialog_render_info.contents.empty?
585
595
  height = dialog_render_info.height || DIALOG_HEIGHT
586
596
  pointer = dialog_render_info.pointer
@@ -613,7 +623,7 @@ class Reline::LineEditor
613
623
  upper_space = @first_line_started_from - @started_from
614
624
  lower_space = @highest_in_all - @first_line_started_from - @started_from - 1
615
625
  dialog.column = dialog_render_info.pos.x
616
- diff = (dialog.column + DIALOG_WIDTH) - (@screen_size.last - 1)
626
+ diff = (dialog.column + dialog.width) - (@screen_size.last - 1)
617
627
  if diff > 0
618
628
  dialog.column -= diff
619
629
  end
@@ -629,7 +639,7 @@ class Reline::LineEditor
629
639
  dialog.vertical_offset = dialog_render_info.pos.y + 1
630
640
  end
631
641
  Reline::IOGate.hide_cursor
632
- reset_dialog(dialog, old_dialog_contents, old_dialog_column, old_dialog_vertical_offset)
642
+ reset_dialog(dialog, old_dialog)
633
643
  move_cursor_down(dialog.vertical_offset)
634
644
  Reline::IOGate.move_cursor_column(dialog.column)
635
645
  dialog.contents.each_with_index do |item, i|
@@ -642,7 +652,7 @@ class Reline::LineEditor
642
652
  bg_color = '46'
643
653
  end
644
654
  end
645
- @output.write "\e[#{bg_color}m%-#{DIALOG_WIDTH}s\e[49m" % item.slice(0, DIALOG_WIDTH)
655
+ @output.write "\e[#{bg_color}m%-#{dialog.width}s\e[49m" % Reline::Unicode.take_range(item, 0, dialog.width)
646
656
  Reline::IOGate.move_cursor_column(dialog.column)
647
657
  move_cursor_down(1) if i < (dialog.contents.size - 1)
648
658
  end
@@ -658,8 +668,8 @@ class Reline::LineEditor
658
668
  }
659
669
  end
660
670
 
661
- private def reset_dialog(dialog, old_dialog_contents, old_dialog_column, old_dialog_vertical_offset)
662
- return if dialog.lines_backup.nil? or old_dialog_contents.nil?
671
+ private def reset_dialog(dialog, old_dialog)
672
+ return if dialog.lines_backup.nil? or old_dialog.contents.nil?
663
673
  prompt, prompt_width, prompt_list = check_multiline_prompt(dialog.lines_backup[:lines], prompt)
664
674
  visual_lines = []
665
675
  visual_start = nil
@@ -675,76 +685,76 @@ class Reline::LineEditor
675
685
  old_y = dialog.lines_backup[:first_line_started_from] + dialog.lines_backup[:started_from]
676
686
  y = @first_line_started_from + @started_from
677
687
  y_diff = y - old_y
678
- if (old_y + old_dialog_vertical_offset) < (y + dialog.vertical_offset)
688
+ if (old_y + old_dialog.vertical_offset) < (y + dialog.vertical_offset)
679
689
  # rerender top
680
- move_cursor_down(old_dialog_vertical_offset - y_diff)
681
- start = visual_start + old_dialog_vertical_offset
682
- line_num = dialog.vertical_offset - old_dialog_vertical_offset
690
+ move_cursor_down(old_dialog.vertical_offset - y_diff)
691
+ start = visual_start + old_dialog.vertical_offset
692
+ line_num = dialog.vertical_offset - old_dialog.vertical_offset
683
693
  line_num.times do |i|
684
- Reline::IOGate.move_cursor_column(old_dialog_column)
694
+ Reline::IOGate.move_cursor_column(old_dialog.column)
685
695
  if visual_lines[start + i].nil?
686
- s = ' ' * DIALOG_WIDTH
696
+ s = ' ' * dialog.width
687
697
  else
688
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog_column, DIALOG_WIDTH)
698
+ s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, dialog.width)
689
699
  end
690
- @output.write "\e[39m\e[49m%-#{DIALOG_WIDTH}s\e[39m\e[49m" % s
700
+ @output.write "\e[39m\e[49m%-#{dialog.width}s\e[39m\e[49m" % s
691
701
  move_cursor_down(1) if i < (line_num - 1)
692
702
  end
693
- move_cursor_up(old_dialog_vertical_offset + line_num - 1 - y_diff)
703
+ move_cursor_up(old_dialog.vertical_offset + line_num - 1 - y_diff)
694
704
  end
695
- if (old_y + old_dialog_vertical_offset + old_dialog_contents.size) > (y + dialog.vertical_offset + dialog.contents.size)
705
+ if (old_y + old_dialog.vertical_offset + old_dialog.contents.size) > (y + dialog.vertical_offset + dialog.contents.size)
696
706
  # rerender bottom
697
707
  move_cursor_down(dialog.vertical_offset + dialog.contents.size - y_diff)
698
708
  start = visual_start + dialog.vertical_offset + dialog.contents.size
699
- line_num = (old_dialog_vertical_offset + old_dialog_contents.size) - (dialog.vertical_offset + dialog.contents.size)
709
+ line_num = (old_dialog.vertical_offset + old_dialog.contents.size) - (dialog.vertical_offset + dialog.contents.size)
700
710
  line_num.times do |i|
701
- Reline::IOGate.move_cursor_column(old_dialog_column)
711
+ Reline::IOGate.move_cursor_column(old_dialog.column)
702
712
  if visual_lines[start + i].nil?
703
- s = ' ' * DIALOG_WIDTH
713
+ s = ' ' * dialog.width
704
714
  else
705
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog_column, DIALOG_WIDTH)
715
+ s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, dialog.width)
706
716
  end
707
- @output.write "\e[39m\e[49m%-#{DIALOG_WIDTH}s\e[39m\e[49m" % s
717
+ @output.write "\e[39m\e[49m%-#{dialog.width}s\e[39m\e[49m" % s
708
718
  move_cursor_down(1) if i < (line_num - 1)
709
719
  end
710
720
  move_cursor_up(dialog.vertical_offset + dialog.contents.size + line_num - 1 - y_diff)
711
721
  end
712
- if old_dialog_column < dialog.column
722
+ if old_dialog.column < dialog.column
713
723
  # rerender left
714
- move_cursor_down(old_dialog_vertical_offset - y_diff)
715
- width = dialog.column - old_dialog_column
716
- start = visual_start + old_dialog_vertical_offset
717
- line_num = old_dialog_contents.size
724
+ move_cursor_down(old_dialog.vertical_offset - y_diff)
725
+ width = dialog.column - old_dialog.column
726
+ start = visual_start + old_dialog.vertical_offset
727
+ line_num = old_dialog.contents.size
718
728
  line_num.times do |i|
719
- Reline::IOGate.move_cursor_column(old_dialog_column)
729
+ Reline::IOGate.move_cursor_column(old_dialog.column)
720
730
  if visual_lines[start + i].nil?
721
731
  s = ' ' * width
722
732
  else
723
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog_column, width)
733
+ s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column, width)
724
734
  end
725
735
  @output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s
726
736
  move_cursor_down(1) if i < (line_num - 1)
727
737
  end
728
- move_cursor_up(old_dialog_vertical_offset + line_num - 1 - y_diff)
738
+ move_cursor_up(old_dialog.vertical_offset + line_num - 1 - y_diff)
729
739
  end
730
- if (old_dialog_column + DIALOG_WIDTH) > (dialog.column + DIALOG_WIDTH)
740
+ if (old_dialog.column + old_dialog.width) > (dialog.column + dialog.width)
731
741
  # rerender right
732
- move_cursor_down(old_dialog_vertical_offset + y_diff)
733
- width = (old_dialog_column + DIALOG_WIDTH) - (dialog.column + DIALOG_WIDTH)
734
- start = visual_start + old_dialog_vertical_offset
735
- line_num = old_dialog_contents.size
742
+ move_cursor_down(old_dialog.vertical_offset + y_diff)
743
+ width = (old_dialog.column + old_dialog.width) - (dialog.column + dialog.width)
744
+ start = visual_start + old_dialog.vertical_offset
745
+ line_num = old_dialog.contents.size
736
746
  line_num.times do |i|
737
- Reline::IOGate.move_cursor_column(old_dialog_column + DIALOG_WIDTH)
747
+ Reline::IOGate.move_cursor_column(old_dialog.column + dialog.width)
738
748
  if visual_lines[start + i].nil?
739
749
  s = ' ' * width
740
750
  else
741
- s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog_column + DIALOG_WIDTH, width)
751
+ s = Reline::Unicode.take_range(visual_lines[start + i], old_dialog.column + dialog.width, width)
742
752
  end
743
- Reline::IOGate.move_cursor_column(dialog.column + DIALOG_WIDTH)
753
+ Reline::IOGate.move_cursor_column(dialog.column + dialog.width)
744
754
  @output.write "\e[39m\e[49m%-#{width}s\e[39m\e[49m" % s
745
755
  move_cursor_down(1) if i < (line_num - 1)
746
756
  end
747
- move_cursor_up(old_dialog_vertical_offset + line_num - 1 + y_diff)
757
+ move_cursor_up(old_dialog.vertical_offset + line_num - 1 + y_diff)
748
758
  end
749
759
  Reline::IOGate.move_cursor_column((prompt_width + @cursor) % @screen_size.last)
750
760
  end
@@ -778,10 +788,10 @@ class Reline::LineEditor
778
788
  dialog_vertical_size.times do |i|
779
789
  if i < visual_lines_under_dialog.size
780
790
  Reline::IOGate.move_cursor_column(0)
781
- @output.write "\e[39m\e[49m%-#{DIALOG_WIDTH}s\e[39m\e[49m" % visual_lines_under_dialog[i]
791
+ @output.write "\e[39m\e[49m%-#{dialog.width}s\e[39m\e[49m" % visual_lines_under_dialog[i]
782
792
  else
783
793
  Reline::IOGate.move_cursor_column(dialog.column)
784
- @output.write "\e[39m\e[49m#{' ' * DIALOG_WIDTH}\e[39m\e[49m"
794
+ @output.write "\e[39m\e[49m#{' ' * dialog.width}\e[39m\e[49m"
785
795
  end
786
796
  Reline::IOGate.erase_after_cursor
787
797
  move_cursor_down(1) if i < (dialog_vertical_size - 1)
@@ -186,9 +186,9 @@ class Reline::Unicode
186
186
  end
187
187
 
188
188
  # Take a chunk of a String with escape sequences.
189
- def self.take_range(str, col, length, encoding = str.encoding)
189
+ def self.take_range(str, start_col, max_width, encoding = str.encoding)
190
190
  chunk = String.new(encoding: encoding)
191
- width = 0
191
+ total_width = 0
192
192
  rest = str.encode(Encoding::UTF_8)
193
193
  in_zero_width = false
194
194
  rest.scan(WIDTH_SCANNER) do |gc|
@@ -206,9 +206,10 @@ class Reline::Unicode
206
206
  if in_zero_width
207
207
  chunk << gc
208
208
  else
209
- width = get_mbchar_width(gc)
210
- break if (width + length) <= col
211
- chunk << gc if col <= width
209
+ mbchar_width = get_mbchar_width(gc)
210
+ total_width += mbchar_width
211
+ break if (start_col + max_width) < total_width
212
+ chunk << gc if start_col < total_width
212
213
  end
213
214
  end
214
215
  end
@@ -1,3 +1,3 @@
1
1
  module Reline
2
- VERSION = '0.2.8.pre.4'
2
+ VERSION = '0.2.8.pre.5'
3
3
  end
data/lib/reline.rb CHANGED
@@ -18,7 +18,7 @@ module Reline
18
18
 
19
19
  Key = Struct.new('Key', :char, :combined_char, :with_meta)
20
20
  CursorPos = Struct.new(:x, :y)
21
- DialogRenderInfo = Struct.new(:pos, :contents, :pointer, :bg_color, :height, keyword_init: true)
21
+ DialogRenderInfo = Struct.new(:pos, :contents, :pointer, :bg_color, :width, :height, keyword_init: true)
22
22
 
23
23
  class Core
24
24
  ATTR_READER_NAMES = %i(
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.8.pre.4
4
+ version: 0.2.8.pre.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - aycabta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-08-30 00:00:00.000000000 Z
11
+ date: 2021-08-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: io-console