From 17045d86313a9d06784dcddecf3887a4da893929 Mon Sep 17 00:00:00 2001 From: laelnasan Date: Sat, 5 Dec 2020 11:43:54 -0300 Subject: [PATCH 1/5] Supports utf8 printing and input Changes to be committed: modified: src/ltui/label.lua modified: src/ltui/textedit.lua --- src/ltui/label.lua | 16 ++++++++++++++-- src/ltui/textedit.lua | 10 +++++++--- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/ltui/label.lua b/src/ltui/label.lua index 2e33f05..4e7c16a 100644 --- a/src/ltui/label.lua +++ b/src/ltui/label.lua @@ -127,8 +127,20 @@ function label:splitext(text, width) for idx = 1, #lines do local line = lines[idx] while #line > width do - table.insert(result, line:sub(1, width)) - line = line:sub(width + 1) + local size = 0 + for i = 1, #line do + if line:byte(i) < 0x80 or line:byte(i) >= 0xc0 then + size = size + 1 + if size > width then + table.insert(result, line:sub(1, i - 1)) + line = line:sub(i) + break + end + end + end + if size <= width then + break + end end table.insert(result, line) end diff --git a/src/ltui/textedit.lua b/src/ltui/textedit.lua index 0acef24..b2efbf5 100644 --- a/src/ltui/textedit.lua +++ b/src/ltui/textedit.lua @@ -77,8 +77,8 @@ function textedit:on_event(e) -- update text if e.type == event.ev_keyboard then - if e.key_code > 0x1f and e.key_code < 0x7f then - self:text_set(self:text() .. e.key_name) + if e.key_code > 0x1f and e.key_code < 0x100 then + self:text_set(self:text() .. string.char(e.key_code)) return true elseif e.key_name == "Enter" and self:option("multiline") then self:text_set(self:text() .. '\n') @@ -86,7 +86,11 @@ function textedit:on_event(e) elseif e.key_name == "Backspace" then local text = self:text() if #text > 0 then - self:text_set(text:sub(1, #text - 1)) + local ch_size = -1 + while text:byte(ch_size) > 0x7f and text:byte(ch_size) < 0xc0 do + ch_size = ch_size - 1 + end + self:text_set(text:sub(1, #text + ch_size)) end return true elseif e.key_name == "CtrlV" then From 96f1aa0cdf6dbebf996fca0ad8bcaa7ba292fcde Mon Sep 17 00:00:00 2001 From: laelnasan Date: Sat, 5 Dec 2020 11:58:19 -0300 Subject: [PATCH 2/5] code enhancement Changes to be committed: modified: src/ltui/label.lua modified: src/ltui/textedit.lua --- src/ltui/label.lua | 2 +- src/ltui/textedit.lua | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ltui/label.lua b/src/ltui/label.lua index 4e7c16a..62bdf3c 100644 --- a/src/ltui/label.lua +++ b/src/ltui/label.lua @@ -129,7 +129,7 @@ function label:splitext(text, width) while #line > width do local size = 0 for i = 1, #line do - if line:byte(i) < 0x80 or line:byte(i) >= 0xc0 then + if (line:byte(i) & 0xc0) ~= 0x80 then size = size + 1 if size > width then table.insert(result, line:sub(1, i - 1)) diff --git a/src/ltui/textedit.lua b/src/ltui/textedit.lua index b2efbf5..2b3df2d 100644 --- a/src/ltui/textedit.lua +++ b/src/ltui/textedit.lua @@ -77,7 +77,7 @@ function textedit:on_event(e) -- update text if e.type == event.ev_keyboard then - if e.key_code > 0x1f and e.key_code < 0x100 then + if e.key_code > 0x1f and e.key_code < 0x100 then self:text_set(self:text() .. string.char(e.key_code)) return true elseif e.key_name == "Enter" and self:option("multiline") then @@ -86,11 +86,12 @@ function textedit:on_event(e) elseif e.key_name == "Backspace" then local text = self:text() if #text > 0 then - local ch_size = -1 - while text:byte(ch_size) > 0x7f and text:byte(ch_size) < 0xc0 do - ch_size = ch_size - 1 + local size = 1 + -- while continuation byte + while (text:byte(#text - size) & 0xc0) == 0x80 do + size = size + 1 end - self:text_set(text:sub(1, #text + ch_size)) + self:text_set(text:sub(1, #text - size)) end return true elseif e.key_name == "CtrlV" then From 9e6516e25748384a4877bc762da02f09f0328678 Mon Sep 17 00:00:00 2001 From: laelnasan Date: Sat, 5 Dec 2020 12:25:52 -0300 Subject: [PATCH 3/5] textedit correction Changes to be committed: modified: src/ltui/textedit.lua --- src/ltui/textedit.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ltui/textedit.lua b/src/ltui/textedit.lua index 2b3df2d..aa1c058 100644 --- a/src/ltui/textedit.lua +++ b/src/ltui/textedit.lua @@ -88,7 +88,7 @@ function textedit:on_event(e) if #text > 0 then local size = 1 -- while continuation byte - while (text:byte(#text - size) & 0xc0) == 0x80 do + while (text:byte(#text - size + 1) & 0xc0) == 0x80 do size = size + 1 end self:text_set(text:sub(1, #text - size)) From 7e0e3809d7d2a3267fbc9db710af5a9f0b53b808 Mon Sep 17 00:00:00 2001 From: laelnasan Date: Sat, 5 Dec 2020 15:00:42 -0300 Subject: [PATCH 4/5] input control order change Changes to be committed: modified: src/ltui/textedit.lua --- src/ltui/textedit.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ltui/textedit.lua b/src/ltui/textedit.lua index aa1c058..de89d9d 100644 --- a/src/ltui/textedit.lua +++ b/src/ltui/textedit.lua @@ -77,10 +77,7 @@ function textedit:on_event(e) -- update text if e.type == event.ev_keyboard then - if e.key_code > 0x1f and e.key_code < 0x100 then - self:text_set(self:text() .. string.char(e.key_code)) - return true - elseif e.key_name == "Enter" and self:option("multiline") then + if e.key_name == "Enter" and self:option("multiline") then self:text_set(self:text() .. '\n') return true elseif e.key_name == "Backspace" then @@ -100,6 +97,9 @@ function textedit:on_event(e) self:text_set(self:text() .. pastetext) end return true + elseif e.key_code > 0x1f and e.key_code < 0x100 then + self:text_set(self:text() .. string.char(e.key_code)) + return true end end From 20ca3e6ca2df2d5dbd702f09b39b4761bd98cbce Mon Sep 17 00:00:00 2001 From: laelnasan Date: Sat, 5 Dec 2020 15:53:51 -0300 Subject: [PATCH 5/5] restrict input to only valid utf8 bytes --- src/ltui/textedit.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ltui/textedit.lua b/src/ltui/textedit.lua index de89d9d..7ade8df 100644 --- a/src/ltui/textedit.lua +++ b/src/ltui/textedit.lua @@ -97,7 +97,7 @@ function textedit:on_event(e) self:text_set(self:text() .. pastetext) end return true - elseif e.key_code > 0x1f and e.key_code < 0x100 then + elseif e.key_code > 0x1f and e.key_code < 0xf8 then self:text_set(self:text() .. string.char(e.key_code)) return true end