Что нового

[Автоматизация] Нужен инструмент для переименования переменных и функций

AZJIO

Меценат
Меценат
Сообщения
2,761
Репутация
1,152
Версия AutoIt: 3.3.0.0

Описание: Нужен инструмент для переименования переменных и функций.
Эта задача возможно будет интересна для создателей скриптов.
Цель скрипта:
1. Просмотр существующих переменных и функций
2. Переименование с целью улучшения читаемости скрипта или сокращения количества символов в переменной до одного для компакности скрипта.
3. Переименование связанное с обьединением скриптов, проверка, что переменные в скриптах не пересекаются и часть кода можно добавлять из одного скрипта в другой.

Примечания:
С темой получения списка функций ознакомился, а до этого сам попробовал получить список:
Код:
;  @AZJIO
;скрипт предназначен для просмотра переменных и функций в скриптах на предмет пересечения, для возможности безбоязненно копировать часть кода одного скрипта в другой. Также позволяет визуально отследить что при выполнении замены имени переменной не произойдёт порча близкой по имени переменной, например $Path и $PathName. При замене $Path испортится $PathName, поэтому можно временно переименовать сначала $PathName, а потом $Path и далее восстановить $PathName. Переменные читаются из скрипта в одном экзэмпляре. Окно поддерживает drag-and-drop, и изменение размера окна.Счётчик времени показывает время обработки для таких библиотек вункций как WinAPIEx.au3, GDIP.au3.
#Include<Array.au3>
$bufer_read = 0 ; если 1 то читаем из буфера, если 0 то диалог выбора файла
$bufer_write = 1 ; если 1 то результат в буфер, если 0 то сохраняем в файл file_0.au3 в каталоге конвертора
Global $kol, $text01, $text02, $text0, $text, $Info_Edit1, $Info_Edit2, $Time, $timer

If $CmdLine[0]=0 Then
	If $bufer_read = 1 Then
		$text = ClipGet()
	Else
		$Path = FileOpenDialog("Выбор файла.", @WorkingDir & "", "Скрипт (*.au3)", 1 + 4)
		$file = FileOpen($Path, 0)
		$text = FileRead($file)
		FileClose($file)
	EndIf
Else
	If FileExists($CmdLine[1]) Then
		$file = FileOpen($CmdLine[1], 0)
		$text = FileRead($file)
		FileClose($file)
	EndIf
EndIf

_ReadAU3($text)

If $kol = 0 Then
	MsgBox(0, "Сообщение", 'Нет переменных')
	Exit
EndIf
If $kol < 20 Then
	$pos = $kol
Else
	$pos = 20
EndIf


$Main_Gui = GUICreate("Переменные и функции", 390, $pos * 17 + 120, -1, -1, 786432, 0x00000010)
$CatchDrop = GUICtrlCreateLabel("", 0, 0, 390, $pos * 17 + 120)
GUICtrlSetState(-1, 128 + 8)
$Info_Edit1 = GUICtrlCreateEdit($text01, 8, 10, 180, $pos * 17 + 40)
GUICtrlSetResizing(-1, 1)
$Info_Edit2 = GUICtrlCreateEdit($text02, 198, 10, 180, $pos * 17 + 40)
GUICtrlSetResizing(-1, 1)
$Time = GUICtrlCreateLabel('', 8, $pos * 17 + 60, 120, 17)
GUICtrlSetResizing(-1, 1)
GUICtrlSetData($Time, 'Выполнено за '&Round($timer/1000, 1)&' сек')
GUICtrlCreateLabel('Используйте drag-and-drop', 138, $pos * 17 + 60, 190, 17)
GUICtrlSetResizing(-1, 1)

GUISetState()
Send('^{HOME}')

While 1
	Sleep(10)
	$msg = GUIGetMsg()
	Select
		Case $msg = -13
			$file = FileOpen(@GUI_DragFile, 0)
			$text = FileRead($file)
			FileClose($file)
			_ReadAU3($text)
		Case $msg = -3
			Exit
	EndSelect
WEnd
;=====================================

If $bufer_write = 1 Then
	ClipPut($text)
Else
	$filetxt = @ScriptDir & '\file_'
	$i = 0
	While FileExists($filetxt & $i & '.au3')
		$i = $i + 1
	WEnd
	$filetxt = $filetxt & $i & '.au3'

	$file = FileOpen($filetxt, 2)
	FileWrite($file, $text)
	FileClose($file)
EndIf


Func _ReadAU3($text)
	$timer = TimerInit() ; засекаем время
	$text0 = $text
	; начинаем поиск переменных
	$aText1 = StringRegExp($text & @CRLF, '\$\w+', 3) ; детектируем переменные в массив
	_ArraySort($aText1) ; сортировка массива

	$text = ''
	For $i = 0 To UBound($aText1) - 1 ; объединение массива в многостроковый текст
		$text &= $aText1[$i] & @CRLF
	Next

	$textZ = ''
	For $i = 0 To UBound($aText1) - 1
		If StringRegExp($textZ & @CRLF, StringReplace($aText1[$i], "$", "\$") & @CRLF, 0) Then ContinueLoop
		$text = StringRegExpReplace($text, StringReplace($aText1[$i], "$", "\$") & @CRLF, @CRLF)
		; $text = StringRegExpReplace($text, '\'&$aText1[$i] & @CRLF, @CRLF) ; блин, строка медленней
		If @extended > 0 Then $textZ &= @CRLF & $aText1[$i] ; добавляем удалённые переменные в конец списка, такой сбособ исключит повтора переменных в списке $text
	Next
	$text&=$textZ
	$text = StringRegExpReplace($text, '(\n\r){100}', '') ;удаление по 100 пустых строк, иначе при большом количестве, как в WinAPIEx.au3 скрипт вылетает.
	$text = StringRegExpReplace($text, '(\n\r)+', '') ;удаление пустых строк
	$text01 = StringRegExpReplace($text, "\$", "$")
	; конец поиск переменных
	$kol = @extended
	GUICtrlSetData($Info_Edit1, $text01)

	; начинаем поиск функций
	$aText2 = StringRegExp($text0, '(?<=\sFunc)\s+(\w*)', 3) ; детектируем функции в массив
	_ArraySort($aText2) ; сортировка массива

	$text = ''
	For $i = 0 To UBound($aText2) - 1 ; объединение массива в многостроковый текст
		$text &= $aText2[$i] & @CRLF
	Next
	$text = StringRegExpReplace($text, '(\n\r){40}', '')
	$text02 = StringRegExpReplace($text, '(\r\n){2,}', @CRLF) ;удаление пустых строк
	; конец поиск функций
	GUICtrlSetData($Info_Edit2, $text02)
	$timer=TimerDiff($timer)
	GUICtrlSetData($Time, 'Выполнено за '&Round($timer/1000, 1)&' сек')
EndFunc   ;==>_ReadAU3


Немогу найти ссылку на тему с поддержкой редактирования итемов GUICtrlCreateListView, если это всё объединить то скрипт создать возможно.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Этот инструмент уже есть, называется SciTE (полная версия) со всеми его дополнениями.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,761
Репутация
1,152
Ну кто бы выложил тогда полную версию со всеми дополнениями.


OffTopic:
я в шоке... надо было несколько месяцев заниматься автоитом чтоб узнать о специальном дистрибутиве SciTE с дополнениями, и хоть бы кто словом обмолвился, когда на руборде спрашивал о том в каких каталогах должны лежать дополнительные скачанные утилиты, по крохам нагугленные, а тут оказывается полный комплект всего с таким удобным поиском по справке, с прописанными в Tools всеми утилитами и выполняющими свои функции прямо в SciTE. В общем нет слов... напишите на главной странице красными букавами Скачать SciTE4AutoIt3.exe


Хотя промотр переменных и функций с переименованием пока не нашёл.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,761
Репутация
1,152
Yashied
Я это и сам знаю... У меня скрипт содержит 30 переменных, причём с вариантами $reg1, $reg112, $reg12. Если я выполню замену $reg1, то и остальные изменятся, и даже напутаются. Нужно контролировать процесс скурпулёзно. А я утилитой хотел добится именно замены, используя регулярные выражения, при котором будут переименовываться только указанные.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,761
Репутация
1,152
CreatoR
Тогда подскажи, где та тема в которой обсуждалось редактирование итемов GUICtrlCreateListViewItem непосредственно в окне, не мог найти.

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
AZJIO [?]
где та тема в которой обсуждалось редактирование итемов GUICtrlCreateListViewItem непосредственно в окне, не мог найти
Поиск не работает? :laugh:
вот.


Добавлено:
Сообщение автоматически объединено:

AZJIO [?]
всё упирается лишь в свободное время
Не уверен что понимаю, но там довольно просто и быстро осуществить поиск и замену по регулярным выражениям, единственное(?) ограничение, это однострочный поиск.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,761
Репутация
1,152
CreatoR
Не уверен что понимаю, но там довольно просто и быстро осуществить поиск и замену по регулярным выражениям
Поиск сделать не трудно, трудно придумать управление в окне, удобство интерфейса.

Поиск не работает?
я на этом форуме тему видел, не могу найти. Конкретно задан был в теме вопрос типа "Можно ли редактировать имена ListViewItem в самом окне", твой ответ "да можно" и пример редактирования. Я пытаюсь его найти и попробовать использовать в своём скрипте. Нужно именно редактировав итем и по нажатию Enter прочитать старое и новое имя и выполнить поиск-замену в срипте. Любые другие варианты не удобнее чем скопировать переменную и по Ctrl+H выполнить замену.


Твой пример на autoitscript.com вылетает на $WM_NOTIFY в 15 строке. А тот что был на этом форуме работал.

Разобрался...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,669
Репутация
2,463
AZJIO [?]
на этом форуме тему видел, не могу найти
От меня такой темы небыло, а если не от меня, то это классический пример того, насколько может быть полезным название темы ;) - тот кто создал ту тему, явно не заботился об информативности, ну или мой пример небыл связан напрямую с темой.


Добавлено:
Сообщение автоматически объединено:

P.S
Всё что я смог найти от меня, это ответ в тему [Элементы GUI] Создание GUICtrlCreateListView с элементом GUICtrlCreateDate, но там ссылка на архив с примером с оф. форума, я только указал на пример для вытаскивания с него нужного механизма.
 
Верх