mirror of
https://github.com/koreader/koreader
synced 2024-11-20 03:25:34 +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
|