wrong layout en->ru, ru->en

Искусство написания bash скриптов. Делимся своими наработками
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1372
Зарегистрирован: 27 сен 2012, 18:23
Темы: 214
Откуда: Украина, Одесса
Статус: Не в сети

wrong layout en->ru, ru->en

Сообщение ZEN » 06 дек 2017, 00:00

Следующий скрипт исправляет выделенный текст в текстовых полях из en->ru и из ru->en. Нужное направление определяется количеством не английских символов против всех остальных символов в тексте. Для работы скрипта необходимо установить: wc, xdotool, xclip.
Изображение Исходный код:

Код: Выделить всё

#!/usr/bin/env bash

function ru_to_en() {
    echo "$@" | sed 'y1йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"№;:?1qwertyuiop[]asdfghjkl;'\''zxcvbnm,./QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?@#$^&1';
}

function en_to_ru() {
    echo "$@" | sed 'y1qwertyuiop[]asdfghjkl;'\''zxcvbnm,./QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?@#$^&1йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"№;:?1';
}

which wc &> /dev/null \
&& which xclip &> /dev/null \
&& which xdotool &> /dev/null || {
    echo "[ERROR] Check if wc/xclip/xdotool are installed." 1>&2;
    exit 1;
}

PREV_TEXT="$(cat /tmp/wrong_layout.txt 2> /dev/null)";
TEXT="$(xclip -o)";
test -n "$TEXT" || exit 0;
test "$PREV_TEXT" == "$TEXT" && exit 0;
echo "$TEXT" > /tmp/wrong_layout.txt;

if test "$(echo -n "$TEXT" | sed 's/[^a-zA-Z]//g' | wc -c)" -gt "$(echo -n "$TEXT" | sed 's/[a-zA-Z]//g' | wc -c)";
then
    NEW_TEXT="$(en_to_ru "$TEXT")";
else
    NEW_TEXT="$(ru_to_en "$TEXT")";
fi

echo -n "$NEW_TEXT" | xclip -i -selection c;
xdotool key ctrl+v &> /dev/null;

exit 0;
Код в репозитории на Github: https://github.com/LinuxHubRu/shell-scripts/blob/master/wrong_layout.sh

Отправлено спустя 32 минуты 23 секунды:
Скрипт использует буфер обмена, чтобы подменить оригинальный текст исправленным... Если кого-то это раздражает, то можно строки:

Код: Выделить всё

echo -n "$NEW_TEXT" | xclip -i -selection c;
xdotool key ctrl+v &> /dev/null;
заменить на:

Код: Выделить всё

xdotool type "$NEW_TEXT";
но тогда при активном терминале скрипт будет дописывать текст. А в текущем варианте в терминале ничего не изменится.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
svm
Сообщения: 12
Зарегистрирован: 04 дек 2017, 15:28
Темы: 2
Откуда: Novosibirsk
Статус: Не в сети

Re: wrong layout en->ru, ru->en

Сообщение svm » 06 дек 2017, 15:39

маленько "не правильный" алгоритм :shock:
нужно менять имено все выделеные символы ,на символы другой расскладки,
т.е. йцукен=qwerty заменить на qwerty=йцукен
у вас же меняет только русские на англиЦкие
написал1 : рус-анг=rus-eng
заменил2 : hec-fyu=rus-eng а должно быть hec-fyu=кгы-утп
заменил3 : рус-анг=кгы-утп а должно быть рус-анг=rus-eng
Никто не знает столько , сколько не знаю Я. :?

Аватара пользователя
ZEN
Администратор
Сообщения: 1372
Зарегистрирован: 27 сен 2012, 18:23
Темы: 214
Откуда: Украина, Одесса
Статус: Не в сети

Re: wrong layout en->ru, ru->en

Сообщение ZEN » 06 дек 2017, 17:23

Следующий вариант должен работать как надо. Но гарантий не даю, так как я не тестировал его особо. Да и по правде говоря, заниматься им мне не интересно, потому что я подобными функциями не пользуюсь. :)

Код: Выделить всё

#!/usr/bin/env bash

function fix_text() {
    echo "$@" | sed 'y1йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"№;:?qwertyuiop[]asdfghjkl;'\''zxcvbnm,./QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?@#$^&1qwertyuiop[]asdfghjkl;'\''zxcvbnm,./QWERTYUIOP{}|ASDFGHJKL:"ZXCVBNM<>?@#$^&йцукенгшщзхъфывапролджэячсмитьбю.ЙЦУКЕНГШЩЗХЪ/ФЫВАПРОЛДЖЭЯЧСМИТЬБЮ,"№;:?1';
}

which wc &> /dev/null \
&& which xclip &> /dev/null \
&& which xdotool &> /dev/null || {
    echo "[ERROR] Check if wc/xclip/xdotool are installed." 1>&2;
    exit 1;
}

TEXT="$(xclip -o)";
test -n "$TEXT" || exit 0;

echo -n "$(fix_text "$TEXT")" | xclip -i -selection c;
xdotool key ctrl+v &> /dev/null;

exit 0;
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
svm
Сообщения: 12
Зарегистрирован: 04 дек 2017, 15:28
Темы: 2
Откуда: Novosibirsk
Статус: Не в сети

Re: wrong layout en->ru, ru->en

Сообщение svm » 07 дек 2017, 17:03

Спасибо,
ценность скриптов на форумах в том что можно посмотреть способ решения той или иной задачи,
а тем,кто в скриптописании съел собаку - это не нужно (сам напишет за пару минут),
пришлось допилить sed для буквы Ё `~ ёЁ (не понимаю как без неЁ вообще можно что то писать по Русски ? :evil:
я не знал про параметр y и не сразу сообразил что 1 используется как разделитель.
для тех кто только учится ,не помешали бы комментарии.
Никто не знает столько , сколько не знаю Я. :?

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей