Mahou icon indicating copy to clipboard operation
Mahou copied to clipboard

Как это сделать (транслитерация)?

Open yuklov opened this issue 5 years ago • 159 comments

  1. Хочу транслитерировать букву "е" в начале слова или после гласных как "ye", в остальных случаях как "e". Это я мог сделать через TSDict.txt. Но не польностю:

е| ye ае|aye уе|uye ое|oye ие|iye яе|yaye ёе|yoye юе|yuye

Все это работает. Но если слова с "е" в начале абзаца, переводится как "e". Как её транслитерировать как "ye"?

Например: Если едешь в Екатеринбург, сообщи мне. Сейчас транслитеруется так: Esli yedesh v Yekaterinburg, soobshi mne. Можно ли так сделать: Yesli yedesh v Yekaterinburg, soobshi mne.

  1. Ну, вообще можно использовать подстановочные знаки (regular expression)? Если да, тогда такие трудности легко решать. Вот, буквы Ш, Ч на нашем латинском алфавите в заглавном регистре пишется как "Sh", "Ch". Но если все слова в верхном регистре надо писать как "SH", "CH". И это касаятся буквам Я, Ё, Е, Ю. Это правило можно добавить через TSDict.txt или другим способом?

Например: Шавкат поедет в Россию - в Екатеринбург, а потом в Чехию - в Прагу. Сейчас транслитеруется так (все в норме): Shavkat poyedet v Rossiyu - v Yekaterinburg, a potom v Chexiyu - v Pragu. В верхном регистре: ШАВКАТ ПОЕДЕТ В РОССИЮ - В ЕКАТЕРИНБУРГ, А ПОТОМ В ЧЕХИЮ - В ПРАГУ. Сейчас транслитеруется так: ShAVKAT POYEDET V ROSSIYu - V YeKATERINBURG, A POTOM V ChEXIYu - V PRAGU. Можно ли так сделать: SHAVKAT POYEDET V ROSSIYU - V YEKATERINBURG, A POTOM V CHEXIYU - V PRAGU.

Хелп, плиз.

Извиняюсь, что много задаю вопросы.

yuklov avatar Jan 17 '20 05:01 yuklov

@yuklov Да тут нужно будет "усовершенствовать" транслитерацию. Сейчас замена только "символы" на "символы", может добавить еще файл для замен по regex?

BladeMight avatar Jan 17 '20 08:01 BladeMight

может добавить еще файл для замен по regex?

@BladeMight

Если использовать regex,

  1. Можно на программу добавить новая функция , которая транслитерует файл, например, ворд файл.
  2. Через функциональный файл как TSDict.txt, например, RegEX.txt можно добавить новая функция, которая работает по принципу подстановочных знаков.
  3. По моему, если возможно, лучше добавить возможность использовать regex прямо на файл TSDict.txt.

Пример

 Е| Ye
АЕ|AYE
УЕ|UYE
ОЕ|OYE
ИЕ|IYE
ЯЕ|YAYE
ЁЕ|YOYE
ЮЕ|YUYE

Вышеуказанную правилу сделал раньше в макросе libreoffice так:

"([ [:space:]\tАИОУЎЕЭЪЬ])Е" ==== "YE$1" (заглавные гласные+Е = YE)
"^Е([:upper:])" ==== "YE$1" (В начале слова или абзаца Е + заглавные буквы = YE)
"^Е" - "([ [:space:]\tаиоуўеэъь])е" ==== "Ye" (это когда абзац или слова начинается с заглавной "Е" и после неё есть гласные)

C regex будет очень удобно. Например, на TSDict.txt пишу:

^Е|Ye
^е|ye

Всё! Во всех словах, это буква в начале слова переводится как "Ye" и "ye". Надеюсь, можно добавить эту возможность.

Все эти сказанные - предложения, чтобы расширить функционал и возможности программы.

yuklov avatar Jan 17 '20 10:01 yuklov

И ещё одна проблема у меня. С буквой "Ъ" и "ъ". Оба транслитерирую как "ʼ" (модификатор буквы апостроф). На латиницу нормально переводится, но обратно сделается "ошибка".

Пример: Маъруза МАЪРУЗА

после траслитерации: Maʼruza MAʼRUZA

Обратная транслитерация: Маъруза МАъРУЗА

Если поменяю

ъ|ʼ
Ъ|’

на

Ъ|’
ъ|ʼ

будет так: МаЪруза МАЪРУЗА

Что делать?

yuklov avatar Jan 17 '20 11:01 yuklov

Сейчас доделаю "замены по regex" в TSDict.txt, и потом можно будет использовать что-то вроде этого:

/(?<=[A-Z])ʼ(?=[A-Z])/|Ъ /(?<=[a-z])ʼ(?=[a-z]|$)/|ъ

BladeMight avatar Jan 17 '20 11:01 BladeMight

Добавил поддержку regex в TSDict.txt в e4797c3, синтаксис такой:

s/что/на что/|s/что(обратная)/на что(операция)/

или если обратная операция не требуется:

s/что/на что/|

"s" в начале и 3 "/"(unescaped) обязательны для каждой строчки! И так, при словаре:

TSDict.txt (нажми тут чтобы развернуть)
Ъ|ʼ
ъ|ʼ
s/\bе/Ye/|s/\bYe/е/
s/\bЕ/YE/|s/\bYE/Е/
s/(?<=[A-Z])ʼ(?=[A-Z])/Ъ/|
s/(?<=[a-z])ʼ(?=[a-z])/ъ/|
Щ|SCH
щ|sch
Ч|CH
Ш|SH
Ё|JO
ВВ|W
Є|EH
ю|yu
я|ya
є|eh
Ж|ZH
ч|ch
ш|sh
Й|JJ
ж|zh
Э|EH
Ю|YU
й|jj
Я|YA
ё|jo
э|eh
вв|w
кь|q
КЬ|Q
|ь
№|#
А|A
Б|B
В|V
Г|G
Д|D
Е|E
З|Z
И|I
К|K
Л|L
М|M
Н|N
О|O
П|P
Р|R
С|S
Т|T
У|U
Ф|F
Х|H
Ц|C
а|a
б|b
в|v
г|g
д|d
з|z
и|i
к|k
л|l
м|m
н|n
о|o
п|p
р|r
с|s
у|u
ф|f
х|h
ц|c
Ы|Y
Ь|J
е|e
т|t
ы|y

Mahou <e4797c3> заменяет:

Если едешь в Екатеринбург, сообщи мне.

На:

YEsli Yedesh v YEkaterinburg, soobschi mne.

И обратно:

Если едеш в Екатеринбург, сообщи мне.

И еще примеры:

Маъруза => Maʼruza => Маъруза МАЪРУЗА => MAʼRUZA => МАЪРУЗА

BladeMight avatar Jan 17 '20 12:01 BladeMight

@yuklov Пока что могут быть баги, если что заметишь - пиши.

BladeMight avatar Jan 17 '20 12:01 BladeMight

Порядок правил в TSDict.txt очень важен, иначе будет что-то вроде того что ты писал:

Если поменяю

ъ|ʼ Ъ|’

на

Ъ|’ ъ|ʼ

будет так:

МаЪруза МАЪРУЗА

Объясняю:

когда ъ|ʼ была выше, Ъ|’ тогда первый символ заменялся на ъ(т.е. ту что выше), а та что ниже уже "не видит" символ т.к. та что выше уже его заменила.

BladeMight avatar Jan 17 '20 12:01 BladeMight

@yuklov Пока что могут быть баги, если что заметишь - пиши.

Код под себя настроил:

s/\bе/ye/|s/\bye/е/
s/\bЕ/Ye/|s/\bYe/Е/
s/(?<=[A-Z])ʼ(?=[A-Z])/Ъ/|
s/(?<=[a-z])ʼ(?=[a-z])/ъ/|

Если едеш в Екатеринбург, сообщи мне. ЕКАТЕРИНБУРГ

Yesli yedesh v Yekaterinburg, soobshʻi mne. YeKATERINBURG

Но что делать, чтобы ЕКАТЕРИНБУРГ, КАТАЕВ переводился так: YEKATERINBURG, KATAYEV

Какой RegExp использовать? Коды (например, s/\bе/ye/|s/\bye/е/) вставил в https://regex101.com/. Но там ошибка показывает. Говорить, только \be вставить можно.

Если есть правила RegExp, изучив я буду настроить под себя.

yuklov avatar Jan 17 '20 13:01 yuklov

Попробовал этот код, но не сработал:

s/\(?=[АИОУЎЕЭЪЬ])Е/YE/|s/(?=[АИОУЎЕЭЪЬ])YE/Е/

yuklov avatar Jan 17 '20 14:01 yuklov

Наконец-то нашёл, по моему:

s/(?<=[А-Я])Ч(?=[А-Я])/CH/|s/(?<=[A-Z])CH(?=[A-Z])/Ч/
s/(?<=[АИОУЎЕЭЪЬ])Е/YE/|s/(?=[AIOUOʻYEEʼ])YE/Е/

