Задался я целью сделать для себя аналог punto switcher только online. Не буду спорить, что существует множество онлайн аналогов, но кто знает, вдруг они логируют все то, что доверчивые пользователи в них вводят…
Для того чтобы было прозрачно для пользователя — буду делать на JavaScript — это и в онлайне работать будет, да и желающие смогут посмотреть JS код и успокоить свою паранойю! Мало того, что на JS так еще и так, чтобы скрипт был сразу виден пользователю. Найденные решения в интернете мне не очень понравились, поэтому я пошел изобретать свой велосипед Само интернет приложение доступно по ссылке Punto Switcher online, кому интересны подробности — читайте ниже.
Мой код будет делать инверсию раскладки, причем с учетом регистра. Ленивому человеку Мне не было желания составлять массивы соответствия, поэтому я решил, что проще всего работать со строками. Первая строка — это все русские буквы без SHIFT — "ёйцукенгшщзхъфывапролджэячсмитьбю"
, далее я переключил раскладку и нажимал все те же символы. В латинской раскладке вышло "`qwertyuiop[]asdfghjkl;'zxcvbnm,."
. Все то же самое, но теперь с нажатым модификатором SHIFT на русском языке: "ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ"
, и теперь на латинском языке — "~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>"
. Да, кстати, кажется будут проблемы со знаками препинания… Жду советов по этому поводу в комментариях! Мне пока пришло в голову сделать две дополнительные кнопки с явной конвертацией раскладок рус —> лат и лат —> рус.
Еще немного оптимизируем и в итоге будет всего две строки:
"ёйцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"
"`qwertyuiop[]asdfghjkl;'zxcvbnm,.~/QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>?"
Причем, на мой взгляд, строчные символы должны идти именно первыми, так как вероятность их появления многим больше чем заглавных и мы немного будем экономить время работы скрипта.
Сама функция инвертирования символа раскладки клавиатуры будет представлять из себя:
//begin function puntoit(bukva) { var rus = "ёйцукенгшщзхъфывапролджэячсмитьбю.ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"; var lat = "`qwertyuiop[]asdfghjkl;'zxcvbnm,.~/QWERTYUIOP{}ASDFGHJKL:\"ZXCVBNM<>?"; var pos = -1; pos = rus.indexOf(bukva); if (pos >= 0) {return lat.substr(pos, 1);} pos = lat.indexOf(bukva); if (pos >= 0) {return rus.substr(pos, 1);} return bukva; }; //end
Само тело скрипта будет так же весьма лаконичным:
//begin var testData = document.getElementById('srctext').value; var i = testData.length; var newtext = ""; while (i--){newtext = puntoit(testData.charAt(i)) + newtext;} document.getElementById('srctext').value = newtext; //end
Пользуемся, комментируем, хвалим, критикуем
Здравствуйте, Евгений! Как Вы и предполагали, не рапотаут знаки препинания. Из-за этого невозможно получить вторуу и предпоследнуу пуквы русского алфавита.
Евгений, во-первых спасибо за такой скрипт — то что нужно для моих целей. Очень выручает!
Во-вторых , да, проблема со знаками препинания присутствует. Попытался немного модифицировать, чтобы хотя бы частота ошибок была ниже. Вот мой вариант строк:
var rus = «ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ»;
var lat = «`qwertyuiop[]asdfghjkl;’zxcvbnm,.~QWERTYUIOP{}ASDFGHJKL:\»ZXCVBNM»;