about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--main.lua2
-rw-r--r--text.lua12
-rw-r--r--text_tests.lua18
3 files changed, 27 insertions, 5 deletions
diff --git a/main.lua b/main.lua
index 227c149..6adf53c 100644
--- a/main.lua
+++ b/main.lua
@@ -194,6 +194,8 @@ function App.draw()
   Button_handlers = {}
   love.graphics.setColor(1, 1, 1)
   love.graphics.rectangle('fill', 0, 0, App.screen.width-1, App.screen.height-1)
+--?   love.graphics.setColor(0, 1, 0)
+--?   love.graphics.line(Line_width,0, Line_width,App.screen.height)
   love.graphics.setColor(0, 0, 0)
 
   -- some hysteresis while resizing
diff --git a/text.lua b/text.lua
index e636564..80f6f45 100644
--- a/text.lua
+++ b/text.lua
@@ -110,17 +110,19 @@ function Text.compute_fragments(line, line_width)
 --?           print(frag, x, frag_width, line_width)
           -- long word; chop it at some letter
           -- We're not going to reimplement TeX here.
-          local b = Text.nearest_pos_less_than(frag, line_width - x)
-          assert(b > 0)  -- avoid infinite loop when window is too narrow
---?           print('space for '..tostring(b)..' graphemes')
-          local frag1 = string.sub(frag, 1, b)
+          local bpos = Text.nearest_pos_less_than(frag, line_width - x)
+          assert(bpos > 0)  -- avoid infinite loop when window is too narrow
+          local boffset = utf8.offset(frag, bpos+1)  -- byte _after_ bpos
+          assert(boffset)
+--?           print('space for '..tostring(bpos)..' graphemes, '..tostring(boffset)..' bytes')
+          local frag1 = string.sub(frag, 1, boffset-1)
           local frag1_text = App.newText(love.graphics.getFont(), frag1)
           local frag1_width = App.width(frag1_text)
 --?           print(frag, x, frag1_width, line_width)
           assert(x + frag1_width <= line_width)
 --?           print('inserting '..frag1..' of width '..tostring(frag1_width)..'px')
           table.insert(line.fragments, {data=frag1, text=frag1_text})
-          frag = string.sub(frag, b+1)
+          frag = string.sub(frag, boffset)
           frag_text = App.newText(love.graphics.getFont(), frag)
           frag_width = App.width(frag_text)
         end
diff --git a/text_tests.lua b/text_tests.lua
index 93e953c..8aa7085 100644
--- a/text_tests.lua
+++ b/text_tests.lua
@@ -109,6 +109,24 @@ function test_draw_text_wrapping_within_word()
   App.screen.check(y, 'jk', 'F - test_draw_text_wrapping_within_word/screen:3')
 end
 
+function test_draw_wrapping_text_containing_non_ascii()
+  -- draw a long line containing non-ASCII
+  io.write('\ntest_draw_wrapping_text_containing_non_ascii')
+  App.screen.init{width=60, height=60}
+  Lines = load_array{'madam I’m adam', 'xyz'}  -- notice the non-ASCII apostrophe
+  Line_width = App.screen.width
+  Cursor1 = {line=1, pos=1}
+  Screen_top1 = {line=1, pos=1}
+  Screen_bottom1 = {}
+  App.draw()
+  local y = Margin_top
+  App.screen.check(y, 'mada', 'F - test_draw_wrapping_text_containing_non_ascii/screen:1')
+  y = y + Line_height
+  App.screen.check(y, 'm I’', 'F - test_draw_wrapping_text_containing_non_ascii/screen:2')
+  y = y + Line_height
+  App.screen.check(y, 'm ad', 'F - test_draw_wrapping_text_containing_non_ascii/screen:3')
+end
+
 function test_edit_wrapping_text()
   io.write('\ntest_edit_wrapping_text')
   App.screen.init{width=50, height=60}