#Include <Misc.au3>
;~ Предотвращаем запуск двух копий программы
if _Singleton("test",1) = 0 Then
TrayTip ("AutoIt", "TreyGREP уже запущен", 1)
sleep(1000)
TrayTip("clears any tray tip","",0)
Exit
EndIf
;~ Добавляем пользовательское меню в трей
TraySetState ( 1 )
Opt("TrayMenuMode", 1)
;~ Устанавливаем хоткеи. Так как раскладка может быть и русской и английской, дублируем хоткеи для обеих раскладок
HotKeySet("^x", "_Replace")
HotKeySet("^ч", "_Replace")
HotKeySet("^+x", "_Exit")
HotKeySet("^+ч", "_Exit")
;~ Объявление переменных и массивов
Global $i, $a, $Text
Dim $Search[1000][2]
Dim $Matches, $Splited
;~ Путь к ini-файлу
$IniFile = @ScriptDir & "\" & "TrayGREP.ini"
;~ Создаем меню в трее
$Edit = TrayCreateItem("Редактировать список замен")
$Exit = TrayCreateItem("Выход")
;~ Если ini не найден...
if not FileExists($IniFile) Then
TrayTip ("AutoIt", "Не могу найти файл ""TrayGREP.ini""", 1)
sleep(2000)
TrayTip("clears any tray tip","",0)
Exit
Else
$in = FileOpen("TrayGREP.ini", 0)
$line = FileReadLine($in, 1)
if $line <> "TrayGREP v.1.0. Автор идеи и разработчик - Suppir." Then
TrayTip ("AutoIt", "Информация о разработчике была повреждена", 1)
sleep(3000)
TrayTip("clears any tray tip","",0)
TrayTip ("AutoIt", "Восстановите информацию или скачайте утилиту заново", 1)
sleep(3000)
TrayTip("clears any tray tip","",0)
Exit
EndIf
EndIf
;~ Подсказки в трее пользователю
TrayTip ("AutoIt", "TrayGREP запущен", 1)
sleep(2000)
;~ Подсказки внеобходимо убирать вручную
TrayTip("clears any tray tip","",0)
;~ Основной цикл программы
While 1
Switch TrayGetMsg()
;~ Если выбрали "редактировать список замен"...
Case $Edit
;~ То открываем ini блокнотом. Здесь может быть проблема, если для открывания ini назначена другая программа
ShellExecute ($IniFile)
TrayItemSetState ( $Edit, 4 )
;~ Если выбрали "выйти", завершаем программу
Case $Exit
TrayItemSetState ( $Edit, 4 )
_Exit()
EndSwitch
WEnd
;~ Функция завершения программы
Func _Exit()
TrayTip ("AutoIt", "Завершение работы TrayGREP", 1)
Sleep(1000)
Exit
EndFunc
;~ Функция замены текста
Func _Replace()
;~ Если в буфере обмена ничего нет, то давать предупреждение
if ClipGet() = "" Then
TrayTip ("AutoIt", "Буфер пустой!", 1)
sleep(1000)
TrayTip("clears any tray tip","",0)
Else
;~ Считываем ini-файл. Здесь может быть проблема. Если запустить программу, а потом удалить ini, то функция не будет работать
$in = FileOpen("TrayGREP.ini", 0)
while 1
;~ Читаем строки в ini последовательно
local $i
$line = FileReadLine($in)
If @error = -1 Then ExitLoop
;~ Если находим строку "найти то-то", то запоминаем регексп в двумерный массив $Search[][]
;~ Левый элемент массива равен "найти", правый - "заменить"
$Matches = StringRegExp($line, "^Найти:(.+)", 1)
If @error = 0 Then
$Search[$i][0] = $Matches[0]
ContinueLoop
EndIf
;~ Если находим строку "Заменить на:" после которой сразу конец строки, то задаем значение переменной $Search[$i][1] = "".
;~ Если этого не делать, то поиск в таких случаях не будет работать.
$Matches = StringRegExp($line, "^Заменить на:$", 1)
If @error = 0 Then
$Search[$i][1] = ""
$i += 1
ContinueLoop
EndIf
;~ Запоминаем переменную замены
$Matches = StringRegExp($line, "^Заменить на:(.+)", 1)
If @error = 0 Then
$Search[$i][1] = $Matches[0]
$i += 1
ContinueLoop
EndIf
wend
TrayTip ("AutoIt", "Произвожу замену...", 1)
;~ Берем строку из буфера
$Text = ClipGet()
;~ И разрезаем ее в массив по символам конца строки. Если этого не делать, то замена будет производиться только для первого встреченного абзаца.
$Splited = StringSplit($Text, @CRLF, 1)
$Text = ""
;~ На каждую строку в массиве $Splited применяем регулярные выражения из массива $Search
For $x = 1 to UBound($Splited)-1
for $i = 0 to UBound($Search) - 1
$Splited[$x] = StringRegExpReplace($Splited[$x], $Search[$i][0], $Search[$i][1])
Next
;~ После чего склеиваем строки обратно
if $Text = "" Then
$Text = $Splited[$x]
Else
$Text = $Text & @CRLF & $Splited[$x]
EndIf
Next
;~ И записываем результат в буфер обмена
ClipPut($Text)
TrayTip ("AutoIt", "Замена произведена", 1)
sleep(1000)
TrayTip("clears any tray tip","",0)
EndIf
EndFunc
;~ необходимо добавить функции
;~ 1) объявление вспомогательных переменных в ini
;~ 2) поддержка таблиц MS Word в буфере