[ruby/reline] Fix split_by_width to retain color sequences

(https://github.com/ruby/reline/pull/490)

* Fix split_by_width to retain color sequences

* Add OSC escape sequence testcase of Reline::Unicode.split_by_width
This commit is contained in:
tomoya ishida 2023-03-26 00:01:30 +09:00 committed by git
parent 9bc2dbd33c
commit 60ca800d4f
2 changed files with 15 additions and 1 deletions

View file

@ -160,16 +160,21 @@ class Reline::Unicode
width = 0
rest = str.encode(Encoding::UTF_8)
in_zero_width = false
seq = String.new(encoding: encoding)
rest.scan(WIDTH_SCANNER) do |gc|
case
when gc[NON_PRINTING_START_INDEX]
in_zero_width = true
lines.last << NON_PRINTING_START
when gc[NON_PRINTING_END_INDEX]
in_zero_width = false
lines.last << NON_PRINTING_END
when gc[CSI_REGEXP_INDEX]
lines.last << gc[CSI_REGEXP_INDEX]
seq << gc[CSI_REGEXP_INDEX]
when gc[OSC_REGEXP_INDEX]
lines.last << gc[OSC_REGEXP_INDEX]
seq << gc[OSC_REGEXP_INDEX]
when gc[GRAPHEME_CLUSTER_INDEX]
gc = gc[GRAPHEME_CLUSTER_INDEX]
unless in_zero_width
@ -177,7 +182,7 @@ class Reline::Unicode
if (width += mbchar_width) > max_width
width = mbchar_width
lines << nil
lines << String.new(encoding: encoding)
lines << seq.dup
height += 1
end
end