Jump to content

Program listings for #include, Dim Global Local Const, Func, and $ Variables helpful for debugging


Recommended Posts

I find this useful as programs get big and I can't keep the whole program and variables and globals in myhead.

It simply scans your program and spits out into separate Notepad files with line numbers for:

#include

Dim Global Local Cost

Func

$ Variables

It's *NOT* a polished program with graphs or diagrams but it helps me and I'm submitting it as my first example script.

#AutoIt3Wrapper_run_debug_mode=Y    ;use this to debug in console window <--- LOOK
;recall ;debug toggles debug - so search for and change ;debug to ;;debug
AutoItSetOption("MustDeclareVars", 1)

#include <Debug.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
#include <GUIEdit.au3>
#include <StaticConstants.au3>      ;for $SS_CENTER
#include <WindowsConstants.au3>

Global $debug = 0   ;0=off 1=on
If $debug > 0 Then Msgbox(0+262144,"Info","@AutoItVersion = " & @AutoItVersion)

Global $Author = "ahha"

;v1a - original
;...
;v1j - changed Send to copy and paste
;v2a - adding checkboxes
;v2b - cleaning up some code
;v2c - setting up a Label to show the file drop zone
;v2d - adding $h_StatusWindow status window and display message - eventually got rid of this in favor of a scrolling window
;v2e - need to strip WS in front before any searches except for $Variable
;       #include, Dim Global Local Const, Func - all need to be first after stripping leading whitespace (WS)
;       $Variable can be anywhere - even in a comment
;       this means commented out #include, Dim Global Local Const, Func will NOT be shown
;       Perhaps have a Checkbox to include/exclude commented out
;v2f - add the checkbox for commented out
;v2g - cleaned up some code, program not perfect as it catches extra stuff like comment ;for $SS_CENTER as a variable
;       also duplicates of the same line especially for Dim Global Local Const, Func
;       gets the job done and useful
;v2h - adding info about hotkeyset so user can abort processing
;v2i - getting rid of duplicate lines from Dim Global Local Const, Func processing
;v2j - getting rid of extraneous code
;v2k - combining open and paste to Notepad, pop Program Status window to top to show processing (don't keep user in the dark)
;v2ka - setting window order so user knows we're processing
;v2kb - cleaning out more extraneous code
;v2kc - cleaning out even more extraneious code
Global $version = "v2kc"    ;released to AutoIt on 2023-02-11

;possible future improvements/features
;on large files >10k lines it can be slow doing 4 iterations, may want to do a single pass of reading the array to speed it up
;program lists some stuff like #include "DateTimeConstants.au3" as a Const because we don't filter fully - but not harmful

Global $hSTBEdit, $hSTBGUI  ;for Scrolling Text Box
__scrolling_text_box_init()     ;set up box - to display text use: __scrolltext($text)

Global $fPaused = False
HotKeySet("^q", "TogglePause")  ;Crtl+q

Global $QUOTE = Chr(34) ;0x22

Global $hNP     ;handle for NotePad

Global $iColorBlack = 0x000000, $iColorRed = 0xff0000, $iColorGreen = 0x00ff00, $iColorBlue = 0x0000ff, $iColorYellow = 0xffff00, $iColorWhite = 0xffffff, $iColorReddish = 0xF57670

Global $hGUI = GUICreate("Program Listings " & $version & "   >> USE: Crtl+q to Toggle/Pause/Abort", 700, 400, Default, Default, Default, $WS_EX_ACCEPTFILES)
GUICtrlSetBkColor($hGUI, $iColorRed)    ;;debug the background for width of field - remember ;debug toggles it so use ;;debug
Global $id_Line1 = GUICtrlCreateLabel("Drop an .au3 file in the green region to automatically generate the Listings selected with line numbers.", 10, 10)
Global $id_Line2 = GUICtrlCreateLabel("Each Listing will be in a separate Notepad file.", 10, 10+20)
Global $id_Line3 = GUICtrlCreateLabel("As an example go to AutoIt3\Include and drag and drop in file Date.au3", 10, 10+20+20)
Global $id_Line4 = GUICtrlCreateLabel("Listings:", 10, 10+20+20+50)

;Global $id_LabelDrop = GUICtrlCreateInput("Drop your .au3 file here.", 700-280, 400-350, 200, 100, Default, $WS_EX_ACCEPTFILES)    ;<-- this screws up
Global $id_LabelDrop = GUICtrlCreateInput("Drop your .au3 file here.", 700-280, 400-350, 200, 100)  ;<-- this works
GUICtrlSetBkColor($id_LabelDrop, $iColorGreen)  ;;debug the background for width of field
GUICtrlSetState($id_LabelDrop, $GUI_DROPACCEPTED)

GUISetState(@SW_SHOW)

Global $id_CheckboxComment, $id_CheckboxInclude, $id_CheckboxDimGlobalLocalConst, $id_CheckboxFunc, $id_CheckboxVariables
CreateCheckboxComment()
CreateCheckboxInclude()
CreateCheckboxDimGlobalLocalConst()
CreateCheckboxFunc()
CreateCheckboxVariables()

;for use in While 1
Local $nMsg, $i = 0
Global $file, $aFile
Opt("SendKeyDelay", 0)  ;Alters the length of the brief pause in between sent keystrokes. A value of 0 removes the delay completely. Time in milliseconds to pause (default=5).

Dim $aA[1]  ;for debug
Const $xA = 0 ;for debug


While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Msgbox(0+262144,"Info","Exiting program", 1)
            Exit
        Case $GUI_EVENT_DROPPED
            ;Pause("In: Case $GUI_EVENT_DROPPED")
            $file = @GUI_DragFile
            Msgbox(0+262144,"Info","Dropped filename = '" & $file & "'")
            _FileReadToArray($file, $aFile, $FRTA_COUNT)
            ;_DebugArrayDisplay($aFile, "Array of: '"& $file & "'") ;NOTA BENE - _DebugArrayDisplay STRIPS leading WS !!! for display only

            ; #include processing
            If GUICtrlRead($id_CheckboxInclude) = $GUI_CHECKED Then ;proceed to generate #include listing
                Msgbox(0+262144,"Info","Proceeding to generate #include listing", 1)
                __scrolltext(@CRLF & "Info: Proceeding to generate #include listing" & @CRLF)
                Local $sTitle = "#include list for: '" & $file & "'" & @CRLF & _
                    "Line number  #include" & @CR & _
                    "-----------  --------" & @CRLF
                _SetWindowOrder($hSTBGUI, $hGUI)    ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Local $sString = ""
                Local $sLineStr = ""    ;operational string without WS in front ;v2e
                Local $sSkip = "no"
                If GUICtrlRead($id_CheckboxComment) = $GUI_CHECKED Then $sSkip = "yes"
                ;Pause("$sSkip = '" & $sSkip & "'")

                For $i = 1 to $aFile[0]     ;[0] has count
                    __scrolltext("Reading line " & $i & "/" & $aFile[0] & " = '" & $aFile[$i] & "'" & @CRLF)
                    $sLineStr = StringStripWS($aFile[$i], $STR_STRIPLEADING)    ;v2e need to strip WS in front
                    If ( (StringLeft($sLineStr, 1) = ";") AND ($sSkip = "yes") ) Then
                        ;2f - skip line if commented out
                    Else    ;process it if line is not commented out ;v2f - include anywhere in line !! not just left justified
                        ;convert string to lower case
                        If StringInStr(StringLower($aFile[$i]), "#include") Then $sString = $sString & $i & "  " & $aFile[$i] & @CR ;just look for "#include"
                    EndIf
                Next

                $hNP = _OpenAndPasteToNotepad($sTitle & $sString)
                _SetWindowOrder($hNP, $hGUI, $hSTBGUI)  ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Beep(500, 1000)     ;to indicate done
            EndIf

            ; Dim Global Local Const processing
            If GUICtrlRead($id_CheckboxDimGlobalLocalConst) = $GUI_CHECKED Then ;proceed to generate Dim Global Local Const listing
                Msgbox(0+262144,"Info","Proceeding to generate Dim Global Local Const listing", 1)
                __scrolltext(@CRLF & "Info: Proceeding to generate Dim Global Local Const listing" & @CRLF)
                Local $sTitle = "Dim Global Local Const list for: '" & $file & "'" & @CRLF & _
                    "Line number  Dim Global Local Const" & @CR & _
                    "-----------  ----------------------" & @CRLF
                _SetWindowOrder($hSTBGUI, $hGUI)    ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Local $sString = ""
                Local $sLineStr = ""    ;operational string without WS in front ;v2e
                Local $sSkip = "no"
                If GUICtrlRead($id_CheckboxComment) = $GUI_CHECKED Then $sSkip = "yes"
                Local $flag = 0

                For $i = 1 to $aFile[0]     ;[0] has count
                    __scrolltext("Reading line " & $i & "/" & $aFile[0] & " = '" & $aFile[$i] & "'" & @CRLF)
                    $sLineStr = StringStripWS($aFile[$i], $STR_STRIPLEADING)    ;v2e need to strip WS in front
                    $flag = 0
                    If ( (StringLeft($sLineStr, 1) = ";") AND ($sSkip = "yes") ) Then
                        ;2f - skip line if commented out
                    Else    ;process it if line is not commented out ;v2f - include anywhere in line !! not just left justified
                        ;convert string to lower case
                        ;probably could do this with a Case or Switch
                        If StringInStr(StringLower($aFile[$i]), "dim") Then $flag = 1
                        If StringInStr(StringLower($aFile[$i]), "global") Then $flag = 1
                        If StringInStr(StringLower($aFile[$i]), "local") Then $flag = 1
                        If StringInStr(StringLower($aFile[$i]), "const") Then $flag = 1

                        If $flag = 1 Then $sString = $sString & $i & "  " & $aFile[$i] & @CR
                    EndIf
                Next

                $hNP = _OpenAndPasteToNotepad($sTitle & $sString)
                _SetWindowOrder($hNP, $hGUI, $hSTBGUI)  ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Beep(500, 1000)     ;to indicate done
            EndIf


            ; Func processing
            If GUICtrlRead($id_CheckboxFunc) = $GUI_CHECKED Then    ;proceed to generate Func listing
                Msgbox(0+262144,"Info","Proceeding to generate Func listing", 1)
                __scrolltext(@CRLF & "Info: Proceeding to generate Func listing" & @CRLF)
                Local $sTitle = "Func list for: '" & $file & "'" & @CRLF & _
                    "Line number  Func" & @CR & _
                    "-----------  ----" & @CRLF
                _SetWindowOrder($hSTBGUI, $hGUI)    ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Local $sString = ""
                Local $sLineStr = ""    ;operational string without WS in front ;v2e
                Local $sSkip = "no"
                If GUICtrlRead($id_CheckboxComment) = $GUI_CHECKED Then $sSkip = "yes"

                For $i = 1 to $aFile[0]     ;[0] has count
                    __scrolltext("Reading line " & $i & "/" & $aFile[0] & " = '" & $aFile[$i] & "'" & @CRLF)
                    $sLineStr = StringStripWS($aFile[$i], $STR_STRIPLEADING)    ;v2e need to strip WS in front
                    If ( (StringLeft($sLineStr, 1) = ";") AND ($sSkip = "yes") ) Then
                        ;2f - skip line if commented out
                    Else    ;process it if line is not commented out ;v2f - include anywhere in line !! not just left justified
                        If StringInStr(StringLower($aFile[$i]), "func") Then $sString = $sString & $i & "  " & $aFile[$i] & @CR ;just look for "Func"
                    EndIf
                Next

                $hNP = _OpenAndPasteToNotepad($sTitle & $sString)
                _SetWindowOrder($hNP, $hGUI, $hSTBGUI)  ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Beep(500, 1000)     ;to indicate done
            EndIf


            ; $ Variables processing
            If GUICtrlRead($id_CheckboxVariables) = $GUI_CHECKED Then   ;proceed to generate $ Variables listing
                Msgbox(0+262144,"Info","Proceeding to generate $ Variables listing", 1)
                __scrolltext(@CRLF & "Info: Proceeding to generate $ Variables listing" & @CRLF)
                Local $sTitle = "$ Variables list for: '" & $file & "'" & @CRLF & _
                    "Line number  $ Variables" & @CR & _
                    "-----------  -----------" & @CRLF
                _SetWindowOrder($hSTBGUI, $hGUI)    ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Local $sString = ""
                Local $sLineStr = ""    ;operational string without WS in front ;v2e
                Local $sSkip = "no"
                If GUICtrlRead($id_CheckboxComment) = $GUI_CHECKED Then $sSkip = "yes"

                For $i = 1 to $aFile[0]     ;[0] has count
                    __scrolltext("Reading line " & $i & "/" & $aFile[0] & " = '" & $aFile[$i] & "'" & @CRLF)
                    $sLineStr = StringStripWS($aFile[$i], $STR_STRIPLEADING)    ;v2e need to strip WS in front
                    If ( (StringLeft($sLineStr, 1) = ";") AND ($sSkip = "yes") ) Then
                        ;2f - skip line if commented out
                    Else    ;process it if line is not commented out ;v2f - include anywhere in line !! not just left justified
                        ;convert string to lower case
                        If StringInStr(StringLower($aFile[$i]), "$") Then $sString = $sString & $i & "  " & $aFile[$i] & @CR    ;just look for "$"
                    EndIf
                Next

                $hNP = _OpenAndPasteToNotepad($sTitle & $sString)
                _SetWindowOrder($hNP, $hGUI, $hSTBGUI)  ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
                Beep(500, 1000)     ;to indicate done
            EndIf

            Beep(200, 1000)     ;to indicate done processing

        Case $id_LabelDrop
            ;Pause("In: Case $id_LabelDrop")    ;comment out so don't process as checkbox activation/deactivation somethimes triggers to here

    EndSwitch

WEnd

Exit    ;should never hit this

;------------------------------ Functions -------------------------

Func  _SetWindowOrder($hWin1, $hWin2 = "", $hWin3 = "", $hWin4 = "", $hWin5 = "", $hWin6 = "", $hWin7 = "", $hWin8 = "")    ;sets windows in order leftmost top, etc.  Paints back (right) to front (left)
    ;handles at most 8 windows
    WinSetOnTop($hWin8, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin8, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin7, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin7, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin6, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin6, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin5, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin5, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin4, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin4, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin3, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin3, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin2, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin2, "", $WINDOWS_NOONTOP)
    WinSetOnTop($hWin1, "", $WINDOWS_ONTOP)
    WinSetOnTop($hWin1, "", $WINDOWS_NOONTOP)

;   Local $i
;   For $i = 8 to 1 Step - 1    ;using Assign() and Eval() commands
EndFunc     ;Func  _SetWindowOrder($hWin1, $hWin2 = "", $hWin3 = "", $hWin4 = "", $hWin5 = "", $hWin6 = "", $hWin7 = "", $hWin8 = "")


Func  _OpenAndPasteToNotepad($sString)
    Run("notepad.exe")
    $hNP = WinWaitActive("Untitled - Notepad")  ;Global above
    ClipPut($sString)       ;put to clipboard for faster pasting
    WinActivate($hNP)
    WinWaitActive($hNP)
    Send("^v")      ;Ctrl+v to paste it in
    Return($hNP)    ;so can use it if needed
EndFunc     ;Func  _OpenAndPasteToNotepad($sString)


Func  CreateCheckboxComment()
    $id_CheckboxComment = GUICtrlCreateCheckbox("Exclude if line commented out (i.e. starts with ; )", 30+100, 10+20+20+50-5, 280, 25)      ;Global above
    GUICtrlSetState($id_CheckboxComment, $GUI_CHECKED)
    GUICtrlSetTip($id_CheckboxComment, "UNCheck this if you want to have a listing that includes commented out lines in the program file.")
    ;GUICtrlSetBkColor($id_CheckboxComment, $iColorYellow)  ;;debug the background for width of field
EndFunc     ;Func  CreateCheckboxComment()

Func  CreateCheckboxInclude()
    $id_CheckboxInclude = GUICtrlCreateCheckbox("#include", 30, 100+25, 200, 25)        ;Global above
    GUICtrlSetState($id_CheckboxInclude, $GUI_CHECKED)
    GUICtrlSetTip($id_CheckboxInclude, "Check this if you want to have a listing of #includes in the program file.")
    ;GUICtrlSetBkColor($id_IncludeCheckbox, $iColorYellow)  ;;debug the background for width of field
EndFunc     ;Func  CreateCheckboxInclude()

Func  CreateCheckboxDimGlobalLocalConst()
    $id_CheckboxDimGlobalLocalConst = GUICtrlCreateCheckbox("Dim Global Local Const", 30, 100+25+25, 200, 25)       ;Global above
    GUICtrlSetState($id_CheckboxDimGlobalLocalConst, $GUI_CHECKED)
    GUICtrlSetTip($id_CheckboxDimGlobalLocalConst, "Check this if you want to have a listing of Dim Global Local and Const in the program file.")
    ;GUICtrlSetBkColor($id_CheckboxDimGlobalLocalConst, $iColorYellow)  ;;debug the background for width of field
EndFunc     ;Func  CreateCheckboxInclude()

Func  CreateCheckboxFunc()
    $id_CheckboxFunc = GUICtrlCreateCheckbox("Func", 30, 100+25+25+25, 200, 25)     ;Global above
    GUICtrlSetState($id_CheckboxFunc, $GUI_CHECKED)
    GUICtrlSetTip($id_CheckboxFunc, "Check this if you want to have a listing of Func in the program file.")
    ;GUICtrlSetBkColor($id_CheckboxFunc, $iColorYellow) ;;debug the background for width of field
EndFunc     ;Func  CreateCheckboxFunc()

Func  CreateCheckboxVariables()
    $id_CheckboxVariables = GUICtrlCreateCheckbox("$ Variables", 30, 100+25+25+25+25, 200, 25)      ;Global above
    GUICtrlSetState($id_CheckboxVariables, $GUI_CHECKED)
    GUICtrlSetTip($id_CheckboxVariables, "Check this if you want to have a listing of $ Variables in the program file.")
    ;GUICtrlSetBkColor($id_CheckboxVariables, $iColorYellow)    ;;debug the background for width of field
EndFunc     ;Func  CreateCheckboxVariables()


Func __scrolling_text_box_init()
    Local $limit, $x
    ;from http://www.autoitscript.com/forum/topic/110948-add-text-to-edit-box-and-scroll-it-down/page__p__971158__hl___guictrledit_scroll__fromsearch__1#entry971158
    ;Global $hSTBEdit, $hSTBGUI ;for Scrolling Text Box
    $hSTBGUI = GUICreate("Program Status - Program listings " & $version, 750, 500)
    $hSTBEdit = GUICtrlCreateEdit("", 10, 10, 730, 480, BitOr($GUI_SS_DEFAULT_EDIT, $ES_READONLY))
    ;$limit = 9223372036854775807   ;2^63
    $limit = 1000000000 ;works
    $x = GUICtrlSetLimit($hSTBEdit, $limit)
    ;~ If $x = 0 Then
    ;~  MsgBox(0, "ERROR", "Limit of " &  $limit & " is too large.")
    ;~ Else
    ;~  MsgBox(0, "Okay", "Limit of " &  $limit & " is okay.")
    ;~ EndIf

    ;$hButton = GUICtrlCreateButton("Add", 10, 250, 80, 30)

    GUISetState()

EndFunc     ;Func __scrolling_text_box_init()


Func __scrolltext($text)
    GUICtrlSetData($hSTBEdit, $text, 1)
EndFunc     ;Func __scrolltext($text)


Func  TogglePause()
    Local $ans = MsgBox(0 + $MB_YESNO + $MB_ICONQUESTION + $MB_TOPMOST + $MB_DEFBUTTON1, "Program paused.", "Do you want to Quit the program?") ;make Yes the default
    If $ans = $IDYES  Then
        ;MsgBox(0 + $MB_OK + $MB_ICONQUESTION + $MB_TOPMOST, "Program quitting", "Please wait as program finishes the operation and then exits.")
        Exit    ;exit entire program
    EndIf
EndFunc   ;Func  TogglePause()


Func  Pause($text="")
    ;__scrolltext("Debug: Paused " & $text & @CRLF)
    MsgBox(262144, "DEBUG", "Paused: " & $text)
EndFunc     ;Func  Pause($text="")

 

Edited by ahha
forgot to include the code :)
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Mbee
      Hi!
      I'm using Maps (and I love 'em!), so I have to use the latest AutoIt Beta. I've switched to Beta mode, and the graphical debugger doesn't even show up in the Explorer context menu (not surprising). So I'd like to use _Dbug (rather than a large number of MsgBox statements), but it fails when it encounters a Map function (such as MapExists). I've made a request for a version that will work with the Beta, but going on past history, I don't expect an answer anytime soon.
      I'm not necessarily asking for someone else to modify _Dbug, because I can probably do it myself, as long as I know how to adapt it to use the Beta. Can someone please enlighten me as to how to adapt a UDF or other function to use AutoIt Beta?
      Thanks!
    • By mLipok
      Here is just some usefull script analyzer:
      #include <ColorConstants.au3> #include <GUIConstantsEx.au3> #include <MsgBoxConstants.au3> #include <StaticConstants.au3> #include <TreeViewConstants.au3> #include <WindowsConstants.au3> #include <File.au3> #include <Array.au3> ; just put a FileFullPath to one of your project _UsedInclude_API() _GetAllDependencies("c:\Program Files (x86)\AutoIt3\SciTE\SciTE Jump\SciTE Jump.au3") _UsedInclude_API() _GetAllDependencies("c:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3") _UsedInclude_API() _GetAllDependencies("c:\Program Files (x86)\AutoIt3\SciTE\SciTEConfig\SciteConfig.au3" ) _UsedInclude_API() _GetAllDependencies(@ScriptFullPath) Func _GetAllDependencies($sFileToCheck) GUICreate("My GUI with treeview", 500, @DesktopHeight - 40) Local $idTreeview = GUICtrlCreateTreeView(6, 6, 488, @DesktopHeight - 40 - 12, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE) Local $idDisplayitem = GUICtrlCreateTreeViewItem($sFileToCheck, $idTreeview) GUICtrlSetColor(-1, $COLOR_GREEN) __UsedIncludeToTreeView($sFileToCheck, $idDisplayitem) Local $hItem = GUICtrlGetHandle($idDisplayitem) GUICtrlSendMsg($idTreeview, $TVM_EXPAND, $TVE_TOGGLE, $hItem) GUISetState(@SW_SHOW) Local $idMsg ; Loop until the user exits. While 1 $idMsg = GUIGetMsg() Select Case $idMsg = $GUI_EVENT_CLOSE ExitLoop EndSelect WEnd EndFunc ;==>_GetAllDependencies Func _GetUsedIncludeToArray($sAU3Content) Local $aIncludes = StringRegExp($sAU3Content, '(?im)^\s*#include\s?[''""<](.*)\.au3[''"">]', 3) If @error Then Return SetError(@error, @extended, '') Else Return SetError(0, 0, $aIncludes) EndIf EndFunc ;==>_GetUsedIncludeToArray Func __UsedIncludeToTreeView($sFileToCheck, $idTreeview_ref) $hFile = FileOpen($sFileToCheck, $FO_READ) $sAU3Content = FileRead($hFile) FileClose($hFile) Local $aIncludes = _GetUsedIncludeToArray($sAU3Content) If @error Then Return SetError(@error, @extended, '') Else Local $idDisplayitem, $iNumberOfOccurrences = 0 For $iInclude_Idx = 0 To UBound($aIncludes) - 1 $iNumberOfOccurrences = _UsedInclude_API($aIncludes[$iInclude_Idx]) If $iNumberOfOccurrences = 0 Then $idDisplayitem = GUICtrlCreateTreeViewItem($aIncludes[$iInclude_Idx], $idTreeview_ref) __UsedIncludeToTreeView(_GetDir($sFileToCheck) & $aIncludes[$iInclude_Idx] & '.au3', $idDisplayitem) ElseIf $iNumberOfOccurrences = 1 Then $idDisplayitem = GUICtrlCreateTreeViewItem($aIncludes[$iInclude_Idx] & ' (Was used before: once)', $idTreeview_ref) GUICtrlSetColor(-1, $COLOR_RED) ElseIf $iNumberOfOccurrences = 2 Then $idDisplayitem = GUICtrlCreateTreeViewItem($aIncludes[$iInclude_Idx] & ' (Was used before: twice)', $idTreeview_ref) GUICtrlSetColor(-1, $COLOR_PURPLE) ElseIf $iNumberOfOccurrences > 2 Then $idDisplayitem = GUICtrlCreateTreeViewItem($aIncludes[$iInclude_Idx] & ' (Was used before more then twice)', $idTreeview_ref) GUICtrlSetColor(-1, $COLOR_BLUE) EndIf Next EndIf EndFunc ;==>__UsedIncludeToTreeView Func _UsedInclude_API($sIncludeFileName = Default) Local Static $sIncludeAPI_Static = '|' ; reset If $sIncludeFileName = Default Then $sIncludeAPI_Static = '|' Return EndIf StringReplace($sIncludeAPI_Static, '|' & $sIncludeFileName & '|', '|' & $sIncludeFileName & '|') Local $iNumberOfReplacements = @extended $sIncludeAPI_Static &= $sIncludeFileName & '|' Return SetError(0, 0, $iNumberOfReplacements) EndFunc ;==>_UsedInclude_API Func _GetDir($sFileFullPath) Local $sDrive = "", $sDir = "", $sFileName = "", $sExtension = "" Local $aPathSplit = _PathSplit($sFileFullPath, $sDrive, $sDir, $sFileName, $sExtension) Return $sDrive & $sDir EndFunc ;==>_GetDir  
      Have fun.
      mLipok
       
    • By Kidney
      Hey guys,

      So we recently moved our company Knowledge Base to an in-house solution rather than paying a monthly subscription for someone else to host it and use their features. Either way, we have moved from one KB (Knowledge Base) site to another but there is an issue. No one restricted access to the original KB site which meant anyone was able to edit the site as they pleased. This means that some of the old KB's  features (picture/video/internal links) are still be utilized and I need to find out which pages have links that inevitably go dead once we stop sending them money. 

      So, I feel like in 90% of the way to getting this working correctly. Steps are fairly simple:
      Log into the KB Load a list of URL's Pull the HTML and search for "helpjuice" Log the URL has been checked Check for links on this page and check it against the list of URL's Log any new URL's that are missing from the list Now, I have no idea if this is the best way of doing this process but, again, I've made it 90% of the way so far and I would like to figure this specific problem out and if anyone has a better/more effective method of doing this, please point me in the right direction!

      Here is the Code i have so far.
      #include <File.au3> #include <FileConstants.au3> #include <WinAPIFiles.au3> #include <IE.au3> #include <MsgBoxConstants.au3> #include <Array.au3> Global $aGlobalLinks[1][3] = [["Link", "Checked", "Hit"]] ;Create Array with Headers ;//Load KB and login by submit the login form. Local $oIE = _IECreate ("https://website.com/kb/") Local $oForm = _IEFormGetObjByName($oIE, "login-form") Local $oEmail = _IEFormElementGetObjByName($oForm, "email") Local $oPassword = _IEFormElementGetObjByName($oForm, "password") _IEFormElementSetValue($oEmail, "email@email.com") _IEFormElementSetValue($oPassword, "password") Sleep(500) _IEFormSubmit($oForm) ;_IEQuit($oIE) ;//Load a second window to confirm it shows we are logged in. Grab a list of links as a jumping off point if the KB_URL.txt is empty ;//Mainly used for Debugging Local $oIE = _IECreate ("https://website.com/kb/") $oLinks = _IELinkGetCollection($oIE) For $oLink In $oLinks _ArraySearch($aGlobalLinks, $oLink.href) If @error = 6 Then Local $aFill[1][3] = [[$oLink.href, "No", "No"]] _ArrayAdd($aGlobalLinks, $aFill) EndIf Next ;//Close second window of IE _IEQuit($oIE) ;//Attempt to load the KB_URL.txt LoadFile() ;//Setting $r to 1 since the txt file and the $aGlobalLinks will have a header in index 0 Global $r = 1 Do If $aGlobalLinks[$r][1] = "No" Then ;Skip Entries that have already been checked Local $oIE = _IECreate($aGlobalLinks[$r][0], 0, 1, 0) ;Create new window with the first 'unchecked' link entry _IELoadWait($oIE, 100, 2500) ;Wait 2.5 seconds for page to load If @error = 6 Then ;@error = 6 means the Timeout was met..Send {ESC} to stop the loading ConsoleWrite("Webpage timed out...Sending ESC..." & @CRLF) Send("{ESC}") Sleep(500) EndIf Local $sHTML = _IEDocReadHTML($oIE) ;Read the HTML and look for any trace of 'helpjuice' Local $result = StringRegExp($sHTML, ".*?helpjuice.*?", 0) ConsoleWrite("RegExt result: " & $result & @CRLF) If $result = 1 Then ;A result of 1 means there is a match $aGlobalLinks[$r][1] = "Yes" ;Set 'Checked' to 'Yes' $aGlobalLinks[$r][2] = "Yes" ;Set 'Hit' to 'Yes' ConsoleWrite("~~~~~~~~~~~~~ H I T ~~~~~~~~~~~~~ " & $aGlobalLinks[$r][0] & @CRLF) Else $aGlobalLinks[$r][1] = "Yes" ;Set 'Checked' to 'Yes' EndIf $oLinks = _IELinkGetCollection($oIE) ;Grab a list of links from the existing site ;_ArrayDisplay($oLinks) For $oLink In $oLinks ;Loop through all the links found and add any new links to the end of $aGlobalLinks ConsoleWrite("String: " & String($oLink) & @CRLF) ConsoleWrite("Looking for: " & $oLink.href & @CRLF) _ArraySearch($aGlobalLinks, $oLink.href) If @error = 6 Then Local $aFill[1][3] = [[$oLink.href, "No", "No"]] ;Set 'Checked' and 'Hit' to 'No' because this link has not been checked yet _ArrayAdd($aGlobalLinks, $aFill) EndIf Next _IEQuit($oIE) ;This next part is to reduce the amount times we write to the file ;Changing the '10' to '100' means the script will save the changes every 100 entries If IsInt($r/10) = 1 Then SaveFile() ConsoleWrite("File Saved: " & $r & "/" & UBound($aGlobalLinks) & @CRLF) EndIf ConsoleWrite("Completed " & $r & "/" & UBound($aGlobalLinks) & @CRLF) EndIf $r += 1 Until $r > UBound($aGlobalLinks) ;_ArrayDisplay($aGlobalLinks) Func SaveFile() $oFile = FileOpen(@ScriptDir & "\KB_URLs.txt", 2) FileClose($oFile) _FileWriteFromArray(@ScriptDir & "\KB_URLs.txt", $aGlobalLinks, 0, UBound($aGlobalLinks), ",") EndFunc Func LoadFile() _FileReadToArray(@ScriptDir & "\KB_URLs.txt", $aGlobalLinks, $FRTA_NOCOUNT, ",") _ArrayDisplay($aGlobalLinks) EndFunc  
      The error I'm getting has to do with the function _IELinkGetCollection. I used the examples in the AutoIT Help section and there is multiple uses of $oLink.href. I haven't been able to find much on when/how to use the .href.
      Here is the Console Output of the error:
       
      RegExt result: 0 Looking for: https://website.com/kb/ Looking for: https://website.com/kb/207557-abc-bank-homepage# Looking for: https://website.com/kb/ Looking for: https://website.com/kb/19011-partners-and-isos Looking for: https://website.com/kb/46470-onsite-install-partners Looking for: https://website.com/en/small-business/payments-and-processing/abc-merchant-services.html Looking for: https://website.com/Clover Looking for: https://website.com/screens/signup/?integrations_id=12345 Looking for: https://website.com/instruction/import-an-inventory-menu-spreadsheet/?userDevice=web Looking for: https://website.com/instruction/import-an-inventory-menu-spreadsheet/?userDevice=web Looking for: https://website.com/instruction/import-an-inventory-menu-spreadsheet/?userDevice=web Looking for: https://website.com/appmarket/apps/Z6GMBJ5HCBEQA?clientCountry=US Looking for: https://website.com/kb/207557-abc-bank-homepage#panel3a Looking for: https://website.com/kb/207557-abc-bank-homepage#panel4a Looking for: https://website.com/kb/207557-abc-bank-homepage#panel5a "C:\Users\Jon\Desktop\KB Scrub\HTMLDOC_Test.au3" (65) : ==> The requested action with this object has failed.: ConsoleWrite("Looking for: " & $oLink.href & @CRLF) ConsoleWrite("Looking for: " & $oLink^ ERROR Any insight is appreciated!
    • By mati
      Hi,
      I wonder if
      AutoIt3Wrapper_run_debug_mode = Y can include run information about functions which are called within the main code. So far I noticed in the console that the function itself is called but no specific run information from  inside the function is provided. Is there a chance to show the entire debug log including functions in the console?
      I furthermore noticed a stop of information when a loop is entered. What could be the reason for that?
       
      Thanks for help.
×
×
  • Create New...