Advertisement
AZJIO

Adds debug line

Dec 23rd, 2013
780
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
AutoIt 10.49 KB | None | 0 0
  1. ; #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w- 4 -w 5 -w 6 -w- 7
  2. ; #AutoIt3Wrapper_Run_AU3Check=y
  3.  
  4. #include <GUIConstantsEx.au3>
  5. #include <EditConstants.au3>
  6. #include <WindowsConstants.au3>
  7.  
  8. Local $Lng[15]
  9. $Lng[1] = 'Debugger'
  10. $Lng[2] = 'Variables'
  11. $Lng[3] = "Output Window"
  12. $Lng[4] = "Single line"
  13. $Lng[5] = "Multiline"
  14. $Lng[6] = "Multiline code"
  15. $Lng[7] = "Add variable names"
  16. $Lng[8] = 'Parsing variables from the Clipboard'
  17. $Lng[9] = 'The debug line in the Clipboard'
  18. $Lng[10] = 'Error'
  19. $Lng[11] = 'There are no variables'
  20. $Lng[12] = 'At names there are invalid characters: '
  21. $Lng[13] = 'To close a window automatically'
  22. $Lng[14] = 'Add @ScriptLineNumber-@error-@extended'
  23.  
  24. If @OSLang = 0419 Then
  25.     $Lng[1] = 'Отладчик'
  26.     $Lng[2] = 'Переменные'
  27.     $Lng[3] = "Вывод"
  28.     $Lng[4] = "Однострочный"
  29.     $Lng[5] = "Многострочный"
  30.     $Lng[6] = "Многострочный код"
  31.     $Lng[7] = "Добавить имена переменных"
  32.     $Lng[8] = 'Парсить переменные из буфера обмена'
  33.     $Lng[9] = 'Строка отладки в буфер обмена'
  34.     $Lng[10] = 'Ошибка'
  35.     $Lng[11] = 'Отсутствуют тестируемые переменные'
  36.     $Lng[12] = 'В именах присутствуют недопустимые символы: '
  37.     $Lng[13] = 'Закрывать окно автоматически'
  38.     $Lng[14] = 'Добавить @ScriptLineNumber-@error-@extended'
  39. EndIf
  40.  
  41. Local $ini = @ScriptDir & '\' & StringRegExpReplace(@ScriptName, '^(.*?)(?:\.[^.]+)?$', '\1') & '.ini' ; Name.ini = Name.exe
  42. If Not FileExists($ini) Then _Create_ini()
  43.  
  44. Local $CmdLineRaw0
  45. If $CmdLine[0] Then ; Учтите что длина строки параметров ограничена и весь файл не удастся обработать. 1989 символов у меня обрабатывает
  46.     For $i = 1 To $CmdLine[0]
  47.         $CmdLineRaw0 &= $CmdLine[$i] & @LF
  48.     Next
  49. EndIf
  50.  
  51. ; Чтение параметров
  52. Local $iniClose = 1, $iniOutputWindow = 0, $iniMultiline = 1, $iniMultilineCode = 1, $iniAddNames = 1, $iniTitle = 1
  53. $iniClose = Number(IniRead($ini, 'Set', 'Close', $iniClose))
  54. $iniOutputWindow = Number(IniRead($ini, 'Set', 'OutputWindow', $iniOutputWindow))
  55. $iniMultiline = Number(IniRead($ini, 'Set', 'Multiline', $iniMultiline))
  56. $iniMultilineCode = Number(IniRead($ini, 'Set', 'MultilineCode', $iniMultilineCode))
  57. $iniAddNames = Number(IniRead($ini, 'Set', 'AddNames', $iniAddNames))
  58. $iniTitle = Number(IniRead($ini, 'Set', 'TitleEx', $iniTitle))
  59.  
  60. Local $hGui, $iBtnDone, $iBtnParse, $iConsoleWrite, $iEdit, $iMsgBox, $iChClose, $iChCRLF_M, $iChCRLF_S, $iChMCode, $iChTitle, $iChVarName
  61.  
  62. $hGui = GUICreate($Lng[1], 465, 320)
  63. If Not @Compiled Then GUISetIcon(@ScriptDir & '\debugger.ico')
  64.  
  65. GUICtrlCreateLabel($Lng[2], 5, 3, 170, 17)
  66. $iEdit = GUICtrlCreateEdit('', 5, 20, 170, 290, $ES_AUTOVSCROLL + $WS_HSCROLL + $WS_VSCROLL + $ES_NOHIDESEL + $ES_WANTRETURN)
  67. GUICtrlSendMsg(-1, $EM_LIMITTEXT, -1, 0) ; снимает ограничение на количество символов 30 000
  68.  
  69. GUICtrlCreateGroup($Lng[3], 190, 40, 260, 66) ; элемент Group группирует радиокнопки
  70. $iMsgBox = GUICtrlCreateRadio("MsgBox", 200, 55, -1, 20)
  71. $iConsoleWrite = GUICtrlCreateRadio("ConsoleWrite", 200, 75, -1, 20)
  72. GUICtrlCreateGroup("", -99, -99, 1, 1)
  73. If $iniOutputWindow Then
  74.     GUICtrlSetState($iConsoleWrite, $GUI_CHECKED)
  75. Else
  76.     GUICtrlSetState($iMsgBox, $GUI_CHECKED)
  77. EndIf
  78.  
  79. $iChMCode = GUICtrlCreateCheckbox($Lng[6], 260, 165, -1, 20)
  80. If $iniMultilineCode Then GUICtrlSetState(-1, $GUI_CHECKED)
  81.  
  82. GUICtrlCreateGroup($Lng[3], 190, 110, 260, 81) ; элемент Group группирует радиокнопки
  83. $iChCRLF_S = GUICtrlCreateRadio($Lng[4], 200, 125, -1, 20)
  84. $iChCRLF_M = GUICtrlCreateRadio($Lng[5], 200, 145, -1, 20)
  85. GUICtrlCreateGroup("", -99, -99, 1, 1)
  86. If $iniMultiline Then
  87.     GUICtrlSetState($iChCRLF_M, $GUI_CHECKED)
  88. Else
  89.     GUICtrlSetState($iChCRLF_S, $GUI_CHECKED)
  90.     GUICtrlSetState($iChMCode, $GUI_DISABLE)
  91. EndIf
  92.  
  93. $iChVarName = GUICtrlCreateCheckbox($Lng[7], 190, 200, -1, 20)
  94. If $iniAddNames Then GUICtrlSetState(-1, $GUI_CHECKED)
  95.  
  96. $iChTitle = GUICtrlCreateCheckbox($Lng[14], 190, 220, -1, 20)
  97. If $iniTitle Then GUICtrlSetState(-1, $GUI_CHECKED)
  98.  
  99. $iChClose = GUICtrlCreateCheckbox($Lng[13], 190, 5, -1, 20)
  100. If $iniClose Then GUICtrlSetState(-1, $GUI_CHECKED)
  101.  
  102. $iBtnParse = GUICtrlCreateButton($Lng[8], 190, 250, 260, 27)
  103. $iBtnDone = GUICtrlCreateButton($Lng[9], 190, 280, 260, 27)
  104. If $iniClose Then GUICtrlSetState(-1, $GUI_DEFBUTTON + $GUI_FOCUS)
  105.  
  106. GUISetState()
  107. If $CmdLineRaw0 Then _Parse($CmdLineRaw0, 1)
  108. While 1
  109.     Switch GUIGetMsg()
  110.         Case $iBtnParse
  111.             _Parse(ClipGet()) ; Парсит код и выводит данные в $iEdit
  112.         Case $iChCRLF_S, $iChCRLF_M
  113.             If BitAND(GUICtrlRead($iChCRLF_M), $GUI_CHECKED) Then
  114.                 GUICtrlSetState($iChMCode, $GUI_ENABLE)
  115.             Else
  116.                 GUICtrlSetState($iChMCode, $GUI_DISABLE)
  117.             EndIf
  118.         Case $iBtnDone
  119.             _Processing()
  120.         Case -3
  121.             _Exit()
  122.     EndSwitch
  123. WEnd
  124.  
  125. Func _ArrayRemoveDuplicates(Const ByRef $aArray)
  126.     If Not IsArray($aArray) Then Return SetError(1, 0, 0)
  127.     Local $oDict = ObjCreate("Scripting.Dictionary")
  128.     $oDict.CompareMode = 1 ; учитывать регистр букв, бинарное сравнение
  129.     For $i In $aArray
  130.         $oDict.Item($i) ; shown by wraithdu
  131.     Next
  132.     Return $oDict.Keys()
  133. EndFunc   ;==>_ArrayRemoveDuplicates
  134.  
  135. Func _Parse($code, $iFirst = 0)
  136.     Local $aVarName, $d, $sVarName
  137.     ; $tmp = StringRegExpReplace(ClipGet(), '\h', '')
  138.     If $iFirst And StringRegExp($code, '^\w+(?:\[[^\v\[\]]+\]{1,3})?$') Then $code = '$' & $code ; Если выделена одна переменная без $
  139.     ; $aVarName = StringRegExp(ClipGet(), '(?<=\$)\w+', 3)
  140.     ; $aVarName = StringRegExp(ClipGet(), '(?<=\$|@)\w+(?:\[[^\v]+\]{1,3})?', 3) ; Извлечь из кода переменные и макросы
  141.     $aVarName = StringRegExp($code, '(?:\$|@)\w+(?:\[[^\v\[\]]+\]{1,3})?', 3) ; Извлечь из кода переменные и макросы
  142.     If Not @error Then
  143.         $d = 0
  144.         For $i = 0 To UBound($aVarName) - 1 ; пробелы в переменных массива между индексами как бы проблема
  145.             ; If $aVarName[$i] = '@CRLF' Then ContinueLoop
  146.             Switch $aVarName[$i]
  147.                 Case '@CRLF', '@CR', '@LF', '@TAB' ; Игнор неинформативных переменных
  148.                     ContinueLoop
  149.             EndSwitch
  150.             $aVarName[$d] = StringStripWS($aVarName[$i], 8) ; Удаление пробелов чтобы удалить дубликаты качественнее
  151.             $d += 1
  152.         Next
  153.         ReDim $aVarName[$d]
  154.         $aVarName = _ArrayRemoveDuplicates($aVarName) ; Удаляет дубликаты
  155.         For $i = 0 To UBound($aVarName) - 1
  156.             $sVarName &= $aVarName[$i] & @CRLF
  157.         Next
  158.         $sVarName = StringTrimRight($sVarName, 2)
  159.         GUICtrlSetData($iEdit, $sVarName)
  160.     EndIf
  161. EndFunc   ;==>_Parse
  162.  
  163. Func _Processing()
  164.     Local $aVarName, $fChVarName, $fErrorCharacter, $sCRLF, $sStringDone, $sTitle, $sVarName, $sVarString, $sEdit0
  165.     $sEdit0 = GUICtrlRead($iEdit) ; Считываем переменные и окна редактирования
  166.     If Not StringRegExp($sEdit0, '\w') Then Return MsgBox(0, $Lng[10], $Lng[11], 0, $hGui)
  167.     ; $sEdit0 = StringReplace($sEdit0, '$', '')
  168.     ; $sEdit0 = StringRegExpReplace($sEdit0, '(?m)(?<=^)\$', '') ; Удаляет $ в начале строк, что позволяет их потом добавить
  169.     $sEdit0 = StringRegExpReplace($sEdit0, '\h', '')
  170.     ; $fErrorCharacter = StringRegExp($sEdit0, '[^\w\r\n\[\]$@]')
  171.     $fErrorCharacter = StringRegExpReplace($sEdit0, '[\w\r\n\[\]$@]', '')
  172.     If $fErrorCharacter Then Return MsgBox(0, $Lng[10], $Lng[12] & $fErrorCharacter, 0, $hGui)
  173.     $sEdit0 = StringRegExpReplace($sEdit0, '(?m)^(?![@$])', '$')
  174.     $aVarName = StringSplit($sEdit0, @CRLF, 1) ; Преобразуем в массив
  175.     $aVarName = _ArrayRemoveDuplicates($aVarName) ; Удаляет дубликаты
  176.     If BitAND(GUICtrlRead($iChVarName), $GUI_CHECKED) Then
  177.         $fChVarName = True
  178.     Else
  179.         $fChVarName = False
  180.     EndIf
  181.     If BitAND(GUICtrlRead($iChCRLF_M), $GUI_CHECKED) Then
  182.         If BitAND(GUICtrlRead($iChMCode), $GUI_CHECKED) Then
  183.             $sCRLF = " & @CRLF & _" & @CRLF & @TAB & @TAB
  184.         Else
  185.             $sCRLF = " & @CRLF & "
  186.         EndIf
  187.     Else
  188.         $sCRLF = " & ', ' & "
  189.     EndIf
  190.     For $i = 1 To $aVarName[0]
  191.         If $fChVarName Then $sVarName = "'" & $aVarName[$i] & " = ' & "
  192.         ; $sVarString &= $sVarName & '$' & $aVarName[$i] & $sCRLF
  193.         $sVarString &= $sVarName & $aVarName[$i] & $sCRLF
  194.     Next
  195.     $sVarString = StringTrimRight($sVarString, StringLen($sCRLF))
  196.     $sVarString = StringReplace($sVarString, " & ', ' & '", " & ', ") ; Если однострочный и добавляет имена переменных
  197.     ; $sTitle = StringReplace($iniTitle, '$Title', "'" & $Lng[1] & "'")
  198.     If BitAND(GUICtrlRead($iChTitle), $GUI_CHECKED) Then
  199.         $sTitle = "'" & $Lng[1] & " - ' & @ScriptLineNumber  & '-' & @error & '-' & @extended"
  200.     Else
  201.         $sTitle = "'" & $Lng[1] & "'"
  202.     EndIf
  203.     If BitAND(GUICtrlRead($iMsgBox), $GUI_CHECKED) Then
  204.         $sStringDone = @CRLF & "MsgBox(0, " & $sTitle & ", " & $sVarString & ")"
  205.     Else
  206.         $sStringDone = @CRLF & "ConsoleWrite(" & $sTitle & " & @CRLF & " & $sVarString & " & @CRLF)"
  207.     EndIf
  208.     ClipPut($sStringDone)
  209.     If BitAND(GUICtrlRead($iChClose), $GUI_CHECKED) Then _Exit()
  210. EndFunc   ;==>_Processing
  211.  
  212. Func _Create_ini()
  213.     Local $hFile = FileOpen($ini, 2)
  214.     If $hFile = -1 Then Return
  215.     FileWrite($hFile, '[Set]' & @CRLF & _
  216.             'Close=1' & @CRLF & _
  217.             'OutputWindow=0' & @CRLF & _
  218.             'Multiline=1' & @CRLF & _
  219.             'MultilineCode=1' & @CRLF & _
  220.             'AddNames=1' & @CRLF & _
  221.             'TitleEx=1')
  222.     FileClose($hFile)
  223. EndFunc   ;==>_Create_ini
  224.  
  225. Func _Exit()
  226.     Local $tmp
  227.     $tmp = _ToBoolean($iChClose)
  228.     If $tmp <> $iniClose Then IniWrite($ini, 'Set', 'Close', $tmp)
  229.     $tmp = _ToBoolean($iChCRLF_M)
  230.     If $tmp <> $iniMultiline Then IniWrite($ini, 'Set', 'Multiline', $tmp)
  231.     $tmp = _ToBoolean($iConsoleWrite)
  232.     If $tmp <> $iniOutputWindow Then IniWrite($ini, 'Set', 'OutputWindow', $tmp)
  233.     $tmp = _ToBoolean($iChMCode)
  234.     If $tmp <> $iniMultilineCode Then IniWrite($ini, 'Set', 'MultilineCode', $tmp)
  235.     $tmp = _ToBoolean($iChVarName)
  236.     If $tmp <> $iniAddNames Then IniWrite($ini, 'Set', 'AddNames', $tmp)
  237.     $tmp = _ToBoolean($iChTitle)
  238.     If $tmp <> $iniTitle Then IniWrite($ini, 'Set', 'TitleEx', $tmp)
  239.     Exit
  240. EndFunc   ;==>_Exit
  241.  
  242. Func _ToBoolean($iID)
  243.     If BitAND(GUICtrlRead($iID), $GUI_CHECKED) Then
  244.         Return 1
  245.     Else
  246.         Return 0
  247.     EndIf
  248. EndFunc   ;==>_ToBoolean
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement