Навигация
IME - это способ набора текстов на иероглифических языках и языках (китайский, корейский), использующих сложные правила формирования букв (лакота).
IME может работать в 2 режимах
В данном примере мы наберём «здравствуй» по-китайски: ni hao
При вводе любого символа, с котогоро может начинаться иероглиф, всплывает окно с наиболее возможными вариантами, отсортированными по частоте использования (буква n)
Следующий символ уточняет целевой иероглиф (ni)
При нажатии на цифру, подставляется иероглиф с выбранным номером. При нажатии Enter или вводе любого символа, который не может уточнить текущий иероглиф выбирается вариант под номером 1 - самый часто используемый и начинается формирование нового иероглифа (nih).
Далее - уточняем значение (niha и nihao)
Реализация IME в виртуальной клавиатуре возложена на сторонние скрипты, реализующие логику трансформации базовых символов - в основном букв латинского и кириллического алфавитов - в созвучные им символы целевого языка. Для нужд IME зарезервировано пространоство VirtualKeyboard.Lang, где можно располагать необходимые данные и методы. Стандартная схема именования такова: VirtualKeyboard.Lang.<language_code>. В этом пространстве данные и методы адресуются только пользовательским скриптом, или прямым указанием метода в описании обработчика IME.
VirtualKeyboard.Langs.CN = new function () {
var self = this;
self.INPArr = [];
/**
* Callback to process keyboard input in the current IME style
*
* @see VirtualKeyboard.processChar
* @param {String} chr current input char
* @param {String} buf actual processing buffer
* @return {Array} new buffer contents and length
* @scope protected
*/
self.processChar = function (chr, buf) {
var num, str, arr
if (chr=='\u0008') { // backspace
if (buf && (str=buf.slice(0,-1))) {
VirtualKeyboard.IME.show(self.INPArr[str] || []);
return [str,str.length]
} else {
VirtualKeyboard.IME.hide()
return ['',0] //total delete; some other cases
}
} else { //non backspace
str=buf+chr
arr = self.INPArr[str] || []
if (arr.length) { // miao
VirtualKeyboard.IME.show((typeof arr =='string')? self.INPArr[str]=arr.split('') : arr)
return [str, str.length]
} else if(VirtualKeyboard.IME.getSuggestions().length) { // not a part of a syllable
if (isFinite(num=parseInt(chr))) { // miao3
str = VirtualKeyboard.IME.getChar(num);
if (!str) { //miao9 - no such variant
return[buf,buf.length]
} else {
VirtualKeyboard.IME.hide();
return[str,0]
}
} else if ((arr = self.INPArr[chr] || []).length) { //nih
str=VirtualKeyboard.IME.getSuggestions()[0]
VirtualKeyboard.IME.setSuggestions((typeof arr =='string')? self.INPArr[str]=arr.split('') : arr)
return [str+chr,1]
} else { // ni,
str=VirtualKeyboard.IME.getSuggestions()[0]
VirtualKeyboard.IME.hide()
return [str+(chr.charCodeAt()==10? '': chr),0]
}
}
}
return [buf+chr,0] //non-chinese talk
}
};
Данный код располагается в файле setup/in/addons/CN.js и является общим для всей группы китайских языков (zh-CN).
Вторая часть IME располагается в каталоге setup/in/addons/callbacks и должна иметь одинаковое имя с файлом раскладки. Например, chinese-simplified.js для раскладки chinese-simplified.klc. В этом файле может содержаться либо одна строчка с именем функции, которая будет вызываться при обработке кнопок
VirtualKeyboard.Langs.JP.processChar
либо объект со структурой вида
{'load' : function () {
/* опциональный метод, вызываемый в момент загрузки раскладки */
}
,'activate' : function () {
/* опциональный метод, вызываемый при выборе раскладки пользователем */
}
,'charProcessor' : function (chr, buf) {
/* обязательное поле либо
1) ссылка на функцию обработки вводимых символов вида
VirtualKeyboard.Langs.CN.processChar
2) код функции обработки символов (пример ниже)
*/
}
}
Пример функции обработки вводимых символов
function(chr, buf){
if (chr=='\u0008') { // backspace
if (buf.length) {
return [buf.slice(0,-1),buf.length-1]
}
} else if(/[^A-z']/.test(chr)){
return VirtualKeyboard.Langs.LA.remap[buf+chr] || [buf+chr, 0]
} else { //non backspace
return VirtualKeyboard.Langs.LA.remap[buf+chr] || [buf+chr, 1]
}
}
Дискуссия