rockbox/apps/plugins/lua/include_lua/create_kbd_layout.lua
William Wilgus 9b2f23319c lua fix yellow and add temploader
temp loader allows some lua requires to be loaded and
later garbage collected unfortunately the module needs to be formatted
in such a way to pass back a call table in order to keep the functions
within from being garbage collected too early

BE AWARE this bypasses the module loader which would allow code reuse
so if you aren't careful this memory saving tool could spell disaster
for free RAM if you load the same code multiple times

Change-Id: I0b6f81e481b8c779edbd620c8403794f8353926f
2021-05-03 23:13:25 -04:00

90 lines
3 KiB
Lua

--create keyboard layout
--BILGUS 4/2021
-- kbdlayout = require("create_kbd_layout")
-- local layout = kbdlayout.create_keyboard_layout("abcd")
local _kbdlayout = {} do
local function encode_short(n)
return string.char(bit.band(0x00FF, n), bit.rshift(bit.band(0xFF00, n), 8))
end
local function utf8decode(str)
local INVALID = 0xfffd
local t = {}
local function check_char(c)
local tail = false
local code
c = string.byte(c)
if (c <= 0x7f) or (c >= 0xc2) then
-- Start of new character
if (c < 0x80) then -- U-00000000 - U-0000007F, 1 string.byte
code = c;
elseif (c < 0xe0) then -- U-00000080 - U-000007FF, 2 string.bytes
tail = 1;
code = bit.band(c, 0x1f)
elseif (c < 0xf0) then -- U-00000800 - U-0000FFFF, 3 string.bytes
tail = 2;
code = bit.band(c, 0x0f)
elseif (c < 0xf5) then -- U-00010000 - U-001FFFFF, 4 string.bytes
tail = 3;
code = bit.band(c, 0x07)
else
-- Invalid size
code = 0xfffd;
end
while tail and c ~= 0 do
tail = tail - 1
if bit.band(c, 0xc0) == 0x80 then
-- Valid continuation character
code = bit.bor(bit.lshift(code, 6),bit.band(c, 0x3f))
else
-- Invalid continuation char
code = INVALID;
break;
end
end
else
-- Invalid UTF-8 char
code = INVALID;
end
-- currently we don't support chars above U-FFFF
t[#t + 1 ] = encode_short((code < 0x10000) and code or 0xfffd)
end
str:gsub(".", check_char) -- run check function for every char
return table.concat(t)
end
local function create_keyboard_layout(s_layout)
local insert = table.insert
lines = {}
local t={}
for str in string.gmatch(s_layout, "([^\n]+)") do
local len = string.len(str)
lines[#lines + 1] =
table.concat({encode_short(len), utf8decode(str)})
end
lines[#lines + 1] = encode_short(0xFEFF)
return table.concat(lines)
end
_kbdlayout.create_keyboard_layout = create_keyboard_layout
_kbdlayout.utf8decode = utf8decode
end
--[[
local name = "Test_KBD_LAYOUT_" .. tostring(1)
local test = _kbdlayout.create_keyboard_layout("ABCDEFGHIJKLM\nNOPQRSTUVWXYZ\n0123456789")
local file = io.open('/' .. name, "w+") -- overwrite, rb ignores the 'b' flag
file:write(test)-- write the layout to the file now
file:close()
if not file then
rb.splash(rb.HZ, "Error opening /" .. name)
return
end
rb.kbd_input(name, test)
]]
return _kbdlayout