mirror of
https://github.com/koreader/koreader
synced 2024-11-16 06:12:56 +00:00
160 lines
5.1 KiB
Lua
160 lines
5.1 KiB
Lua
|
local IME = require("frontend/ui/data/keyboardlayouts/generic_ime")
|
|||
|
local util = require("util")
|
|||
|
local _ = require("gettext")
|
|||
|
|
|||
|
-- Start with the english keyboard layout (deep copy, to not alter it)
|
|||
|
local py_keyboard = require("util").tableDeepCopy(require("ui/data/keyboardlayouts/en_keyboard"))
|
|||
|
local SETTING_NAME = "keyboard_chinese_pinyin_settings"
|
|||
|
|
|||
|
local code_map = require("frontend/ui/data/keyboardlayouts/zh_pinyin_data")
|
|||
|
local settings = G_reader_settings:readSetting(SETTING_NAME, {show_candi=true})
|
|||
|
local ime = IME:new {
|
|||
|
code_map = code_map,
|
|||
|
partial_separators = {" "},
|
|||
|
show_candi_callback = function()
|
|||
|
return settings.show_candi
|
|||
|
end,
|
|||
|
switch_char = "→",
|
|||
|
switch_char_prev = "←",
|
|||
|
}
|
|||
|
|
|||
|
py_keyboard.keys[4][3][2].alt_label = nil
|
|||
|
py_keyboard.keys[4][3][1].alt_label = nil
|
|||
|
py_keyboard.keys[3][10][2] = {
|
|||
|
",",
|
|||
|
north = ";",
|
|||
|
alt_label = ";",
|
|||
|
northeast = "(",
|
|||
|
northwest = "“",
|
|||
|
east = "《",
|
|||
|
west = "?",
|
|||
|
south = ",",
|
|||
|
southeast = "【",
|
|||
|
southwest = "「",
|
|||
|
"{",
|
|||
|
"[",
|
|||
|
";"
|
|||
|
}
|
|||
|
|
|||
|
py_keyboard.keys[5][3][2] = {
|
|||
|
"。",
|
|||
|
north = ":",
|
|||
|
alt_label = ":",
|
|||
|
northeast = ")",
|
|||
|
northwest = "”",
|
|||
|
east = "…",
|
|||
|
west = "!",
|
|||
|
south = ".",
|
|||
|
southeast = "】",
|
|||
|
southwest = "」",
|
|||
|
"}",
|
|||
|
"]",
|
|||
|
":"
|
|||
|
}
|
|||
|
py_keyboard.keys[1][2][3] = { alt_label = "「", north = "「", "‘" }
|
|||
|
py_keyboard.keys[1][3][3] = { alt_label = "」", north = "」", "’" }
|
|||
|
py_keyboard.keys[1][1][4] = { alt_label = "!", north = "!", "!"}
|
|||
|
py_keyboard.keys[2][1][4] = { alt_label = "?", north = "?", "?"}
|
|||
|
py_keyboard.keys[1][2][4] = "、"
|
|||
|
py_keyboard.keys[2][2][4] = "——"
|
|||
|
py_keyboard.keys[1][4][3] = { alt_label = "『", north = "『", "“" }
|
|||
|
py_keyboard.keys[1][5][3] = { alt_label = "』", north = "』", "”" }
|
|||
|
py_keyboard.keys[1][4][4] = { alt_label = "¥", north = "¥", "_" }
|
|||
|
py_keyboard.keys[3][3][4] = "("
|
|||
|
py_keyboard.keys[3][4][4] = ")"
|
|||
|
py_keyboard.keys[4][4][3] = "《"
|
|||
|
py_keyboard.keys[4][5][3] = "》"
|
|||
|
|
|||
|
local genMenuItems = function(self)
|
|||
|
return {
|
|||
|
{
|
|||
|
text = _("Show character candidates"),
|
|||
|
checked_func = function()
|
|||
|
return settings.show_candi
|
|||
|
end,
|
|||
|
callback = function()
|
|||
|
settings.show_candi = not settings.show_candi
|
|||
|
G_reader_settings:saveSetting(SETTING_NAME, settings)
|
|||
|
end
|
|||
|
}
|
|||
|
}
|
|||
|
end
|
|||
|
|
|||
|
local wrappedAddChars = function(inputbox, char)
|
|||
|
ime:wrappedAddChars(inputbox, char)
|
|||
|
end
|
|||
|
|
|||
|
local wrappedRightChar = function(inputbox)
|
|||
|
if ime:hasCandidates() then
|
|||
|
ime:wrappedAddChars(inputbox, "→")
|
|||
|
else
|
|||
|
ime:separate(inputbox)
|
|||
|
inputbox.rightChar:raw_method_call()
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local wrappedLeftChar = function(inputbox)
|
|||
|
if ime:hasCandidates() then
|
|||
|
ime:wrappedAddChars(inputbox, "←")
|
|||
|
else
|
|||
|
ime:separate(inputbox)
|
|||
|
inputbox.leftChar:raw_method_call()
|
|||
|
end
|
|||
|
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._py_wrapped == nil then
|
|||
|
inputbox._py_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, "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))
|
|||
|
|
|||
|
table.insert(wrappers, util.wrapMethod(inputbox, "addChars", wrappedAddChars, nil))
|
|||
|
table.insert(wrappers, util.wrapMethod(inputbox, "leftChar", wrappedLeftChar, nil))
|
|||
|
table.insert(wrappers, util.wrapMethod(inputbox, "rightChar", wrappedRightChar, nil))
|
|||
|
|
|||
|
return function()
|
|||
|
if inputbox._py_wrapped then
|
|||
|
for _, wrapper in ipairs(wrappers) do
|
|||
|
wrapper:revert()
|
|||
|
end
|
|||
|
inputbox._py_wrapped = nil
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
py_keyboard.wrapInputBox = wrapInputBox
|
|||
|
py_keyboard.genMenuItems = genMenuItems
|
|||
|
py_keyboard.keys[5][4].label = "空格"
|
|||
|
return py_keyboard
|