yuklov avatar Jan 17 '20 16:01 yuklov

s/(?=[АИОУЎЕЭЪЬ])Е/YE/|s/(?=[АИОУЎЕЭЪЬ])YE/Е/

Хм а в \(?= зачем \ перед: (?

(?=...) = позитивный просмотр вперед, а похоже нужно назад (?<=...). Или если всё же вперед, то поставь его после Е.

Но что делать, чтобы ЕКАТЕРИНБУРГ, КАТАЕВ переводился так: YEKATERINBURG, KATAYEV

Тогда нужно два regex, одно для всё слово с большой буквы, Другое для не всё слово с большой буквы:

((^|\b)|[А-ДЖ-ЯЁ]*)Е(?=[А-ДЕЖ-ЯЁ]+|($|\b)) (Ловит букву Е, если всё слово В ВЕРХНЕМ РЕГИСТРЕ)

Нашел ошибку в парсинге TSDict.txt, при | больше 1 разбивка была не правильной, в latest-commit 3f8c7bf - исправил, теперь в latest-commit можно:

s/((^|\b)|[А-ДЖ-ЯЁ]*)Е(?=[А-ДЕЖ-ЯЁ]+|($|\b))/$1YE/|s/((^|\b)|[A-DF-XZ]*)YE(?=[A-Z]+|($|\b))/$1Е/

Так же я писал:

Порядок правил в TSDict.txt очень важен

Но в итоге у стандартного Dictionary как оказалось - не сохраняется порядок, так что в c9224c1, я его заменил на DICT, в нём 100% сохраняется порядок правил. и теперь заменяет как я внизу и написал.

Заменяет:

YEKATYERINA => ЕКАТЕРИНА => YEKATYERINA Yekatyerina => Екатерина => Yekatyerina Екатирина => Ekatirina => Екатирина КАТАЕВ => KATAYEV => КАТАЕВ ЕЕЕЕЕЕЕЕЕ => YEYEYEYEYEYEYEYEYE => ЕЕЕЕЕЕЕЕЕ еЕеЕееЕЕЕеееЕЕ => yeYeyeYeyeyeYEYEYeyeyeyeYEYE => еЕеЕееЕЕЕеееЕЕ

При словаре:

TSDict.txt
Ъ|ʼ
ъ|ʼ
s/((^|\b)|[А-ДЖ-ЯЁ]*)Е(?=[А-ДЕЖ-ЯЁ]+|($|\b))/$1YE/|s/((^|\b)|[A-DF-XZ]*)YE(?=[A-Z]+|($|\b))/$1Е/
Е|Ye
е|ye
s/(?<=[A-Z])ʼ(?=[A-Z])/Ъ/|
s/(?<=[a-z])ʼ(?=[a-z])/ъ/|
Щ|SCH
щ|sch
Ч|CH
Ш|SH
Ж|JO
ВВ|W
Є|EH
ю|yu
я|ya
є|eh
Ж|ZH
ч|ch
ш|sh
Й|JJ
ж|zh
Э|EH
Ю|YU
й|jj
Я|YA
Ж|jo
э|eh
вв|w
кь|q
КЬ|Q
|ь
№|#
А|A
Б|B
В|V
Г|G
Д|D
З|Z
И|I
К|K
Л|L
М|M
Н|N
О|O
П|P
Р|R
С|S
Т|T
У|U
Ф|F
Х|H
Ц|C
а|a
б|b
в|v
г|g
д|d
з|z
и|i
к|k
л|l
м|m
н|n
о|o
п|p
р|r
с|s
у|u
ф|f
х|h
ц|c
Ы|Y
Ь|J
т|t
ы|y

s/(?<=[А-Я])Ч(?=[А-Я])/CH/|s/(?<=[A-Z])CH(?=[A-Z])/Ч/

Неплохо, только (?<=...) Positive Lookbehind должен быть фиксированной длинны, так что проверить все ли буквы в слове с большой буквы - не получится. В таких случаях лучше всего пользоваться либо группами, или только (?=...).

BladeMight avatar Jan 17 '20 23:01 BladeMight

(теперь благодаря DICT) Порядок в правилах имеет большое значение на результат(и точно сохраняется!):

s/((^|\b)|[А-ДЖ-ЯЁ])Е(?=[А-ДЖ-ЯЁ]+|(^|\b))/$1YE/|s/((^|\b)|[A-DF-XZ])YE(?=[A-DF-XZ]+|(^|\b))/$1Е/ Е|Ye е|ye

Т.е. сначала проверяет регулярное выражение, потом обычные замены.

BladeMight avatar Jan 17 '20 23:01 BladeMight

В a2f08a1 добавил важное исправление, теперь 1 повторяющийся символ тоже работает: (отредактировал пост выше)

BladeMight avatar Jan 17 '20 23:01 BladeMight

В общем осталось только "проверять" и "придумывать" правила....

BladeMight avatar Jan 17 '20 23:01 BladeMight

Вчера до обновления сделал такие правила и заставил 😅 работать программу как я хотел:

s/ЪЕ/YE/|
s/ъе/ye/|
s/ъЕ/YE/|
Ъ|ʼ
ъ|ʼ
s/(?<=[A-Z])ʼ(?=[A-Z])/Ъ/|
s/(?<=[a-z])ʼ(?=[a-z])/ъ/|
Ў|Oʻ
ў|oʻ
s/(?<=[^ЎЁЮЯЕАИОУЭЪЬ])Ц/S/|
s/Ч(?=[А-ЯЎҚҒҲ ])/CH/|s/CH(?=[OʻGʻA-Z ])/Ч/
s/(?<=[А-ЯЎҚҒҲ])Ч/CH/|s(?
```<=[OʻGʻA-Z])CH/Ч/
s/Ш(?=[А-ЯЎҚҒҲ ])/SH/|s/SH(?=[OʻGʻA-Z ])/Ш/
s/(?<=[А-ЯЎҚҒҲ])Ш/SH/|s(?<=[OʻGʻA-Z])SH/Ш/
s/(?<=[ЎЁЮЯЕАИОУЭЪЬ])Е/YE/|s/(?=[OʻYOYUYAYEAIOUE])YE/Е/
s/\bЕ/Ye/|s/\bYe/Е/
s/Ye(?=[A-ZА-ЯЎҚҒҲ])/YE/|
s/\bЁ/Yo/|s/\bYo/Ё/
s/Ё(?=[A-ZА-ЯЎҚҒҲ ])/YO/|s/YO(?=[OʻGʻA-Z ])/Ё/
s/(?<=[A-ZА-ЯЎҚҒҲ])Ё/YO/|s(?<=[OʻGʻA-Z])YO/Ё/
s/(?<=[A-ZЎЁЮЯЕАИОУЭЪЬ])Ё/YO/|s/(?=[OʻYOYUYAYEAIOUE])YO/Ё/
s/Yo(?=[A-ZА-ЯЎҚҒҲ])/YO/|
s/Ю(?=[A-ZА-ЯЎҚҒҲ ])/YU/|s/YU(?=[OʻGʻA-Z ])/Ю/
s/(?<=[A-ZА-ЯЎҚҒҲ])Ю/YU/|s(?<=[OʻGʻA-Z])YU/Ю/
s/(?<=[ЎЁЮЯЕАИОУЭЪЬ])Ю/YU/|s/(?=[OʻYOYUYAYEAIOUE])YU/Ю/
s/Я(?=[A-ZА-ЯЎҚҒҲ ])/YA/|s/YA(?=[OʻGʻA-Z ])/Я/
s/(?<=[A-ZА-ЯЎҚҒҲ])Я/YA/|s(?<=[OʻGʻA-Z])YA/Я/
s/(?<=[ЎЁЮЯЕАИОУЭЪЬ])Я/YA/|s/(?=[OʻYOYUYAYEAIOUE])YA/Я/
s/\bе/ye/|s/\bye/е/
s/(?<=[^ўёюяеаиоуэъь])ц/s/|
s/(?<=[ўёюяеаиоуэъь])е/ye/|s/(?=[oʻyoyuyayeaioue])ye/е/
Ғ|Gʻ
ғ|gʻ
...
...
қ|q
ҳ|h
Ь|
ь|
s/\bTS/S/|
s/\bts/s/|
s/OʻYo/OʻYO/|
s/OʻYu/OʻYU/|
s/OʻYa/OʻYA/|

Теперь заново делаю по новому правилу. По моему в моем коде много лишнего.

yuklov avatar Jan 18 '20 11:01 yuklov

(?=[OʻYOYUYAYEAIOUE])

Думаю такие правила будут "ловить" только 1 символ, тебе нужно наверно что-то вроде этого: ([Oʻ]|Y?[AOUEI])

s/(?=[OʻYOYUYAYEAIOUE])YE/Е/

Твои правила не проверяют "то что после" YE?

По моему в моем коде много лишнего

Да... много....

BladeMight avatar Jan 18 '20 11:01 BladeMight

s/(?<=[^ЎЁЮЯЕАИОУЭЪЬ])Ц/S/|
s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/
s/((^|\b)|[^ЎЁЮЯЕАИОУЭЪЬ])Е/$1E/|s/((^|\b)|[^OʻYOYUYAYEAIOUE])E/$1Е/
s/((^|\b)|[ўёюяеаиоуэъь])е/$1ye/|s/((^|\b)|[oʻyoyuyayeaioue])ye/$1е/
s/((^|\b)|[^ўёюяеаиоуэъь])е/$1e/|s/((^|\b)|[^oʻyoyuyayeaioue])e/$1е/
s/((^|\b)|[А-ЯЎҚҒҲ])Ч(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1CH/|s/((^|\b)|[OʻGʻA-Z])CH(?=[OʻGʻA-Z]+|(^|\b))/$1Ч/

Я убрал мой код, и поставил этот код. После этого получился такой результат (пока правила только на буквы Е, Ч, Ц.

Екатеринбург Катаев ЕКАТЕРИНБУРГ КАТАЕВ қаер буер кетса => Yekaterinburg Katayev YEKATERINBURG KATAYEV qayer buyer ketsa => Йекатеринбург Катаев ЕКАТЕРИНБУРГ КАТАЕВ қаер буер кетса

В начале слова заглавная Е переводится в обратом пути как Йе. Нужен был Е. Что-то неверно?

Или добавить отдельно:

s/\bЕ/Ye/|s/\bYe/Е/

yuklov avatar Jan 18 '20 11:01 yuklov

Думаю такие правила будут "ловить" только 1 символ, тебе нужно наверно что-то вроде этого: ([Oʻ]|Y?[AOUEI])

Вчера работал (?<=[OʻYOYUYAYEAIOUE]).

s/(?<=[ЎЁЮЯЕАИОУЭЪЬ])Е/YE/|s/(?<=[OʻYOYUYAYEAIOUE])YE/Е/

Это правила для того, что если перед Е есть заглавные гласные тогда переводится как YE.

Или есть другой легкий способ?

Здесь ʻ не английский апостроф, этот символ не делить слово. Английские ‘ и ’ делит слова.

yuklov avatar Jan 18 '20 11:01 yuklov

В начале слова заглавная Е переводится в обратом пути как Йе. Нужен был Е. Что-то неверно?

Порядок правил в словаре, в общем наличие Й|Y e|е перед правилом regex.

BladeMight avatar Jan 18 '20 12:01 BladeMight

В начале слова заглавная Е переводится в обратом пути как Йе. Нужен был Е. Что-то неверно?

Порядок правил в словаре, в общем наличие Й|Y e|е перед правилом regex.

Нет Й|Y e|е после regex.

yuklov avatar Jan 18 '20 12:01 yuklov

После

s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/
s/((^|\b)|[^ЎЁЮЯЕАИОУЭЪЬ])Е/$1E/|s/((^|\b)|[^OʻYOYUYAYEAIOUE])E/$1Е/

добавил: s/\bЕ/Ye/|s/\bYe/Е/

Теперь правильно переводится.

yuklov avatar Jan 18 '20 12:01 yuklov

Нет Й|Y e|е после regex.

Значит отсутствие: Е|Ye перед ними.

s/\bЕ/Ye/|s/\bYe/Е/

Тут используется \b в начале поэтому будет работать только для "начала слов"+Е/Ye, если тебе такого не надо тогда просто:

Е|Ye после(или до) regex, но перед(обязательно!) Y|Й и e|е

BladeMight avatar Jan 18 '20 12:01 BladeMight

Значит отсутствие: Е|Ye.

Теперь видел и знал: E меня был. Е|E.

Это раньше писал, тогда не было это правило: s/((^|\b)|[^ЎЁЮЯЕАИОУЭЪЬ])Е/$1E/|s/((^|\b)|[^OʻYOYUYAYEAIOUE])E/$1Е/

Теперь добавил так: Е|Ye.

Перезапустил прог, но "ошибка" повторяется.

yuklov avatar Jan 18 '20 12:01 yuklov

Поставил так, праямо после regex:

s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/
s/((^|\b)|[^ЎЁЮЯЕАИОУЭЪЬ])Е/$1E/|s/((^|\b)|[^OʻYOYUYAYEAIOUE])E/$1Е/
Е|Ye

но перед:

s/((^|\b)|[ўёюяеаиоуэъь])е/$1ye/|s/((^|\b)|[oʻyoyuyayeaioue])ye/$1е/
s/((^|\b)|[^ўёюяеаиоуэъь])е/$1e/|s/((^|\b)|[^oʻyoyuyayeaioue])e/$1е/

Теперь переводится как **YEkaterinburg**.

yuklov avatar Jan 18 '20 12:01 yuklov

[^ЎЁЮЯЕАИОУЭЪЬ]

  • НЕ правильно! Как это определит являются ли все символы что не ЎЁЮЯЕАИОУЭЪЬ в верхнем регистре? По сути там может быть любой символ кроме них...

BladeMight avatar Jan 18 '20 12:01 BladeMight

Скажи "словами" как тебе надо и дай символы которые хочешь заменить, и я тебе объясню.

BladeMight avatar Jan 18 '20 12:01 BladeMight

[^ЎЁЮЯЕАИОУЭЪЬ]

* НЕ правильно!  Как это определит являются ли все символы что не `ЎЁЮЯЕАИОУЭЪЬ` в верхнем регистре? По сути там может быть любой символ кроме них...

Если перед Е не гласные, тогда переводить надо как "E". Например: ДЕКАН => DEKAN СЕМЕСТР=>SEMESTR

Какой regex использовать?

yuklov avatar Jan 18 '20 13:01 yuklov

Если перед Е не гласные, тогда переводить надо как "E"

Нужно "выбрать" их всех(или их границы) в [], пример: [Б-ДЖЗК-НП-ТФ-Щ], (удобная таблица юникода: foxtools)

BladeMight avatar Jan 18 '20 13:01 BladeMight

Какой regex использовать?

примерно так: s/([Б-ДЖЗК-НП-ТФ-Щ])Е/$1E/ для первой части

BladeMight avatar Jan 18 '20 13:01 BladeMight

Скажи "словами" как тебе надо и дай символы которые хочешь заменить, и я тебе объясню.

Е Если Е перед гласными (ЎЁЮЯЕАИОУЭЪЬ - гласные и ьъ), тогда надо переводит как YE. В нижнем регистре как ye.

Ц

s/(?<=[^ЎЁЮЯЕАИОУЭЪЬ])Ц/s/|
s/(?<=[^ўёюяеаиоуэъь])ц/s/|
...
Ц|TS
ц|ts

Если перед Ц есть гласные, тогда надо переводить как TS (ц=>ts). В остальных случаюх как S (s). Но это буква встречается только в заимствованных словах. По этому обратная транслитерация опасно: все слова, у которых есть TS (ts) переводится как Ц (ц). Этого не надо. На языке очень много слов, у которых TS (ts) нужно переводить как ТС (тс). Так, не сделал обратную транслитерацию.

ЛИЦЕЙ => LITSEY => ЛИТСЕЙ (ну, терплю) лицей => litsey => литсей (ну, и этому терплю)

Ч, Ш Если перед и после Ч ест буквы в верхном регистре, тогда надо переводить как СH.

Если заглавный Ч в начале предложения или в средение, тогда надо переводить как Ch.

Что с Чаком Норрисом? Chto s Chakom Norrisom?

По моему, с Ч, Ш я справлялся.

s/((^|\b)|[А-ЯЎҚҒҲ])Ч(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1CH/|s/((^|\b)|[OʻGʻA-Z])CH(?=[OʻGʻA-Z]+|(^|\b))/$1Ч/
Ч|Ch
ч|ch

Нормально переводится.

yuklov avatar Jan 18 '20 13:01 yuklov

Какой regex использовать?

примерно так: s/([Б-ДЖЗК-НП-ТФ-Щ])Е/$1E/ для первой части

Да понял, согласные указать надо. Если

[^ЎЁЮЯЕАИОУЭЪЬ]

другие символы кроме букв тоже входить в состав.

yuklov avatar Jan 18 '20 13:01 yuklov

[^ЎЁЮЯЕАИОУЭЪЬ]

* НЕ правильно!  Как это определит являются ли все символы что не `ЎЁЮЯЕАИОУЭЪЬ` в верхнем регистре? По сути там может быть любой символ кроме них...

Дааа....

И все буквы в нижнем регистре входил в состав.

Если сделал как [^ЎЁЮЯЕАИОУЭЪЬўёюяеаиоуэъь], было бы работал.

yuklov avatar Jan 18 '20 13:01 yuklov

Поставил

s/([Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])Е/$1E/|s/|[GʻB-DF-HJ-NP-TV-Z])E/$1Е/

транслитерация и горячие клавиши перестал работать.

yuklov avatar Jan 18 '20 13:01 yuklov

s/([Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])Е/$1E/|s/|[GʻB-DF-HJ-NP-TV-Z])E/$1Е/
и
s/((^|\b)|[Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])Е/$1E/|s/((^|\b)|[GʻB-DF-HJ-NP-TV-Z])E/$1Е/

и даже 😁 s/((^|\b)|[^ЎЁЮЯЕАИОУЭЪЬўёюяеаиоуэъь])Е/$1E/|s/((^|\b)|[^OʻYOYUYAYEAIOUEoʻyoyuyayeaioue])E/$1Е/ не работал.

И с Э тоже проблема, в обратном переводе во всех случаях переводиться как Е и е. (На латиницу переводится нормально)

Эркин Хемингуей элим Эркин => Erkin Xeminguyey elim Erkin => Еркин Хемингуей елим Еркин

yuklov avatar Jan 18 '20 13:01 yuklov

Если сделал как [^ЎЁЮЯЕАИОУЭЪЬўёюяеаиоуэъь], было бы работал.

И это тогда тоже будет ловится , нужно ЯВНО указывать что должно быть.

BladeMight avatar Jan 18 '20 14:01 BladeMight

транслитерация и горячие клавиши перестал работать.

Значит ошибка в regex. regex101 говорит что во второй части ты пропусти ( в начале.

Нужно сделать чтобы не "убивались" гор. клавиши.

BladeMight avatar Jan 18 '20 14:01 BladeMight

Нужно сделать чтобы не "убивались" гор. клавиши.

Сделал в 2ecf16c, теперь если включено журналироваие действий(если не включено то просто ошибка в regex игнорируется, и гор. клавиши не "убиваются"), то в лог файл будет писаться такая строчка если произошла ошибка в regex:

06:01:01.336 [E]: [RegexRP] > Regex replace FAILED, error in regex: ?<=[ЎЁЮЯЕАИОУЭЪЬ])Е error message: parsing "?<=[ЎЁЮЯЕАИОУЭЪЬ])Е" - Quantifier {x,y} following nothing.

BladeMight avatar Jan 18 '20 16:01 BladeMight

По моему, с Ч, Ш я справлялся

Похоже ты уже понимаешь что к чему. :eye: _ :eye:

BladeMight avatar Jan 18 '20 16:01 BladeMight

По моему, с Ч, Ш я справлялся

Похоже ты уже понимаешь что к чему. 👁 _ 👁

Да, уж... чуствую себя как программист 😎. Ну я дилетант в этой сфере. По этому у меня многие пути.

Ну, вот, наконец, сделал код. Все в норме, проста Ц в начале слова переводитья как Ts и TS. Как сделать, чтобы в начале слова Ц переводился как S. В обратном Ц. Если трудно, обратный не нужан

Вот, мой код:

s/(?<=[A-Z])ʼ(?=[A-Z])/Ъ/|
s/(?<=[a-z])ʼ(?=[a-z])/ъ/|
s/Е([а-яўқғҳ])/Ye$1/|s/Ye([oʻgʻa-z])/Е$1/
s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/
s/([Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])Е/$1E/|s/([GʻB-DF-HJ-NP-TV-Z])E/$1Е/
s/((^|\b)|[ўёюяеаиоуэъь])е/$1ye/|s/((^|\b)|[oʻyoyuyayeaioue])ye/$1е/
s/([Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])е/$1e/|s/([GʻB-DF-HJ-NP-TV-Z])e/$1е/
s/([б-джзк-нп-тф-щқғҳ])е/$1e/|s/([gʻb-df-hj-np-tv-z])e/$1е/
s/((^|\b)|[А-ЯЎҚҒҲ])Ч(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1CH/|s/((^|\b)|[OʻGʻA-Z])CH(?=[OʻGʻA-Z]+|(^|\b))/$1Ч/
s/((^|\b)|[А-ЯЎҚҒҲ])Ш(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1SH/|s/((^|\b)|[OʻGʻA-Z])SH(?=[OʻGʻA-Z]+|(^|\b))/$1Ш/
s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Ц/$1TS/|
s/((^|\b)|[ўёюяеаиоуэъь])ц/$1ts/|
s/Ц([А-ЯЎҚҒҲOʻGʻA-Zа-яўқғҳoʻgʻa-z])/S$1/|
s/((^|\b)|[Б-ДЖЗК-НП-ТФ-ЩҚҒҲGʻB-DF-HJ-NP-TV-Z])Ц(?=[Б-ДЖЗК-НП-ТФ-ЩҚҒҲGʻB-DF-HJ-NP-TV-Z]+|(^|\b))/$1S/|
s/((^|\b)|[б-джзк-нп-тф-щқғҳ])ц(?=[б-джзк-нп-тф-щқғҳ]+|(^|\B))/$1s/|

При этом убрал

Ц|TS
ц|ts

и

Е|Ye
е|ye

С буквой Е пока все в норме.

yuklov avatar Jan 18 '20 16:01 yuklov

По моему, все, закончил! Вот мой конечный код:

s/Е([а-яўқғҳ])/Ye$1/|s/Ye([oʻgʻa-z])/Е$1/
s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/
s/([Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])Е/$1E/|s/([GʻB-DF-HJ-NP-TV-Z])E/$1Е/
s/((^|\b)|[ўёюяеаиоуэъь])е/$1ye/|s/((^|\b)|[oʻyoyuyayeaioue])ye/$1е/
s/([Б-ДЖЗК-НП-ТФ-ЩҚҒҲ])е/$1e/|s/([GʻB-DF-HJ-NP-TV-Z])e/$1е/
s/([б-джзк-нп-тф-щқғҳ])е/$1e/|s/([gʻb-df-hj-np-tv-z])e/$1е/
s/((^|\b)|[А-ЯЎҚҒҲ])Ч(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1CH/|s/((^|\b)|[OʻGʻA-Z])CH(?=[OʻGʻA-Z]+|(^|\b))/$1Ч/
s/((^|\b)|[А-ЯЎҚҒҲ])Ш(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1SH/|s/((^|\b)|[OʻGʻA-Z])SH(?=[OʻGʻA-Z]+|(^|\b))/$1Ш/
s/([ЎЁЮЯЕАИОУЭЪЬ])Ц/$1TS/|
s/([ўёюяеаиоуэъь])ц/$1ts/|
s/((^|\b))Ц/S/|
s/((^|\b))ц/s/|
s/((^|\b)|[Б-ДЖЗК-НП-ТФ-ЩҚҒҲGʻB-DF-HJ-NP-TV-Z])Ц(?=[Б-ДЖЗК-НП-ТФ-ЩҚҒҲGʻB-DF-HJ-NP-TV-Z]+|(^|\b))/$1S/|
s/((^|\b)|[б-джзк-нп-тф-щқғҳ])ц(?=[б-джзк-нп-тф-щқғҳ]+|(^|\B))/$1s/|

Все в норме?

yuklov avatar Jan 18 '20 16:01 yuklov

Кстати, после последного обновления при конвертации или траслитерации выделенного текста замена раскладки перестал работать. При конвертации последного слово раскладка меняется.

Или сначала был таким?

yuklov avatar Jan 18 '20 17:01 yuklov

после последного обновления при конвертации или траслитерации выделенного текста замена раскладки перестал работать

Ты про это? m

т.е. "чтобы менялась раскладка после конвертации выделенного".

Или про LayoutReplaces.txt?

Все в норме?

Похоже что да. Но насчёт(и похожих):

s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/

Может здесь тебе так же нужна проверка на слова после Е? Т.е. добавить (?=[А-Я]+|(^|\b)) после? чтобы проверить "является ли всё после с "ВЕРХНИМ регистром"?

Еще насчёт(повторы в []):

[OʻYOYUYAYEAIOUE]

Все символы в [] считаются отдельно(по одному), и в [](без +,*,{} после) берется только один любой из них, поэтому повторяющиеся символы не нужны: [OʻYOYUYAYEAIOUE] и [ʻAIOUE] - это одно и то же, тебе же нужно проверить на "более 1 символа", т.е. сделать можно сделать так: (Y[OUAE]|[ʻAIOUE])(r101).

BladeMight avatar Jan 18 '20 18:01 BladeMight

т.е. сделать можно сделать так: (Y[OUAE]|[ʻAIOUE])

Я в шоке! 😮

Это логично и удобно.

yuklov avatar Jan 19 '20 05:01 yuklov

т.е. "чтобы менялась раскладка после конвертации выделенного".

Да, функция уже была на программе. Просто вчера очень много работал и устал. Поэтому мне казался так. Сорри.

yuklov avatar Jan 19 '20 05:01 yuklov

s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[OʻYOYUYAYEAIOUE])YE/$1Е/

Может здесь тебе так же нужна проверка на слова после Е? Т.е. добавить (?=[А-Я]+|(^|\b)) после? чтобы проверить "является ли всё после с "ВЕРХНИМ регистром"?

По моему не нужна. Если перед Е есть гласные в ВЕРХНОМ РЕГИСТРЕ, значить все буквы на слове в ВЕРХНОМ. Последующие буквы проверить не нужно.

yuklov avatar Jan 19 '20 05:01 yuklov

1. s/Е([а-яўқғҳ])/Ye$1/|s/Ye([oʻgʻa-z])/Е$1/
2. s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[Y[OUAE]|[ʻAIOUE])YE/$1Е/

Правильно ли мой код?

  1. Для того, чтобы переводить заглавный Е как Ye и обратно. Екатеринбург => Yekaterinburg => Екатеринбург

  2. Для того, чтобы Е с буквами в верхном регистре преводился как YE и обратно Е.

Или лучше сделать 2 как: s/[ЎЁЮЯЕАИОУЭЪЬ])Е(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1YE$2/

Код (?=[А-ЯЎҚҒҲ]+|(^|\b)) должен означать не обязательность, а вероятность. Если после Е буквы в верхном регистре, должен работать правило. Если нет (например, САДИО МАНЕ, МОНЕ, ТОЛЕ => SADIO MANE, MONE, TOLE), то и тогда должен работат это правило.

Или так надо делать: s/[ЎЁЮЯЕАИОУЭЪЬ])Е|(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1YE$2/

Здесь добавил | перед (?=[А-ЯЎҚҒҲ]+|(^|\b))

yuklov avatar Jan 19 '20 06:01 yuklov

Но после этого Ye как Йе, YE как ЙЕ (в обратном). Что делать?

в

s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[Y[OUAE]|[ʻAIOUE])YE/$1Е/

тут ((^|\b)|[Y[OUAE]|[ʻAIOUE]) где [Y[OUAE]|[ʻAIOUE] должно быть в круглых скобках, почему у тебя в квадратных? Нужно было вот так:

s/((^|\b)|(Y[OUAE]|[ʻAIOUE]))YE/$1Е/

Т.е. в (Y[OUAE]|[ʻAIOUE]) будет соответствовать либо Y[OUAE](что является Y и любая буква из [] после неё) или [ʻAIOUE](что является просто любая буква из [])

или вот так: s/((^|\b)|(Y?[OUAE]|[ʻI]))YE/$1Е/ где (Y?[OUAE]|[ʻI]) значит: Y(или нет) и любой символ из [], или любой символ из [](второй там где [ʻI]

(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1YE$2/

(?=...) positive lookahead/lookbehind не ловится в группу(в этом их суть, они просто проверяют нет (или отсутствует ли если вместо = использовать !, т.е. (?=...) => (?!...), (?>=) => (?>!)) ли там (вперед для (?=...) и назад для (?>=)) того что в них) , его не нужно добавлять в замену в виде $2(и т.д.).

Ye([oʻgʻa-z])

вижу опять повторы: o и g уже есть в границе a-z, и еще дважды ʻ, может тебе нужно чтобы или соответствовали? Тогда так: Ye([oʻgʻa-z])

BladeMight avatar Jan 19 '20 09:01 BladeMight

Но после этого Ye как Йе, YE как ЙЕ (в обратном). Что делать?

в

s/((^|\b)|[ЎЁЮЯЕАИОУЭЪЬ])Е/$1YE/|s/((^|\b)|[Y[OUAE]|[ʻAIOUE])YE/$1Е/

тут ((^|\b)|[Y[OUAE]|[ʻAIOUE]) где [Y[OUAE]|[ʻAIOUE] должно быть в круглых скобках, почему у тебя в квадратных? Нужно было вот так:

s/((^|\b)|(Y[OUAE]|[ʻAIOUE]))YE/$1Е/

Т.е. в (Y[OUAE]|[ʻAIOUE]) будет соответствовать либо Y[OUAE](что является Y и любая буква из [] после неё) или [ʻAIOUE](что является просто любая буква из [])

или вот так: s/((^|\b)|(Y?[OUAE]|[ʻI]))YE/$1Е/ где (Y?[OUAE]|[ʻI]) значит: Y(или нет) и любой символ из [], или любой символ из [](второй там где [ʻI]

(?=[А-ЯЎҚҒҲ]+|(^|\b))/$1YE$2/

(?=...) positive lookahead/lookbehind не ловится в группу(в этом их суть, они просто проверяют нет (или отсутствует ли если вместо = использовать !, т.е. (?=...) => (?!...), (?>=) => (?>!)) ли там (вперед для (?=...) и назад для (?>=)) того что в них) , его не нужно добавлять в замену в виде $2(и т.д.).

Ye([oʻgʻa-z])

вижу опять повторы: o и g уже есть в границе a-z, и еще дважды ʻ, может тебе нужно чтобы или соответствовали? Тогда так: Ye([oʻgʻa-z])

Спасибо большое!

yuklov avatar Jan 19 '20 11:01 yuklov

Ye([oʻgʻa-z])

Сделал Ye([ʻa-z]) и s/((^|\b)|(Y[OUAE]|[ʻAIOUE]))YE/$1Е/ и

s/((^|\b)|[ʻA-Z])YU(?=[ʻA-Z]+|(^|\b))/$1Ю/
s/((^|\b)|[ʻA-Z])SH(?=[ʻA-Z]+|(^|\b))/$1Ш/

пока все работает нормально.

yuklov avatar Jan 19 '20 11:01 yuklov

Рад что всё получилось объяснить.

BladeMight avatar Jan 19 '20 11:01 BladeMight

Вот одно положение (но не по теме)

Если выделяю слова (или предложение) с Shift+стрелки, тогда все в норме. Но если выделяю с Ctrl+A после абзаца добовляются новые пустые абзацы. Тоест ^p.

Это когда после слова (предложение, текст) ест один пустой абзац (пуста строка) - ^p. После транслитерации один ^p становится ^p^p^p^p. Как много повторится транслитерация так и умножается ^p.

Это не очень критичный. Но все таки...

yuklov avatar Jan 19 '20 12:01 yuklov

Рад что всё получилось объяснить.

Благодарю. Спасибо большое.

Теперь Mahou - мой единственный переключатель. Раньше пользовался Пунтой и Карамбой одновременно. Один закрыл недостаток другого. Но оба не удовлетворили моим требованиям.

Mahou рекомендую и другим.

yuklov avatar Jan 19 '20 12:01 yuklov

Если выделяю слова (или предложение) с Shift+стрелки, тогда все в норме. Но если выделяю с Ctrl+A после абзаца добовляются новые пустые абзацы. Тоест ^p.

Ты про строки? Если да, то они не "множатся": Mahou NEWLINES P.S. В Notepad++ они "могут быть видимыми", я их включил чтобы показать, CR LF(на чёрном фоне).

Или ты о чем-то другом? Если да, в какой программе?

BladeMight avatar Jan 19 '20 12:01 BladeMight

в какой программе?

Наверно Word?

BladeMight avatar Jan 19 '20 12:01 BladeMight

В какой программе можно записать экранные действия. Я тоже показал бы. На ворде.

На ноутпад +++ все в норме. Я тоже тестировал. MS Word нужно тестировать.

yuklov avatar Jan 19 '20 12:01 yuklov

в какой программе?

Наверно Word?

Да

yuklov avatar Jan 19 '20 12:01 yuklov

Ну не знаю, нужно проверять в самом Word, это символ параграфа "видимый"?

BladeMight avatar Jan 19 '20 14:01 BladeMight

Ну не знаю, нужно проверять в самом Word, это символ параграфа "видимый"?

Символ параграфа включил и записал процесс: m9aptiMHVl

Слова выделены с Ctrl+A.

yuklov avatar Jan 19 '20 17:01 yuklov

А ты можешь всё что в буфере обмена(после конвертации) сохранить в файл и отправить мне?

BladeMight avatar Jan 19 '20 17:01 BladeMight

А ты можешь всё что в буфере обмена(после конвертации) сохранить в файл и отправить мне?

Если я правильно понял, вот файл, с которым я тестировал конвертации:

Файл.docx

yuklov avatar Jan 19 '20 17:01 yuklov

Символ параграфа включил и записал процесс

Знаешь, сейчас проверил у себя(всё таки пришлось установить word...) оказывается что: Пустая строка в конце в Word добавляется автоматически…, т.к. Mahou вводит новые линии как клавишу Enter, происходит такое:

действия Mahou после транслитерации:

  1. Вводит строку Ўқғҳ vfnz как текст, нажимает Enter
  2. Вводит строку Ckjdj как текст, нажимает Enter
  3. Вводит строку Ўқғҳ как текст, нажимает Enter

А Word, сам добавляет в конец еще один символ новой строки.

Я сделал небольшое исправление для случаев когда это происходит в Word, в f69745b , можно проверять в latest-commit.

BladeMight avatar Jan 19 '20 21:01 BladeMight

Это исправление не идеально, если выделить текст(только в WORD) с несколькими пустыми линиями подряд в конце выделения и не в конец файла(т.е. не включая конец файла), то Mahou может их "съесть", так что в Ctrl+A работает нормально но лучше стараться в Word не выделять текст который который заканчивается несколькими пустыми линиями и не является концом файла. Как-то так.

BladeMight avatar Jan 19 '20 21:01 BladeMight

Символ параграфа включил и записал процесс

Знаешь, сейчас проверил у себя(всё таки пришлось установить word...) оказывается что: Пустая строка в конце в Word добавляется автоматически…, т.к. Mahou вводит новые линии как клавишу Enter, происходит такое:

действия Mahou после транслитерации:

1. Вводит строку `Ўқғҳ vfnz` как текст, нажимает `Enter`

2. Вводит строку `Ckjdj` как текст, нажимает `Enter`

3. Вводит строку `Ўқғҳ` как текст, нажимает `Enter`

А Word, сам добавляет в конец еще один символ новой строки.

Я сделал небольшое исправление для случаев когда это происходит в Word, в f69745b , можно проверять в latest-commit.

Здравствуйте. Да, попробовал Libreoffice. Там не добавляется новые строки. Это проблема ворда. А после обновления нормально.

Mahou их "съел"

Но в Libreoffice процесс кодировки очень медленно. Даже еще очень. Можеть, эта проблема Либре. Там копи-паст тоже очень медленно работает. По моему, медленность от этого. Mahou сначала "копирует" текст в буфер, после этого конвертирует. По этому скорость падает.

yuklov avatar Jan 20 '20 08:01 yuklov

Это исправление не идеально, если выделить текст(только в WORD) с несколькими пустыми линиями подряд в конце выделения и не в конец файла(т.е. не включая конец файла), то Mahou может их "съесть", так что в Ctrl+A работает нормально но лучше стараться в Word не выделять текст который который заканчивается несколькими пустыми линиями и не является концом файла. Как-то так.

ОК. Так делаю.

yuklov avatar Jan 20 '20 08:01 yuklov

Вот еще одно положение связанным с транслитерацией.

Как сделать чтобы дефис в начале строки конвертировался как тире+пробел. Это для того, чтобы исправить пунктуационную ошибку текста.

Например: -Это ты? - сказал Андрей. -Да, это я, - ответил Иван.

Нужно такое:

– Это ты? - сказал Андрей. – Да, это я, - ответил Иван.

https://regex101.com/r/ZV6C27/3

Сделал код для "дефис на тире":

s/—/–/|
s/^-/$1– /|
s/ -/ – /|
s/- / – /|
s/  / /|

Сработал все, кроме s/^-/– /|. Для этого попробовал и другие варианты:

s/^-/$1– /|
s/(^)-/$1– /|

Или лучше сделать пунктуационные исправления через сниппеты?

yuklov avatar Jan 20 '20 08:01 yuklov

Или лучше сделать пунктуационные исправления через сниппеты?

Мда, у сниппетов другая функция. Это перевод при наборе. Этой функции у меня другие задачи 😂. И задач много.

yuklov avatar Jan 20 '20 09:01 yuklov

https://regex101.com/r/ZV6C27/3

Зачем ловить "начало строки"? Оно всегда будет пустое, почитай страничку, ссылку которой я привел ниже.

s/^-/$1– /|

Зачем тебе $1 когда у тебя не пойманных групп(), рекомендую почитать: wikibooks/regex)? Просто убери $1: s/^-/– /| и все будет работать

Или лучше сделать пунктуационные исправления через сниппеты?

В сниппетах кстати(с недавних пор) тоже можно использовать regex, пример:

->regex/^-$/
====>– <====

после -> regex/и обязательно в конце /.

Но сниппеты работают "по слову", а не "по линии" так что этот сниппет будет просто заменять любой 1 написанный - на . Для таких случаев лучше использовать что-то вроде такого:

->--
====>c<====

Т.е. заменять 2 - на .

BladeMight avatar Jan 20 '20 12:01 BladeMight

Просто убери $1: s/^-/– /| и все будет работать

Я это тестировал. Сработал только на первом строке:

-Кто говорил? -Я говорил. -Я так и думал. 👇 – Kto govoril? -YA govoril. -YA tak i dumal. 👇 – Кто говорил? -Я говорил. -Я так и думал.

yuklov avatar Jan 20 '20 14:01 yuklov

->regex/^-$/ ====>– <====

Эта сработает только тогда, когда после "-" добавлю один пробел. При

-Текст начинается. -Что начинатается?

не сработает у меня.

yuklov avatar Jan 20 '20 14:01 yuklov

не сработает у меня

Тут нужно, что-то такое:

->regex/^-(.*?)(?!.* )$/
====>– $1<====

(?!.* ) - необходимый кусок, чтобы не срабатывало на "двойных сниппетах"(сниппетах из двух слов соединенных пробелом). как и ^ с $.

-Текст => – Текст

BladeMight avatar Jan 20 '20 14:01 BladeMight

Я это тестировал. Сработал только на первом строке

Ах, да Mahou считает всё выделение за одну строку, нужно будет добавить правила разбивки на линии...

BladeMight avatar Jan 20 '20 15:01 BladeMight

->regex/^-(.*?)(?!.* )$/ ====>– $1<====

Добавил этот код в сниппет. Результат: – Первая Первая строка норм. Но после второй проблема. Например, если на второй строке пишу что-то, скажем "-Второя" такрой результат (первая и вторая соединяются + необъяснимые комбинации)

– Первая – В– Второя -Третя 

После что-то напишу передние строки и символы автоматически удаляются.

yuklov avatar Jan 20 '20 15:01 yuklov

хм, а ты уверен что сниппет правильно стоит: Mahou NEWLINES

BladeMight avatar Jan 20 '20 15:01 BladeMight

хм, а ты уверен что сниппет правильно стоит:

deb4c776-2f5a-4183-a12c-8ef6712cb457

Здесть тестировал на ноутпад и ворде.

yuklov avatar Jan 20 '20 16:01 yuklov

s/^-(.?)(?!. )$/– $1|

Этот код вставил в TSDict.txt. Там тоже не сработал. Или что-то не так в коде?

yuklov avatar Jan 20 '20 16:01 yuklov

А ты сравни:

->regex/^-(.*?)(?!.* )$/

s/^-(.?)(?!. )$/– $1|

* отсутствуют.

BladeMight avatar Jan 20 '20 16:01 BladeMight

Здесть тестировал на ноутпад и ворде

Скорее всего у тебя развёртывание стоит на Tab а не на Space, в Notepad++ эта клавиша так же подверждает автодополнение. Но здесь есть еще кое-что сейчас проверю...

BladeMight avatar Jan 20 '20 16:01 BladeMight

Скинь мне свои настройки(Mahou.ini) или отладочную информацию из вкладки "О..."

BladeMight avatar Jan 20 '20 16:01 BladeMight

* отсутствуют. 😲 s/^-(.*?)(?!.* )$/– $1/|

Вах! После этого сработал!

yuklov avatar Jan 20 '20 16:01 yuklov

Скинь мне свои настройки(Mahou.ini) или отладочную информацию из вкладки "О..."

MAHOU DEBUG INFO
Environment info
  • Mahou 2.9.0.1-dev
  • OS = [Microsoft Windows NT 6.2.9200.0]
  • x64 = [True]
  • .Net = [4.0.30319.42000]
All installed layouts

Uzbek Latin Keyboard by Hamza (v2.0)(4039115843) Узбекская (кириллица)(138610755) США(67699721) Русская(68748313)

Mahou.ini
[FirstStart]
First=False
[Functions]
AutoStartAsAdmin=False
TrayIconVisible=True
ConvertSelectionLayoutSwitching=False
ReSelect=True
RePress=False
AddOneSpaceToLastWord=True
AddOneEnterToLastWord=False
ConvertSelectionLayoutSwitchingPlus=False
ScrollTip=False
StartupUpdatesCheck=True
SilentUpdate=True
Logging=False
CapsLockTimer=False
TrayFlags=False
BlockMahouHotkeysWithCtrl=False
SymbolIgnoreModeEnabled=false
MCDServerSupport=False
OneLayoutWholeWord=True
GuessKeyCodeFix=False
AppDataConfigs=False
RemapCapslockAsF18=False
UseJKL=True
ReadOnlyNA=False
WriteInputHistoryHourly=false
WriteInputHistoryByDate=false
WriteInputHistory=False
WriteInputHistoryBackSpaceType=0
TrayText=False
[Layouts]
SwitchBetweenLayouts=True
OneLayout=False
EmulateLayoutSwitch=False
EmulateLayoutSwitchType=Alt+Shift
ChangeToSpecificLayoutByKey=True
MainLayout1=Узбекская (кириллица)(138610755)
MainLayout2=Uzbek Latin Keyboard by Hamza (v2.0)(4039115843)
SpecificKey1=3
SpecificKey2=0
SpecificKey3=0
SpecificKey4=0
SpecificLayout1=Переключать между раскладками
SpecificLayout2=Переключать между раскладками
SpecificLayout3=
SpecificLayout4=
SpecificKeysType=0
SpecificKeySets=set_0
QWERTZfix=False
[PersistentLayout]
OnlyOnWindowChange=False
ChangeOnlyOnce=False
ActivateForLayout1=False
ActivateForLayout2=False
Layout1CheckInterval=50
Layout2CheckInterval=50
Layout1Processes=devenv.exe wdexpress.exe
Layout2Processes=notepad++.exe winword.exe
[Appearence]
DisplayLangTooltipForMouse=False
DisplayLangTooltipForMouseOnChange=False
DisplayLangTooltipForCaret=False
DisplayLangTooltipForCaretOnChange=False
DifferentColorsForLayouts=False
MouseLTAlways=False
Language=Русский
Layout1ForeColor=#000000
Layout1BackColor=#FFFFFF
Layout1TransparentBackColor=False
Layout1Font=Georgia; 8pt
Layout1Height=14
Layout1Width=26
Layout1PositionX=8
Layout1PositionY=0
Layout2ForeColor=#000000
Layout2BackColor=#FFFFFF
Layout2TransparentBackColor=False
Layout2Font=Georgia; 8pt
Layout2Height=14
Layout2Width=26
Layout2PositionX=8
Layout2PositionY=0
MouseLTForeColor=#000000
MouseLTBackColor=#FFFFFF
MouseLTFont=Georgia; 8pt
MouseLTHeight=14
MouseLTWidth=26
MouseLTPositionX=8
MouseLTPositionY=0
CaretLTForeColor=#000000
CaretLTBackColor=#FFFFFF
MouseLTTransparentBackColor=False
CaretLTTransparentBackColor=False
CaretLTFont=Georgia; 8pt
CaretLTHeight=14
CaretLTWidth=26
CaretLTPositionX=8
CaretLTPositionY=12
MCDS_Pos_X=58
MCDS_Pos_Y=13
MCDS_Top=60
MCDS_Bottom=45
MouseLTUseFlags=False
CaretLTUseFlags=False
Layout1LTText=
Layout2LTText=
MouseLTUpperArrow=False
CaretLTUpperArrow=False
WindowsMessages=True
[Timings]
DelayAfterBackspaces=100
UseDelayAfterBackspaces=False
LangTooltipForMouseRefreshRate=25
LangTooltipForCaretRefreshRate=25
DoubleHotkey2ndPressWait=350
FlagsInTrayRefreshRate=100
ScrollLockStateRefreshRate=100
CapsLockDisableRefreshRate=100
SelectedTextGetMoreTries=False
SelectedTextGetMoreTriesCount=5
ExcludedPrograms=LA.exe SomeProg.exe
UsePasteInCS=False
ExcludeCaretLD=false
ChangeLayoutInExcluded=True
LangTooltipForMouseSkipMessages=5
[Snippets]
SnippetsEnabled=True
SpaceAfter=True
SwitchToGuessLayout=False
SnippetExpandKey=Space
[AutoSwitch]
Enabled=False
SpaceAfter=True
SwitchToGuessLayout=False
DownloadInZip=True
[Hotkeys]
ToggleMainWindow_Enabled=True
ToggleMainWindow_Double=False
ToggleMainWindow_Modifiers=Win + Control + Shift + Alt
ToggleMainWindow_Key=45
ConvertLastWord_Enabled=True
ConvertLastWord_Double=True
ConvertLastWord_Modifiers=Shift
ConvertLastWord_Key=0
ConvertSelectedText_Enabled=True
ConvertSelectedText_Double=True
ConvertSelectedText_Modifiers=Shift
ConvertSelectedText_Key=0
ConvertLastLine_Enabled=True
ConvertLastLine_Double=False
ConvertLastLine_Modifiers=Shift
ConvertLastLine_Key=19
ConvertLastWords_Enabled=True
ConvertLastWords_Double=False
ConvertLastWords_Modifiers=Shift
ConvertLastWords_Key=122
ToggleSymbolIgnoreMode_Enabled=True
ToggleSymbolIgnoreMode_Double=False
ToggleSymbolIgnoreMode_Modifiers=Shift + Control
ToggleSymbolIgnoreMode_Key=122
SelectedTextToTitleCase_Enabled=True
SelectedTextToTitleCase_Double=False
SelectedTextToTitleCase_Modifiers=Win + None
SelectedTextToTitleCase_Key=45
SelectedTextToRandomCase_Enabled=False
SelectedTextToRandomCase_Double=True
SelectedTextToRandomCase_Modifiers=Alt
SelectedTextToRandomCase_Key=0
SelectedTextToSwapCase_Enabled=True
SelectedTextToSwapCase_Double=False
SelectedTextToSwapCase_Modifiers=Alt
SelectedTextToSwapCase_Key=45
SelectedTextTransliteration_Enabled=True
SelectedTextTransliteration_Double=False
SelectedTextTransliteration_Modifiers=None
SelectedTextTransliteration_Key=45
SelectedToUpper_Enabled=False
SelectedToUpper_Double=False
SelectedToUpper_Modifiers=Win + 
SelectedToUpper_Key=90
SelectedToLower_Enabled=False
SelectedToLower_Double=False
SelectedToLower_Modifiers=Win
SelectedToLower_Key=88
ExitMahou_Enabled=True
ExitMahou_Double=False
ExitMahou_Modifiers=Win + Control + Shift + Alt
ExitMahou_Key=123
RestartMahou_Enabled=True
RestartMahou_Modifiers=Shift + Alt
RestartMahou_Key=33
ToggleLangPanel_Enabled=True
ToggleLangPanel_Double=False
ToggleLangPanel_Modifiers=Shift
ToggleLangPanel_Key=120
ShowSelectionTranslate_Enabled=False
ShowSelectionTranslate_Double=True
ShowSelectionTranslate_Modifiers=Alt
ShowSelectionTranslate_Key=0
ToggleMahou_Enabled=True
ToggleMahou_Double=False
ToggleMahou_Modifiers=Win + Shift
ToggleMahou_Key=112
CycleCase_Enabled=True
CycleCase_Double=False
CycleCase_Modifiers=Win + None
CycleCase_Key=114
[LangPanel]
Display=False
Transparency=90
RefreshRate=25
Position=X0 Y0
ForeColor=#000000
BackColor=#FFFFFF
Font=Microsoft Sans Serif; 8,25pt
BorderColor=#8B5FFF
BorderAeroColor=True
UpperArrow=True
[Updates]
Delay=5
Channel=LatestCommit(Beta)
LatestCommit=f69745b
[Sounds]
CustomSound2=
UseCustomSound2=False
OnLayoutSwitch2=True
OnConvertLast2=False
OnSnippets2=True
OnAutoSwitch2=False
CustomSound=
UseCustomSound=False
OnLayoutSwitch=False
OnConvertLast=True
OnSnippets=False
OnAutoSwitch=True
Enabled=False
[TranslatePanel]
LanguageSets=set_1/auto/ru|set_2/auto/en
BG=#FFFFFF
BorderC=#F1F100
FG=#8B5FFF
Transparency=90
BorderAero=False
OnDoubleClick=False
UseNA=True
UseGS=False
Enabled=False
TitleFont=Segoe UI; 12pt
TextFont=Microsoft Sans Serif; 8,25pt
[Sync]
BLast=
RLast=
RBools=1|1|1|1|0
BBools=1|1|1|1|0
[Hidden]
__selection=false
CycleCaseReset=false
CycleCaseOrder=TULSR
LibreCtrlAltShiftV=false


</details>
</details>

yuklov avatar Jan 20 '20 16:01 yuklov

А, понял правильный regex будет: ->regex/^-(?!.* )(.*?)$/, нужно было проверку на пробел (?!.* ) ставить до ловли всего что после, произошло как раз то о чём я писал:

(?!.* ) - необходимый кусок, чтобы не срабатывало на "двойных сниппетах"(сниппетах из двух слов соединенных пробелом). как и ^ с $.

см.: https://regex101.com/r/PQFDxs/1

BladeMight avatar Jan 20 '20 16:01 BladeMight

в Mahou есть такая возможность "двойные сниппеты", т.е. по 2 последним словам, например:

->так то
====>так-то<====

Поэтому при использовании regex в сниппетах нужно проверять двойной ли сниппет, наличием пробела, или нет.

BladeMight avatar Jan 20 '20 16:01 BladeMight

->regex/^-(?!.* )(.*?)$/

Да! После этого сработал! Но это когда пробел. Если нажму Enter не сработает. Как изменить код, чтобы сработал с Интером?

(Если трудно, не объясни. Я уж много спросил)

yuklov avatar Jan 20 '20 16:01 yuklov

Но это когда пробел

Ну так сниппеты "срабатывают" только по Space/Tab, если настроена клавиша развёртывания.

BladeMight avatar Jan 20 '20 16:01 BladeMight

Но это когда пробел

Ну так сниппеты "срабатывают" только по Space/Tab, если настроена клавиша развёртывания.

Понял.

yuklov avatar Jan 20 '20 17:01 yuklov

Это снова я.

При работе с Mahou новые идеи приходятся. Да, я пытаюсь их реализовать сам, но иногда (или часто 😂) возникают трудности. Сейчас как раз такое время.

Ну, хотел перевести знак " как “ и ”. Кавычки хотел сделать "правильном" при наборе. Да, в текстовых редакторах такая функция есть. Но в браузерах, в Телеграм и т.п. кавычки набираю с помощью нескольких клавиш.

Вот такой текст, например: "Это текст". Хочу при наборе превратить его в: “Это текст”.

Для этого сделал код в сниппетах:

->regex/(^|\s)"(\w|[а-яўқғҳА-ЯЎҚҒҲ])/
====>$1“$2<====

->regex/(\w|[а-яўқғҳА-ЯЎҚҒҲ"])"(\s)/
====>$1”$2<====

Но не сработал. Хотя, здесь сработал: https://regex101.com/r/ZV6C27/5 https://regex101.com/r/PQFDxs/2

Куда-то * поставить нужно? Чтобы сработал сразу как в предыдущий раз?

yuklov avatar Jan 20 '20 18:01 yuklov

Ну, хотел перевести знак " как “ и ”. Кавычки хотел сделать "правильном" при наборе. Да, в текстовых редакторах такая функция есть. Но в браузерах, в Телеграм и т.п. кавычки набираю с помощью нескольких клавиш.

"Это текст". => “Это текст”.

Если ты будешь это делать с помощью сниппетов, то будет работать только для 2 слов, потому как для сниппетов максимум 2 слова, так что

Я думаю что тебе больше подойдёт функция __selection() в сниппетах, в Mahou есть скрытая функция __selection ее сначала нужно вручную включить в Mahou.ini(поставить __selection=true в группе [Hidden], Mahou должен быть закрыт!) После её можно использовать вот так: Делаешь такой сниппет:

->"""
====>“__selection()“<====

Теперь выделяй любой текст, Пример поверх него пиши сниппет """ и нажимай пробел, получиться: “Пример“, если функция не включена в Mahou.ini результат будет такой: ““, гифка: Mahou __selection

BladeMight avatar Jan 20 '20 19:01 BladeMight

Ну, хотел перевести знак " как “ и ”. Кавычки хотел сделать "правильном" при наборе. Да, в текстовых редакторах такая функция есть. Но в браузерах, в Телеграм и т.п. кавычки набираю с помощью нескольких клавиш.

"Это текст". => “Это текст”.

Если ты будешь это делать с помощью сниппетов, то будет работать только для 2 слов, потому как для сниппетов максимум 2 слова, так что

Я думаю что тебе больше подойдёт функция __selection() в сниппетах, в Mahou есть скрытая функция __selection ее сначала нужно вручную включить в Mahou.ini(поставить __selection=true в группе [Hidden], Mahou должен быть закрыт!) После её можно использовать вот так: Делаешь такой сниппет:

->"""
====>“__selection()“<====

Теперь выделяй любой текст, Пример поверх него пиши сниппет """ и нажимай пробел, получиться: “Пример“, если функция не включена в Mahou.ini результат будет такой: ““, гифка: Mahou __selection

Сделал все, как сказано здесь. Но результат был такой:

““

Как будь-то функция не включена.

Ну, этот способ более трудно. По моему, пока лучше использовать клавиши:

alt+0147 => “
alt+0148 => ”

yuklov avatar Jan 21 '20 05:01 yuklov

->regex/(^|\s)"(\w|[а-яўқғҳА-ЯЎҚҒҲ])/
====>$1“$2<====

->regex/(\w|[а-яўқғҳА-ЯЎҚҒҲ"])"(\s)/
====>$1”$2<====

https://regex101.com/r/ZV6C27/5 https://regex101.com/r/PQFDxs/2

А эти можно использовать каким-то способом?

yuklov avatar Jan 21 '20 05:01 yuklov

Пока нашёл такой способ:

->regex/^"(?!.* )(.*?)$/
====>“$1<====
->regex/^(?!.* )(.*?)"$/
====>$1”<====

Все в норме, но только если слово в кавычках одно, второй кавычка на заменяется:

“Книга" (последний " остался не изменённым)

“Книга и тетрадь” (все в норме)

yuklov avatar Jan 21 '20 05:01 yuklov

Как будь-то функция не включена.

Открой Mahou.ini в notepad++, найди [Hidden], снизу найди __selection=false и поставь на __selection=true, и тогда заработает, и потом в Mahou нажми "Применить"!

Все в норме, но только если слово в кавычках одно, второй кавычка на заменяется

Тебе нужно еще одно правило:

->regex/^"(?!.* )(.*?)"$/
====>“$1“<====

И нужно поставить их в таком порядке:

->regex/^"(?!.* )(.*?)"$/
====>“$1“<====
->regex/^"(?!.* )(.*?)$/
====>“$1<====
->regex/^(?!.* )(.*?)"$/

Ну, этот способ более трудно

Разве? Просто выделяешь текст который хочешь "заключить” в кавычки, поверх него пишешь “сниппет“ (в котором есть __selection()) и он заменяет выделенный текст на заключенный в кавычках.

BladeMight avatar Jan 21 '20 12:01 BladeMight

Разве? Просто выделяешь текст который хочешь "заключить” в кавычки, поверх него пишешь “сниппет“ (в котором есть __selection()) и он заменяет выделенный текст на заключенный в кавычках.

Это я о наборе говорил. При наборе лучше набирать без остановки.

yuklov avatar Jan 21 '20 13:01 yuklov

->regex/^"(?!.* )(.?)"$/ ====>“$1“<==== ->regex/^"(?!. )(.?)$/ ====>“$1<==== ->regex/^(?!. )(.*?)"$/

Подледной строки здесь нету, да? Мне поставить нужно ли это: ====>$1”<====

UPD. Поставил, работает.

yuklov avatar Jan 21 '20 13:01 yuklov

Открой Mahou.ini в notepad++, найди [Hidden], снизу найди __selection=false и поставь на __selection=true, и тогда заработает, и потом в Mahou нажми "Применить"!

Я точно так делал. Почему-то не сработал. Перед изменением Mahou.ini закрывал программу полностью. Сохранил Mahou.ini с __selection=true, потом запусил программу. А результат был “” без текста.

Для меня

->regex/^"(?!.* )(.?)"$/ ====>“$1”<==== ->regex/^"(?!. )(.?)$/ ====>“$1<==== ->regex/^(?!. )(.*?)"$/ ====>$1”<====

лучший способ. Сработает отлично. Спасибо большое.

yuklov avatar Jan 21 '20 13:01 yuklov

лучший способ

Ну раз так, тогда пожалуйста.

__selection=true

Это лучше убрать, если не используешь.

BladeMight avatar Jan 21 '20 13:01 BladeMight

Это лучше убрать, если не используешь.

ОК.

yuklov avatar Jan 21 '20 13:01 yuklov

Насчёт:

А результат был “” без текста.

А ты выделял текст и писал поверх него сниппет и Space, так ведь?

BladeMight avatar Jan 21 '20 13:01 BladeMight

Пользуюсь моментом, задаю вопрос. Пока ты здесь 😂.

Вот код:

->regex/^-(?!.* )(.*?)$/
====>–$1<====
->regex/^(?!.* )(.*?)-$/
====>$1–<====

Сработает, превращает - на –. Но есть такие моменты: –Это диалог. –Разве это диалог? –Да.

После – нужно поставить один пробел. Сначала это сделал с помощью – $1. Но тогда два пробела добавляются, когда тире внутри предложение. Например:

– Эта диалог? – спросил он.

Здесь перед словом спросил 2 пробела. Как делать чтобы начальный дефис кодировался как тире+пробел, дефис с пробелом внутри предложения превратился пробел+тире+пробел.

Сейчас в сниппетах вышеуказанный код. Но этот код после начального тире и после слова, когда перед дефисом нет пробела (например, код– это поэзия, нужно это: код – это поэзия), не поставить пробел.

Если ли лечение?

yuklov avatar Jan 21 '20 14:01 yuklov

Если ли лечение?

Вот такой:

->regex/^-\s(.*?)$/
====>–$1<====

Но он не будет работать вместе с этими двумя:

->regex/^-(?!.* )(.*?)$/
====>–$1<====
->regex/^(?!.* )(.*?)-$/
====>$1–<====

P.S. #260 читал?

BladeMight avatar Jan 21 '20 14:01 BladeMight

P.S. #260 читал?

Сейчас читаю и занимаюсь “программированием” 🙃.

yuklov avatar Jan 21 '20 14:01 yuklov