Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
- ; #AutoIt3Wrapper_Run_AU3Check=y
- #include <GUIConstantsEx.au3>
- #include <EditConstants.au3>
- #include <WindowsConstants.au3>
- Local $Lng[15]
- $Lng[1] = 'Debugger'
- $Lng[2] = 'Variables'
- $Lng[3] = "Output Window"
- $Lng[4] = "Single line"
- $Lng[5] = "Multiline"
- $Lng[6] = "Multiline code"
- $Lng[7] = "Add variable names"
- $Lng[8] = 'Parsing variables from the Clipboard'
- $Lng[9] = 'The debug line in the Clipboard'
- $Lng[10] = 'Error'
- $Lng[11] = 'There are no variables'
- $Lng[12] = 'At names there are invalid characters: '
- $Lng[13] = 'To close a window automatically'
- $Lng[14] = 'Add @ScriptLineNumber-@error-@extended'
- If @OSLang = 0419 Then
- $Lng[1] = 'Отладчик'
- $Lng[2] = 'Переменные'
- $Lng[3] = "Вывод"
- $Lng[4] = "Однострочный"
- $Lng[5] = "Многострочный"
- $Lng[6] = "Многострочный код"
- $Lng[7] = "Добавить имена переменных"
- $Lng[8] = 'Парсить переменные из буфера обмена'
- $Lng[9] = 'Строка отладки в буфер обмена'
- $Lng[10] = 'Ошибка'
- $Lng[11] = 'Отсутствуют тестируемые переменные'
- $Lng[12] = 'В именах присутствуют недопустимые символы: '
- $Lng[13] = 'Закрывать окно автоматически'
- $Lng[14] = 'Добавить @ScriptLineNumber-@error-@extended'
- EndIf
- Local $ini = @ScriptDir & '\' & StringRegExpReplace(@ScriptName, '^(.*?)(?:\.[^.]+)?$', '\1') & '.ini' ; Name.ini = Name.exe
- If Not FileExists($ini) Then _Create_ini()
- Local $CmdLineRaw0
- If $CmdLine[0] Then ; Учтите что длина строки параметров ограничена и весь файл не удастся обработать. 1989 символов у меня обрабатывает
- For $i = 1 To $CmdLine[0]
- $CmdLineRaw0 &= $CmdLine[$i] & @LF
- Next
- EndIf
- ; Чтение параметров
- Local $iniClose = 1, $iniOutputWindow = 0, $iniMultiline = 1, $iniMultilineCode = 1, $iniAddNames = 1, $iniTitle = 1
- $iniClose = Number(IniRead($ini, 'Set', 'Close', $iniClose))
- $iniOutputWindow = Number(IniRead($ini, 'Set', 'OutputWindow', $iniOutputWindow))
- $iniMultiline = Number(IniRead($ini, 'Set', 'Multiline', $iniMultiline))
- $iniMultilineCode = Number(IniRead($ini, 'Set', 'MultilineCode', $iniMultilineCode))
- $iniAddNames = Number(IniRead($ini, 'Set', 'AddNames', $iniAddNames))
- $iniTitle = Number(IniRead($ini, 'Set', 'TitleEx', $iniTitle))
- Local $hGui, $iBtnDone, $iBtnParse, $iConsoleWrite, $iEdit, $iMsgBox, $iChClose, $iChCRLF_M, $iChCRLF_S, $iChMCode, $iChTitle, $iChVarName
- $hGui = GUICreate($Lng[1], 465, 320)
- If Not @Compiled Then GUISetIcon(@ScriptDir & '\debugger.ico')
- GUICtrlCreateLabel($Lng[2], 5, 3, 170, 17)
- $iEdit = GUICtrlCreateEdit('', 5, 20, 170, 290, $ES_AUTOVSCROLL + $WS_HSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
- GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0) ; снимает ограничение на количество символов 30 000
- GUICtrlCreateGroup($Lng[3], 190, 40, 260, 66) ; элемент Group группирует радиокнопки
- $iMsgBox = GUICtrlCreateRadio("MsgBox", 200, 55, -1, 20)
- $iConsoleWrite = GUICtrlCreateRadio("ConsoleWrite", 200, 75, -1, 20)
- GUICtrlCreateGroup("", -99, -99, 1, 1)
- If $iniOutputWindow Then
- GUICtrlSetState($iConsoleWrite, $GUI_CHECKED)
- Else
- GUICtrlSetState($iMsgBox, $GUI_CHECKED)
- EndIf
- $iChMCode = GUICtrlCreateCheckbox($Lng[6], 260, 165, -1, 20)
- If $iniMultilineCode Then GUICtrlSetState(-1, $GUI_CHECKED)
- GUICtrlCreateGroup($Lng[3], 190, 110, 260, 81) ; элемент Group группирует радиокнопки
- $iChCRLF_S = GUICtrlCreateRadio($Lng[4], 200, 125, -1, 20)
- $iChCRLF_M = GUICtrlCreateRadio($Lng[5], 200, 145, -1, 20)
- GUICtrlCreateGroup("", -99, -99, 1, 1)
- If $iniMultiline Then
- GUICtrlSetState($iChCRLF_M, $GUI_CHECKED)
- Else
- GUICtrlSetState($iChCRLF_S, $GUI_CHECKED)
- GUICtrlSetState($iChMCode, $GUI_DISABLE)
- EndIf
- $iChVarName = GUICtrlCreateCheckbox($Lng[7], 190, 200, -1, 20)
- If $iniAddNames Then GUICtrlSetState(-1, $GUI_CHECKED)
- $iChTitle = GUICtrlCreateCheckbox($Lng[14], 190, 220, -1, 20)
- If $iniTitle Then GUICtrlSetState(-1, $GUI_CHECKED)
- $iChClose = GUICtrlCreateCheckbox($Lng[13], 190, 5, -1, 20)
- If $iniClose Then GUICtrlSetState(-1, $GUI_CHECKED)
- $iBtnParse = GUICtrlCreateButton($Lng[8], 190, 250, 260, 27)
- $iBtnDone = GUICtrlCreateButton($Lng[9], 190, 280, 260, 27)
- If $iniClose Then GUICtrlSetState(-1, $GUI_DEFBUTTON + $GUI_FOCUS)
- GUISetState()
- If $CmdLineRaw0 Then _Parse($CmdLineRaw0, 1)
- While 1
- Switch GUIGetMsg()
- Case $iBtnParse
- _Parse(ClipGet()) ; Парсит код и выводит данные в $iEdit
- Case $iChCRLF_S, $iChCRLF_M
- If BitAND(GUICtrlRead($iChCRLF_M), $GUI_CHECKED) Then
- GUICtrlSetState($iChMCode, $GUI_ENABLE)
- Else
- GUICtrlSetState($iChMCode, $GUI_DISABLE)
- EndIf
- Case $iBtnDone
- _Processing()
- Case -3
- _Exit()
- EndSwitch
- WEnd
- Func _ArrayRemoveDuplicates(Const ByRef $aArray)
- If Not IsArray($aArray) Then Return SetError(1, 0, 0)
- Local $oDict = ObjCreate("Scripting.Dictionary")
- $oDict.CompareMode = 1 ; учитывать регистр букв, бинарное сравнение
- For $i In $aArray
- $oDict.Item($i) ; shown by wraithdu
- Next
- Return $oDict.Keys()
- EndFunc ;==>_ArrayRemoveDuplicates
- Func _Parse($code, $iFirst = 0)
- Local $aVarName, $d, $sVarName
- ; $tmp = StringRegExpReplace(ClipGet(), '\h', '')
- If $iFirst And StringRegExp($code, '^\w+(?:\[[^\v\[\]]+\]{1,3})?$') Then $code = '$' & $code ; Если выделена одна переменная без $
- ; $aVarName = StringRegExp(ClipGet(), '(?<=\$)\w+', 3)
- ; $aVarName = StringRegExp(ClipGet(), '(?<=\$|@)\w+(?:\[[^\v]+\]{1,3})?', 3) ; Извлечь из кода переменные и макросы
- $aVarName = StringRegExp($code, '(?:\$|@)\w+(?:\[[^\v\[\]]+\]{1,3})?', 3) ; Извлечь из кода переменные и макросы
- If Not @error Then
- $d = 0
- For $i = 0 To UBound($aVarName) - 1 ; пробелы в переменных массива между индексами как бы проблема
- ; If $aVarName[$i] = '@CRLF' Then ContinueLoop
- Switch $aVarName[$i]
- Case '@CRLF', '@CR', '@LF', '@TAB' ; Игнор неинформативных переменных
- ContinueLoop
- EndSwitch
- $aVarName[$d] = StringStripWS($aVarName[$i], 8) ; Удаление пробелов чтобы удалить дубликаты качественнее
- $d += 1
- Next
- ReDim $aVarName[$d]
- $aVarName = _ArrayRemoveDuplicates($aVarName) ; Удаляет дубликаты
- For $i = 0 To UBound($aVarName) - 1
- $sVarName &= $aVarName[$i] & @CRLF
- Next
- $sVarName = StringTrimRight($sVarName, 2)
- GUICtrlSetData($iEdit, $sVarName)
- EndIf
- EndFunc ;==>_Parse
- Func _Processing()
- Local $aVarName, $fChVarName, $fErrorCharacter, $sCRLF, $sStringDone, $sTitle, $sVarName, $sVarString, $sEdit0
- $sEdit0 = GUICtrlRead($iEdit) ; Считываем переменные и окна редактирования
- If Not StringRegExp($sEdit0, '\w') Then Return MsgBox(0, $Lng[10], $Lng[11], 0, $hGui)
- ; $sEdit0 = StringReplace($sEdit0, '$', '')
- ; $sEdit0 = StringRegExpReplace($sEdit0, '(?m)(?<=^)\$', '') ; Удаляет $ в начале строк, что позволяет их потом добавить
- $sEdit0 = StringRegExpReplace($sEdit0, '\h', '')
- ; $fErrorCharacter = StringRegExp($sEdit0, '[^\w\r\n\[\]$@]')
- $fErrorCharacter = StringRegExpReplace($sEdit0, '[\w\r\n\[\]$@]', '')
- If $fErrorCharacter Then Return MsgBox(0, $Lng[10], $Lng[12] & $fErrorCharacter, 0, $hGui)
- $sEdit0 = StringRegExpReplace($sEdit0, '(?m)^(?![@$])', '$')
- $aVarName = StringSplit($sEdit0, @CRLF, 1) ; Преобразуем в массив
- $aVarName = _ArrayRemoveDuplicates($aVarName) ; Удаляет дубликаты
- If BitAND(GUICtrlRead($iChVarName), $GUI_CHECKED) Then
- $fChVarName = True
- Else
- $fChVarName = False
- EndIf
- If BitAND(GUICtrlRead($iChCRLF_M), $GUI_CHECKED) Then
- If BitAND(GUICtrlRead($iChMCode), $GUI_CHECKED) Then
- $sCRLF = " & @CRLF & _" & @CRLF & @TAB & @TAB
- Else
- $sCRLF = " & @CRLF & "
- EndIf
- Else
- $sCRLF = " & ', ' & "
- EndIf
- For $i = 1 To $aVarName[0]
- If $fChVarName Then $sVarName = "'" & $aVarName[$i] & " = ' & "
- ; $sVarString &= $sVarName & '$' & $aVarName[$i] & $sCRLF
- $sVarString &= $sVarName & $aVarName[$i] & $sCRLF
- Next
- $sVarString = StringTrimRight($sVarString, StringLen($sCRLF))
- $sVarString = StringReplace($sVarString, " & ', ' & '", " & ', ") ; Если однострочный и добавляет имена переменных
- ; $sTitle = StringReplace($iniTitle, '$Title', "'" & $Lng[1] & "'")
- If BitAND(GUICtrlRead($iChTitle), $GUI_CHECKED) Then
- $sTitle = "'" & $Lng[1] & " - ' & @ScriptLineNumber & '-' & @error & '-' & @extended"
- Else
- $sTitle = "'" & $Lng[1] & "'"
- EndIf
- If BitAND(GUICtrlRead($iMsgBox), $GUI_CHECKED) Then
- $sStringDone = @CRLF & "MsgBox(0, " & $sTitle & ", " & $sVarString & ")"
- Else
- $sStringDone = @CRLF & "ConsoleWrite(" & $sTitle & " & @CRLF & " & $sVarString & " & @CRLF)"
- EndIf
- ClipPut($sStringDone)
- If BitAND(GUICtrlRead($iChClose), $GUI_CHECKED) Then _Exit()
- EndFunc ;==>_Processing
- Func _Create_ini()
- Local $hFile = FileOpen($ini, 2)
- If $hFile = -1 Then Return
- FileWrite($hFile, '[Set]' & @CRLF & _
- 'Close=1' & @CRLF & _
- 'OutputWindow=0' & @CRLF & _
- 'Multiline=1' & @CRLF & _
- 'MultilineCode=1' & @CRLF & _
- 'AddNames=1' & @CRLF & _
- 'TitleEx=1')
- FileClose($hFile)
- EndFunc ;==>_Create_ini
- Func _Exit()
- Local $tmp
- $tmp = _ToBoolean($iChClose)
- If $tmp <> $iniClose Then IniWrite($ini, 'Set', 'Close', $tmp)
- $tmp = _ToBoolean($iChCRLF_M)
- If $tmp <> $iniMultiline Then IniWrite($ini, 'Set', 'Multiline', $tmp)
- $tmp = _ToBoolean($iConsoleWrite)
- If $tmp <> $iniOutputWindow Then IniWrite($ini, 'Set', 'OutputWindow', $tmp)
- $tmp = _ToBoolean($iChMCode)
- If $tmp <> $iniMultilineCode Then IniWrite($ini, 'Set', 'MultilineCode', $tmp)
- $tmp = _ToBoolean($iChVarName)
- If $tmp <> $iniAddNames Then IniWrite($ini, 'Set', 'AddNames', $tmp)
- $tmp = _ToBoolean($iChTitle)
- If $tmp <> $iniTitle Then IniWrite($ini, 'Set', 'TitleEx', $tmp)
- Exit
- EndFunc ;==>_Exit
- Func _ToBoolean($iID)
- If BitAND(GUICtrlRead($iID), $GUI_CHECKED) Then
- Return 1
- Else
- Return 0
- EndIf
- EndFunc ;==>_ToBoolean
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement