1 (изменено: vladmany, 2018-11-11 01:26:46)

Тема: AHK: Обработка текста из буфера обмена

Доброго времени суток, форумчане. Мне нужна помощь в написании скрипта, который при нажатии допустим alt+H, жмёт ctrl+a(выделяет весь текст), обрабатывает выделенное, и вставляет обработанную версию исходного текста. Обработка должна быть примерно такая:
Скрипт обращается к специально заготовленному файлу, который содержит слова для поиска в исходном тексте, и слова для их замены. Тоесть, допустим у нас в исходном тексте где-то написано слово "distance" и нам его нужно заменить на "d". В нашем файле, в массиве будет содержатся такая надпись:
    "distance": "d"
Где слева это слово для поиска его в тексте, а после двоеточия слово для его замены.
Таких слов в том файле будет много, даже я думаю несколько массивов, только вот как это реализовать.. Буду рад вашей помощи.

2 (изменено: vladmany, 2018-11-11 10:50:42)

Re: AHK: Обработка текста из буфера обмена

Я не прошу написать мне весь скрипт, мне нужно узнать лишь структуру обращения к файлу, сравнения текста из файла, замена его на текст из этого же файла. Я просто попросил помощи, а вы меня сразу в коммерческий раздел направляете. Нe уж то здесь даже банальная помощь делается за деньги?

3

Re: AHK: Обработка текста из буфера обмена

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

4

Re: AHK: Обработка текста из буфера обмена

KusochekDobra пишет:

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

Дело в том, что я даже не знаю с чего начать, ибо только начал учить ahk. Был бы рад хотя-бы ссылкам на справки по теме. А если кто-то распишет примерный алгоритм действий, можно даже на словах, буду вдвойне благодарен.

5

Re: AHK: Обработка текста из буфера обмена

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

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

Изучите команду Loop (чтение файла) и ассоциативный массив.

6

Re: AHK: Обработка текста из буфера обмена

https://autohotkey.com/docs/commands/RegExReplace.htm
https://autohotkey.com/docs/misc/RegEx-QuickRef.htm
https://autohotkey.com/docs/Objects.htm

list := {"была":"были","собака":"собаки"}
text := "У попа была собака."
for k,v in list
   text := RegexReplace(text, "(*UCP)\b\Q" k "\E\b", v)
msgbox % text
+ DD

7

Re: AHK: Обработка текста из буфера обмена

Кавычки нужны для замены слов, пишущихся через дефис.

8 (изменено: vladmany, 2018-11-12 12:17:16)

Re: AHK: Обработка текста из буфера обмена

Malcev, спасибо большое! Буду разбираться..

9 (изменено: vladmany, 2018-11-12 23:22:11)

Re: AHK: Обработка текста из буфера обмена

Malcev, в вашем примере более менее разобрался. Для моей задачи мне нужно брать слова для замены из файла. Занес заменяемые слова в файл, в коде прописал, чтобы скрипт читал из этого файла текст и заносил его в ту же переменную list, но проблема в том, что RegexReplace игнорирует слова из файла и не заменяет то, что должен. В чем же моя ошибка? Пытался заносить текст из файла не в переменную, а в массив, ибо это логично, но даже это не решило проблему. Может в самом RegexReplace что-то не так, ибо я сильно в его параметры не углублялся. Как всегда буду рад вашей помощи.
https://i.imgur.com/XZJ7Jcx.png

10

Re: AHK: Обработка текста из буфера обмена

vladmany пишет:

Пытался заносить текст из файла не в переменную, а в массив, ибо это логично, но даже это не решило проблему

http://forum.script-coding.com/viewtopic.php?id=12474

11

Re: AHK: Обработка текста из буфера обмена

Malcev, не особо помогло то что там пишут. Я уже знаю что мне нужен ассоциативный массив, но как его правильно написать, чтобы RegExReplace его нормально видел? Если вам не сложно, переделайте свой, вышеупомянутый пример так, чтобы инструкции по замене слов брались из файла. Так мне будет проще всего разобраться и понять как это делается.

12

Re: AHK: Обработка текста из буфера обмена

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

txt =
(
была: были
собака: собаки
)

for k,v in txt
   msgbox %k% = %v%

Читайте:
https://autohotkey.com/docs/commands/StringSplit.htm

13 (изменено: vladmany, 2018-11-13 20:22:49)

Re: AHK: Обработка текста из буфера обмена

Malcev, простите что надоедаю, просто ahk пока для меня тёмный лес, мне легче его осваивать на примерах других.  Пример той задачи, которую
мне нужно было выполнить, а именно, создание массива из файла, я искал в интернете, и долго искал. Ну чудом как-то с этим уже разобрался. Теперь последнее что я у вас попрошу, это показать мне, как можно по среди проверяемого текста указать скрипту, что на этом месте может быть либо какое-то целое число, либо ничего. Или например чтобы на этом месте было любое слово, которое находится в заранее созданном массиве. Реально это вообще реализовать без костылей?

