mirror of https://github.com/koreader/koreader
Vietnamese keyboard: TELEX method backed by generic_ime
parent
6a5a13dfc8
commit
ae8156ff9e
@ -0,0 +1,76 @@
|
||||
-- Start with the english keyboard layout (deep copy, to not alter it)
|
||||
local vi_keyboard = require("util").tableDeepCopy(require("ui/data/keyboardlayouts/en_keyboard"))
|
||||
|
||||
local IME = require("frontend/ui/data/keyboardlayouts/generic_ime")
|
||||
local util = require("util")
|
||||
|
||||
-- see https://www.hieuthi.com/blog/2017/03/21/all-vietnamese-syllables.html
|
||||
local code_map = require("frontend/ui/data/keyboardlayouts/vi_telex_data")
|
||||
local ime = IME:new{
|
||||
code_map = code_map,
|
||||
partial_separators = {},
|
||||
has_case = true,
|
||||
exact_match = true,
|
||||
}
|
||||
|
||||
local wrappedAddChars = function(inputbox, char)
|
||||
local lowercase = char:lower()
|
||||
ime:wrappedAddChars(inputbox, lowercase, char)
|
||||
end
|
||||
|
||||
local function separate(inputbox)
|
||||
ime:separate(inputbox)
|
||||
end
|
||||
|
||||
local function wrappedDelChar(inputbox)
|
||||
ime:wrappedDelChar(inputbox)
|
||||
end
|
||||
|
||||
local function clear_stack()
|
||||
ime:clear_stack()
|
||||
end
|
||||
|
||||
local wrapInputBox = function(inputbox)
|
||||
if inputbox._vi_wrapped == nil then
|
||||
inputbox._vi_wrapped = true
|
||||
local wrappers = {}
|
||||
|
||||
-- Wrap all of the navigation and non-single-character-input keys with
|
||||
-- a callback to finish (separate) the input status, but pass through to the
|
||||
-- original function.
|
||||
|
||||
-- -- Delete text.
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "delChar", wrappedDelChar, nil))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "delToStartOfLine", nil, clear_stack))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "clear", nil, clear_stack))
|
||||
-- -- Navigation.
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "leftChar", nil, separate))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "rightChar", nil, separate))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "upLine", nil, separate))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "downLine", nil, separate))
|
||||
-- -- Move to other input box.
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "unfocus", nil, separate))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "onCloseKeyboard", nil, separate))
|
||||
-- -- Gestures to move cursor.
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "onTapTextBox", nil, separate))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "onHoldTextBox", nil, separate))
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "onSwipeTextBox", nil, separate))
|
||||
|
||||
-- addChars is the only method we need a more complicated wrapper for.
|
||||
table.insert(wrappers, util.wrapMethod(inputbox, "addChars", wrappedAddChars, nil))
|
||||
|
||||
return function()
|
||||
if inputbox._vi_wrapped then
|
||||
for _, wrapper in ipairs(wrappers) do
|
||||
wrapper:revert()
|
||||
end
|
||||
inputbox._vi_wrapped = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
vi_keyboard.wrapInputBox = wrapInputBox
|
||||
vi_keyboard.keys[5][4].label = "dấu cách"
|
||||
|
||||
return vi_keyboard
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue