Автор: AZJIO
Дата сообщения: 15.06.2010 08:24
Обновил скрипт [more=list_var_funk.au3]
Код: ; @AZJIO 25.10.2010 - 11.04.2011
; En
$LngTitle='Variables and Functions'
$LngFO1='Select File.'
$LngFO2='Script'
$LngMs1='Message'
$LngMs2='No variables.'&@CRLF&'Continue?'
$LngLVr='Variables'
$LngLFu='Functions'
$LngLPc='pieces'
$LngCb1='> clipboard'
$LngCbH1='Copy the list of variables'&@CRLF&'to the clipboard'
$LngCb2='clipboard >'
$LngCbH2='Import from the clipboard'&@CRLF&'and show a list of variables'
$LngLcH='List as a local'&@CRLF&'variable declaration'
$LngCbHF='Copy the list of functions'&@CRLF&'to the clipboard'
$LngInc='See all the functions'&@CRLF&'in the directory "Include"'
$LngLt1='Done in'
$LngLt2='sec'
$LngUse='Use'
$LngRep='Counting the number '&@CRLF&'of repetitions of variables'
$LngOpi='Open the file folder "Include"'
$helpmsg='Hotkeys'&@CRLF&@CRLF& _
'Ctrl + Left Arrow - a list of variables to copy to clipboard'&@CRLF& _
'Ctrl + Right Arrow - a list of functions to copy to clipboard'&@CRLF& _
'Ctrl + Down Arrow - imported from Clipboard'&@CRLF& _
'Ctrl + Up Arrow - a list of variables to copy to the clipboard as a local variable declaration'&@CRLF&@CRLF& _
'Can throw the script out the window or directory scripts. In the latter case, the output only functions. Also specify the path to the script at the command prompt, which is convenient when working in a text editor.'&@CRLF&@CRLF& _
'The script is designed to show the variables and functions in the scripts, to avoid duplication, to be able to fearlessly copy of the code of one script to another. Allows you to keep track of variable names to avoid duplication when you want to rename a variable, eg $Path and $PathName. When replacing the $Path will damage $PathName, so you need to temporarily rename $PathName, then rename $Path, and then restore the $PathName. Variables and functions are displayed in one instance and sorted. The window supports drag-and-drop, and resize. The time counter shows the reading of the script or scripts directory.'
$Lang_dll = DllOpen("kernel32.dll")
$UserIntLang=DllCall ( $Lang_dll, "int", "GetUserDefaultUILanguage" )
If Not @error Then $UserIntLang=Hex($UserIntLang[0],4)
DllClose($Lang_dll)
; Ru
; если русская локализация, то русский язык
If $UserIntLang = 0419 Then
$LngTitle='Переменные и функции'
$LngFO1='Выбор файла.'
$LngFO2='Скрипт'
$LngMs1='Сообщение'
$LngMs2='Нет переменных.'&@CRLF&'Продолжить?'
$LngLVr='Переменные'
$LngLFu='Функции'
$LngLPc='шт'
$LngCb1='в буфер'
$LngCbH1='Скопировать список переменных '&@CRLF&'в буфер обмена'
$LngCb2='из буфера'
$LngCbH2='Прочитать код из буфера'&@CRLF&'и показать список переменных'
$LngLcH='Список в виде локального'&@CRLF&'объявления переменных'
$LngCbHF='Скопировать список функций '&@CRLF&'в буфер обмена'
$LngInc='Показать все функции'&@CRLF&'каталога Include'
$LngLt1='Выполнено за'
$LngLt2='сек'
$LngUse='Используйте'
$LngRep='Подсчитывать количество'&@CRLF&'повторов переменных'
$LngOpi='Открыть файл папки Include'
$helpmsg='Горячие клавиши'&@CRLF&@CRLF& _
'Ctrl+стрелка влево - список переменных скопировать в буфер обмена'&@CRLF& _
'Ctrl+стрелка вправо - список функций скопировать в буфер обмена'&@CRLF& _
'Ctrl+стрелка вниз - обработать буфер обмена'&@CRLF& _
'Ctrl+стрелка вверх - список переменных скопировать в буфер обмена в виде локального объявления переменных'&@CRLF&@CRLF& _
'Можете кинуть скрипт в окно или каталог скриптов. В последнем случае вывод только функций. Также указать путь к скрипту в ком-строке, что удобно при работе в текстовом редакторе имеющего вызов других утилит.'&@CRLF&@CRLF& _
'Скрипт предназначен для просмотра переменных и функций в скриптах на предмет пересечения, для возможности безбоязненно копировать часть кода одного скрипта в другой. Также позволяет визуально отследить что при выполнении замены имени переменной не произойдёт порча близкой по имени переменной, например $Path и $PathName. При замене $Path испортится $PathName, поэтому можно временно переименовать сначала $PathName, а потом $Path и далее восстановить $PathName. Переменные и функции читаются из скрипта в одном экзэмпляре и сортируются. Окно поддерживает drag-and-drop, и изменение размера окна. Счётчик времени показывает время считывания скрипта или каталога скриптов.'
EndIf
#Include<Array.au3>
Opt("GUIResizeMode", 0x0322)
$bufer_read33 = 0 ; если 1 то читаем из буфера, если 0 то диалог выбора файла
Global $k, $kf, $text01, $text02, $text0, $text, $Info_Edit1, $Info_Edit2, $Time, $timer, $FileName='', $FilePath
If $CmdLine[0]=0 Then
If $bufer_read33 = 1 Then
$text = ClipGet()
Else
$Path = FileOpenDialog($LngFO1, @WorkingDir & "", $LngFO2&" (*.au3)", 1 + 4)
If @error Then Exit
$FileName=StringRegExpReplace($Path, '(^.*)\\(.*)$', '\2')
$file = FileOpen($Path, 0)
$text = FileRead($file)
FileClose($file)
$FilePath=$Path
EndIf
Else
If FileExists($CmdLine[1]) Then
$file = FileOpen($CmdLine[1], 0)
$text = FileRead($file)
FileClose($file)
$FileName=StringRegExpReplace($CmdLine[1], '(^.*)\\(.*)$', '\2')
$FilePath=$CmdLine[1]
EndIf
EndIf
Global $TrChe = 0
_ReadAU3($text)
If $k = 0 And MsgBox(4, $LngMs1, $LngMs2)=7 Then Exit
If $k < 25 Then
$pos = $k
If $k = 0 Then $pos=5
Else
$pos = 25
EndIf
$Gui = GUICreate($LngTitle, 410, $pos * 17 + 140, -1, -1, 0x00040000+0x00020000+0x00010000, 0x00000010)
$CatchDrop = GUICtrlCreateLabel("", 0, 0, 410, $pos * 17 + 120)
GUICtrlSetState(-1, 128 + 8)
GUICtrlSetResizing(-1, 1)
$per=GUICtrlCreateLabel($LngLVr&' - '&$k&' '&$LngLPc, 8, 3, 190, 17)
GUICtrlSetResizing(-1, 1+2+32+512)
$fun=GUICtrlCreateLabel($LngLFu&' - '&$kf&' '&$LngLPc, 208, 3, 190, 17)
GUICtrlSetResizing(-1, 1+4+32+512)
$Info_Edit1 = GUICtrlCreateEdit($text01, 8, 22, 190, $pos * 17 + 40)
GUICtrlSetResizing(-1, 1+2+32+64)
$Info_Edit2 = GUICtrlCreateEdit($text02, 208, 22, 190, $pos * 17 + 40)
GUICtrlSetResizing(-1, 1+4+32+64)
$byf1 = GUICtrlCreateButton($LngCb1, 8, $pos * 17 + 67, 61, 22)
GUICtrlSetResizing(-1, 1+2+64+256+512)
GUICtrlSetTip(-1, $LngCbH1)
$Openbyf = GUICtrlCreateButton($LngCb2, 72, $pos * 17 + 67, 61, 22)
GUICtrlSetResizing(-1, 1+2+64+256+512)
GUICtrlSetTip(-1, $LngCbH2)
$Locbyf = GUICtrlCreateButton('Local', 136, $pos * 17 + 67, 61, 22)
GUICtrlSetResizing(-1, 1+2+64+256+512)
GUICtrlSetTip(-1, $LngLcH)
$byf2 = GUICtrlCreateButton($LngCb1, 208, $pos * 17 + 67, 61, 22)
GUICtrlSetResizing(-1, 1+4+64+256+512)
GUICtrlSetTip(-1, $LngCbHF)
$Include = GUICtrlCreateButton('Include', 272, $pos * 17 + 67, 61, 22)
GUICtrlSetResizing(-1, 1+4+64+256+512)
GUICtrlSetTip(-1, $LngInc)
$help = GUICtrlCreateButton('?', 336, $pos * 17 + 67, 61, 22)
GUICtrlSetResizing(-1, 1+4+64+256+512)
$Time = GUICtrlCreateLabel($LngLt1&' '&Round($timer/1000, 1)&' '&$LngLt2, 8, $pos * 17 + 93, 160, 17)
GUICtrlSetResizing(-1, 1+64+512)
GUICtrlCreateLabel($LngUse&' drag-and-drop', 178, $pos * 17 + 93, 160, 17)
GUICtrlSetResizing(-1, 1+64+512)
If $FileName<>'' Then WinSetTitle($Gui, '', $FileName&' - '&$LngTitle)
$Che = GUICtrlCreateCheckbox('N', 340, $pos * 17 + 67+24, 25, 17)
GUICtrlSetResizing(-1, 1+4+64+256+512)
GUICtrlSetTip(-1, $LngRep)
$OpInc= GUICtrlCreateButton('Open', 369, $pos * 17 + 67+24, 36, 18)
GUICtrlSetResizing(-1, 1+4+64+256+512)
GUICtrlSetTip(-1, $LngOpi)
Dim $AccelKeys[4][2]=[["^{LEFT}", $byf1], ["^{RIGHT}", $byf2], ["^{DOWN}", $Openbyf], ["^{UP}", $Locbyf]]
GUISetAccelerators($AccelKeys)
GUISetState()
GUIRegisterMsg(0x0024, "WM_GETMINMAXINFO")
Send('^{HOME}')
While 1
$msg = GUIGetMsg()
Select
Case $msg = $OpInc
$curretPath = RegRead("HKLM\SOFTWARE\AutoIt v3\AutoIt","InstallDir")&'\Include'
If @error Or Not FileExists($curretPath) Then $curretPath=@WorkingDir
$OpenFile = FileOpenDialog('Open', $curretPath, 'Script (*.au3)', 1, '', $Gui)
If @error Then ContinueLoop
$FilePath=$OpenFile
_OpenFile($FilePath)
Case $msg = $help
_MsgFile()
Case $msg = $Include
$curretPath = RegRead("HKLM\SOFTWARE\AutoIt v3\AutoIt","InstallDir")&'\Include'
If @error Or Not FileExists($curretPath) Then ContinueLoop
_Include($curretPath)
Case $msg = $Locbyf
ClipPut('Local '&StringRegExpReplace(GUICtrlRead($Info_Edit1), @CRLF&'\$', ', $'))
Case $msg = $Openbyf
$text=ClipGet()
_ReadAU3($text)
GUICtrlSetData($per, $LngLVr&' - '&$k&' '&$LngLPc)
GUICtrlSetData($fun, $LngLFu&' - '&$kf&' '&$LngLPc)
WinSetTitle($Gui, '', $LngCb2&' - '&$LngTitle)
Case $msg = $byf1
ClipPut(GUICtrlRead($Info_Edit1))
Case $msg = $byf2
ClipPut(GUICtrlRead($Info_Edit2))
Case $msg = $Che
If GUICtrlRead($Che)=1 Then
$TrChe = 1
Else
$TrChe = 0
EndIf
If FileExists($FilePath) Then
_OpenFile($FilePath)
EndIf
Case $msg = -13
$FilePath=@GUI_DragFile
_OpenFile(@GUI_DragFile)
Case $msg = -3
Exit
EndSelect
WEnd
Func _OpenFile($OpenPath)
If StringInStr(FileGetAttrib($OpenPath), "D") Then
_Include($OpenPath)
ElseIf StringRight($OpenPath, 4)='.au3' Then
$file = FileOpen($OpenPath, 0)
$text = FileRead($file)
FileClose($file)
_ReadAU3($text)
GUICtrlSetData($per, $LngLVr&' - '&$k&' '&$LngLPc)
GUICtrlSetData($fun, $LngLFu&' - '&$kf&' '&$LngLPc)
WinSetTitle($Gui, '', StringRegExpReplace($OpenPath, '(^.*)\\(.*)$', '\2')&' - '&$LngTitle)
EndIf
EndFunc
Func _Include($curretPath)
$search = _FileFindFirstFile($curretPath & "\*.au3",1)
If $search <> -1 Then
$textAll=''
$timer = TimerInit()
$kf2=0
While 1
$file_open = _FileFindNextFile($search)
If @error Then ExitLoop
$file = FileOpen($curretPath&'\'&$file_open, 0)
$text = FileRead($file)
FileClose($file)
$aText2 = StringRegExp($text, '(?:\sFunc)\s+(\w*)', 3)
If Not @error Then
$kf2+=UBound($aText2)
$textAll &= @CRLF& @CRLF& @CRLF&'+++++ '&$file_open&' +++++'& @CRLF & @CRLF
GUICtrlSetData($Time, $file_open)
For $i In $aText2
$textAll &= $i & @CRLF
Next
Else
$textAll &= @CRLF&'- - - - '&$file_open&' - - - -'
EndIf
WEnd
_FileFindClose($search)
WinSetTitle($Gui, '', StringRegExpReplace($curretPath, '(^.*)\\(.*)$', '\2')&' - '&$LngTitle)
GUICtrlSetData($Info_Edit2, $textAll)
GUICtrlSetData($Info_Edit1, '')
GUICtrlSetData($per, $LngLVr)
GUICtrlSetData($fun, $LngLFu&' - '&$kf&' '&$LngLPc)
$timer=TimerDiff($timer)
GUICtrlSetData($Time, $LngLt1&' '&Round($timer/1000, 2)&' '&$LngLt2)
EndIf
EndFunc
Func _ReadAU3($text)
$timer = TimerInit() ; засекаем время
; начинаем поиск переменных
$aT1 = StringRegExp($text & @CRLF, '(?<=\$)\w+', 3) ; детектируем переменные в массив
If Not @error Then
$k=0
For $i = 0 To UBound($aT1) -1
Assign($aT1[$i]&'_3j5d2f8k_', Eval($aT1[$i]&'_3j5d2f8k_')+1, 1)
If Eval($aT1[$i]&'_3j5d2f8k_') = 1 Then
; $aT1[$k]= "$" &$aT1[$i]
$aT1[$k]=$aT1[$i]
$k+=1
EndIf
Next
ReDim $aT1[$k]
_ArraySort($aT1) ; сортировка массива
Dim $aT134[$k]
If $TrChe=1 Then
For $i = 0 To UBound($aT1) -1
$aT1[$i]= "$" &$aT1[$i]&' - '&Eval($aT1[$i]&'_3j5d2f8k_')
Next
Else
For $i = 0 To UBound($aT1) -1
$aT1[$i]= "$" &$aT1[$i]
Next
EndIf
$text01 = ''
For $i In $aT1 ; объединение массива в многостроковый текст
$text01 &= $i & @CRLF
Next
GUICtrlSetData($Info_Edit1, $text01)
Else
$k=0
EndIf
; начинаем поиск функций
$aText2 = StringRegExp($text, '(?:\sFunc)\s+(\w*)', 3) ; детектируем функции в массив
If Not @error Then
_ArraySort($aText2) ; сортировка массива
$text02 = ''
$kf=UBound($aText2)
For $i In $aText2 ; объединение массива в многостроковый текст
$text02 &= $i & @CRLF
Next
; конец поиск функций
GUICtrlSetData($Info_Edit2, $text02)
Else
$kf=0
EndIf
$timer=TimerDiff($timer)
GUICtrlSetData($Time, $LngLt1&' '&Round($timer/1000, 2)&' '&$LngLt2)
EndFunc
; #INDEX# =======================================================================================================================
; Title .........: FileFind
; AutoIt Version : 3.2.3++
; Language ......: Русский
; Description ...: Поиск файлов, включая подкаталоги, синтаксис и возвращаемое значение совпадают с FileFindFirstFile()
; FileFindNextFile(), в FileFindFirstFile("filename" [,flag]) добавлен необязатенльный параметр flag
; flag=1 - поиск файлов
; flag=2 - поиск каталогов , по умолчанию flag=3
; Author(s) .....: Nikzzzz
; ===============================================================================================================================
Func _FileFindFirstFile($sFile,$iMode=3)
Local $avStack[5]
$avStack[0] = 0
$avStack[1] = StringMid($sFile, StringInStr($sFile, "\", 0, -1) + 1)
$avStack[1] = StringRegExpReplace($avStack[1], "[\\\(\)\{\}\+\$\.]", "\\\0")
$avStack[1] = StringReplace($avStack[1], "*", ".*")
$avStack[1] = StringReplace($avStack[1], "?", ".")
$avStack[2] = $iMode
$avStack[3] = StringLeft($sFile, StringInStr($sFile, "\", 0, -1) - 1)
$avStack[4] = FileFindFirstFile($avStack[3] & "\*.*")
If $avStack[4] = -1 Then
SetError(1)
Return -1
EndIf
Return $avStack
EndFunc ;==>_FileFindFirstFile
Func _FileFindNextFile(ByRef $avStack)
Local $sFindFile
While 1
$sFindFile = FileFindNextFile($avStack[$avStack[0] + 4])
If Not @error Then
If StringInStr(FileGetAttrib($avStack[$avStack[0] + 3] & "\" & $sFindFile), "D") > 0 Then
$avStack[0] += 2
ReDim $avStack[$avStack[0] + 5]
$avStack[$avStack[0] + 3] = $avStack[$avStack[0]+1] & "\" & $sFindFile
$avStack[$avStack[0] + 4] = FileFindFirstFile($avStack[$avStack[0] + 3] & "\*.*")
If BitAND($avStack[2],2) Then Return StringMid($avStack[$avStack[0] + 3], StringLen($avStack[3]) + 2)
ContinueLoop
Else
If StringRegExpReplace($sFindFile, $avStack[1], "") = "" Then
SetError(0)
If BitAND($avStack[2],1) Then Return StringMid($avStack[$avStack[0] + 3] & "\" & $sFindFile, StringLen($avStack[3]) + 2)
Else
ContinueLoop
EndIf
EndIf
Else
If $avStack[0] = 0 Then
SetError(-1)
Return ""
Else
FileClose($avStack[$avStack[0] + 4])
$avStack[0] -= 2
ReDim $avStack[$avStack[0] + 5]
EndIf
EndIf
WEnd
EndFunc ;==>_FileFindNextFile
Func _FileFindClose(ByRef $avStack)
Local $iRetVaue
While $avStack[0] >= 0
$iRetVaue=FileClose($avStack[$avStack[0] + 4])
$avStack[0] -= 2
WEnd
ReDim $avStack[1]
Return $iRetVaue
EndFunc ;==>_FileFindClose
Func WM_GETMINMAXINFO($hWnd, $iMsg, $wParam, $lParam)
Local $aWorkArea = _WinAPI_GetWorkingArea()
If $hWnd = $GUI Then
Local $tMINMAXINFO = DllStructCreate("int;int;" & _
"int MaxSizeX; int MaxSizeY;" & _
"int MaxPositionX;int MaxPositionY;" & _
"int MinTrackSizeX; int MinTrackSizeY;" & _
"int MaxTrackSizeX; int MaxTrackSizeY", _
$lParam)
DllStructSetData($tMINMAXINFO, "MinTrackSizeX", 410) ; минимальные размеры окна
DllStructSetData($tMINMAXINFO, "MinTrackSizeY", 200)
DllStructSetData($tMINMAXINFO, "MaxPositionX", $aWorkArea[0])
DllStructSetData($tMINMAXINFO, "MaxPositionY", $aWorkArea[1])
DllStructSetData($tMINMAXINFO, "MaxSizeX", 600) ; размеры развёрнутого состояния ( просто удали строку, чтоб игнорировать критерий)
DllStructSetData($tMINMAXINFO, "MaxSizeY", $aWorkArea[3]-$aWorkArea[1])
EndIf
EndFunc
Func _WinAPI_GetWorkingArea()
Local Const $SPI_GETWORKAREA = 48
Local $stRECT = DllStructCreate("long; long; long; long")
Local $SPIRet = DllCall("User32.dll", "int", "SystemParametersInfo", "uint", $SPI_GETWORKAREA, "uint", 0, "ptr", DllStructGetPtr($stRECT), "uint", 0)
If @error Then Return 0
If $SPIRet[0] = 0 Then Return 0
Local $sLeftArea = DllStructGetData($stRECT, 1)
Local $sTopArea = DllStructGetData($stRECT, 2)
Local $sRightArea = DllStructGetData($stRECT, 3)
Local $sBottomArea = DllStructGetData($stRECT, 4)
Local $aRet[4] = [$sLeftArea, $sTopArea, $sRightArea, $sBottomArea]
Return $aRet
EndFunc
Func _MsgFile()
GUISetState(@SW_DISABLE, $Gui)
$Gui1 = GUICreate('Сообщение', 500, 340, -1, -1, -1, 0x00000080,$Gui)
GUICtrlCreateLabel($helpmsg, 15, 10, 480, 330)
GUISetState(@SW_SHOW, $Gui1)
While 1
$msg = GUIGetMsg()
If $msg = -3 Then
$msg = $Gui
GUISetState(@SW_ENABLE, $Gui)
GUIDelete($Gui1)
ExitLoop
EndIf
WEnd
EndFunc