14

Re: AHK: Обработка текста из буфера обмена

Приведите пример,  а то ничего не понятно, что вы хотите добиться.

15 (изменено: vladmany, 2018-11-13 22:28:57)

Re: AHK: Обработка текста из буфера обмена

Malcev
Есть текст:
Завтра Юле исполнится 16 лет.
Скрипт его должен заменить на:
Сегодня Юле исполнилось 16 лет.
При этом, синтаксис этой фразы такой:
%Любое слово из заранее созданного массива, в котором будут слова: Вчера, Позавчера, Завтра, Послезавтра% Юле %любое слово из: исполнится, исполнилось% %любое целое число% лет.
Если синтаксис подтвердился, то текст заменяется на:
Сегодня Юле исполнилось 16 лет.

16

Re: AHK: Обработка текста из буфера обмена

Это делается через регулярные выражения.
Чтобы вам его написать, нужно читать по ним справку с примерами (на русском тоже имеется, правда не полная).
С наскоку их понять вряд ли получится.

17

Re: AHK: Обработка текста из буфера обмена

Malcev
Я уже о них наслышан. Думал может без них как-нибудь можно реализовать данную задачу.. Всё таки без костылей походу не обойдется..

18 (изменено: DD, 2018-11-14 23:43:07)

Re: AHK: Обработка текста из буфера обмена

При заменах по списку слов из переменной "list" — как сделать, чтобы регистр из переменной "text" не изменялся?

text := "У попа былА собАка"
list =
(
была
собака
)
Loop, Parse, list, `n
{
   list := A_LoopField
   text := RegexReplace(text, "i)(*UCP)\b\Q" list "\E\b", "_" list "_")
}
msgbox % text

19 (изменено: DD, 2018-11-14 23:49:08)

Re: AHK: Обработка текста из буфера обмена

vladmany


text := "У попа была собака."
list_file = %A_ScriptDir%\list.txt
;СОДЕРЖАНИЕ ФАЙЛА:
/*
была:были
собака:собаки
*/

Loop, read, %list_file%
{
   StringSplit, list, A_LoopReadLine, :
   text := RegexReplace(text, "(*UCP)\b\Q" list1 "\E\b", list2)
}
msgbox % text

20 (изменено: DD, 2018-11-15 02:55:17)

Re: AHK: Обработка текста из буфера обмена

Вроде получилось. Но как обрабатывать случаи, когда искомое содержит единицу или латинскую «I»?

text := "У попа былА со1бАӀка"
list =
(
была
собака
)

Loop, Parse, list, `n
{
   list := A_LoopField
   RegExMatch(text, "i)(*UCP)\b\Q" list "\E\b", found)
   text := RegexReplace(text, "is)(*UCP)\b\Q" list "\E\b", "«" found "»")
}
msgbox % text

21

Re: AHK: Обработка текста из буфера обмена

Зачем тут RegexMatch?
Почитайте про обратные ссылки в регулярных выражениях.
С чего вдруг искомое должно содержать латинскую I или единицу?

22 (изменено: DD, 2018-11-15 03:49:33)

Re: AHK: Обработка текста из буфера обмена

Туговато с обратными ссылками)). Особенно на этом примере — с незнакомой конструкцией и переменными внутри. А единица и прочее среди кириллицы — это для обработки текстов национальных языков РФ, где ими фактически передают так называемую кириллическую «Палочку», которую на письме часто заменяют похожими аналогами с доступной клавиатуры: I, l, etc.

23

Re: AHK: Обработка текста из буфера обмена

Так вроде должно было работать:

text := RegexReplace(text, "i)(*UCP)\b\Q(\w+)\E\b", "«$1»")

24

Re: AHK: Обработка текста из буфера обмена

Обратная ссылка сохраняет найденное в $0. В справке об этом есть информация с примерами. По поводу единицы и i наверное придется проверять их присутствие после каждой буквы искомого слова.

+ DD

25

Re: AHK: Обработка текста из буфера обмена

Придумал брать слово из списка, замнять в нём вариации I — на конструкцию (I|Ӏ|l|1), затем передавать в таком виде в поиск через рег. выражения в основном тексте. Почему не передаётся? —

text := "У попа былА со1бАӀка"
list =
(
соӀбаӀка
)

Loop, Parse, list, `n
{
   list := A_LoopField

   list := RegexReplace(list, "i)(I|Ӏ|l|1)", "(I|Ӏ|l|1)")
   msgbox % list
   RegExMatch(text, "is)(*UCP)\b(\Q" list "\E)\b", found)
   msgbox % found

   text := RegexReplace(text, "is)(*UCP)\b\Q" list "\E\b", "«" found "»")
}
msgbox % text