Liberty BASIC Help Search Engine

The Liberty BASIC help system is composed of plain HTML files, which are difficult to search. It also displays in the user's browser, which can be awkward. This program offers an application to display the helpfile and to search it easily. It also allows for easy navigation, the ability to annotate, print, change text size and view the HTML source for a help page.

REQUIRES LBBROWSE3.DLL available here:
LB Browse DLL

Place the DLL in the same folder as the BAS, or Windows System folder.

'Copyright 2011, Alyce Watson
'REQUIRES LBBROWSE3.DLL available here:
'Place DLL in program folder, or Windows System folder.
'This code is free for personal use.
'You may not republish this code in its current form.
'You may modify this code for your personal use.
'You may publish a modified version of this code under
'    these conditions:
'    1. You have made major changes to the code.
'    2. You give credit to the original author
'Thanks to the many people in the Liberty BASIC community who have shared code.
'This program contains code and ideas inspired by all that I've learned from others.
'I'd especially like to thank Janet, Stefan, Chris and Rod for help and
'inspiration for this program.
'An old LBFriend called Michael Rankin once wrote to me that
'"Knowledge is a gift we receive from others."
'I used that quote at the top of many of the early newsletter issues.
'It describes the spirit of our community perfectly. Thanks to all.
'initialize variables and arrays
    helpDir$ = installDir$+"lb4help\LibertyBASIC_4_web\HTML\"
    winTitle$ = "Liberty BASIC Help Search Engine"
    helpurl$ = installDir$+"lb4help\LibertyBASIC_4.html"
    selfile$ = helpurl$  'selfile$ is filename of currently displayed file
    dim info$(10,10)
    'get file info into array
    files helpDir$, "*.htm", info$()
    numFiles = val(info$(0,0))
    if numFiles=0 then end
    dim topics$(20)
graphicbox #1.g, 170, 34, 300, 40
stylebits #1.g, 0, _WS_VISIBLE, 0, 0
statictext #1.label1, "Search term:",10,10,80,16
button #1.go, "Display",[doSearch],UL,105,4,55,26
Stylebits #1.go, _BS_DEFPUSHBUTTON, 0, 0, 0
button #1.back, "<",[back],UL,170,4,30,26
button #1.forward, ">",[forward],UL,202,4,30,26
button #1.home, "TOC",[goHome],UL,240,4,35,26
button #1.index, "Index",[getIndex],UL,275,4,35,26
button #1.font, "Text Size",[doFont],UL,310,4,70,26
button #1.print, "Print Topic",[doPrint],UL,380,4,70,26
button #1.annotate, "Annotate",[doAnnotate],UL,450,4,70,26
button #1.source, "View Source",[viewSource],UL,520,4,70,26
button, "Help",[help],UL,590,4,50,26
button #1.about, "About",[about],UL,640,4,50,26
listbox #1.topics,topics$(),[doDisplay],10,60,150,400
open winTitle$ for window as #1
    #1 "trapclose [quit]"
    #1 "resizehandler [resizeMe]"
    #1 "font ms_sans_serif 8"
    #1.back "!font ms_sans_serif 14 bold"
    #1.forward "!font ms_sans_serif 14 bold" "Type search term."
    #1.g "down;fill lightgray;backcolor lightgray;color red; font arial 14 bold"
    #1.g "\\        Working... please wait."
    #1.g "flush"
    open "lbbrowse3.dll" for dll as #b
    hMain = hwnd(#1)
    calldll #b, "CreateBrowser", hMain as ulong, 170 as long, _
        34 as long, 610 as long, 426 as long,_
        helpurl$ as ptr, 0 as long, result as ulong
    if result<>0 then
        notice "Unable to load browser control."
        goto [abort]
    end if
    calldll #b, "ShowStatusbar", 0 as long, re as void "!setfocus"
    'setfocus so that user keystrokes are directed to textbox when program opens
    'select all text in textbox so user will replace it when he types
    CallDLL #user32, "SendMessageA",_
        hEdit As ulong, _    'handle of EDIT control
        _EM_SETSEL As long,_ 'message
        0 As long,_           'start position of highlighting
        -1 As long,_        'last char of highlighting
        result As long
    'invoke resizehandler
    calldll #user32, "MoveWindow",_
        hMain as ulong, _       'window handle
        10 as long,_            'x location of window
        10 as long,_            'y location of window
        790 as long,_           'desired width of window
        500 as long,_           'desired height of window
        1 as long,_             'repaint flag,0=false,1=true
        ret as long             'nonzero=success
    gosub [enableButtons]
[quit] calldll #b, "DestroyBrowser",  re as void
[abort] close #b:close #1:end
    'retrieve text after the null character - this is the filename
    #1.topics, "selection? sel$"
    calldll #b, "Navigate", selfile$ as ptr, ret as void
    gosub [enableButtons]
    calldll #b, "Navigate", helpurl$ as ptr, ret as void
    gosub [enableButtons]
    #1.g "show"
    redim topics$(numFiles)
    for i = 1 to numFiles
        open helpDir$ + info$(i,0) for input as #file
        txt$=INPUT$(#file, lenFile)
        topics$(i)=GetTitle$(txt$)+ chr$(0)+ helpDir$ + info$(i,0)
        close #file
    sort topics$(),1,numFiles
    #1.topics "reload"
    #1.g "hide"
    calldll #b, "CanGoBack", goback as long
    if goback=1 then calldll #b, "Back", re as void
    gosub [enableButtons]
    calldll #b, "CanGoForward", goforward as long
        if goforward=1 then calldll #b, "Forward", re as void
    gosub [enableButtons]
    calldll #b, "GetTitle",_ 'get page title
        ptitle$ as ptr,_    'string buffer will hold page title
        re as void          'no return
    if ptitle$="" then ptitle$="Liberty BASIC Help"
    pCaption$=winTitle$;" --- ";ptitle$
    calldll #user32, "SetWindowTextA",_
        hMain as ulong,_   'handle of window
        pCaption$ as ptr,_ 'new titlebar text
        re as long
    calldll #b, "CanGoBack", goback as long
    if goback=1 then
        #1.back "!enable"
        #1.back "!disable"
    end if
    calldll #b, "CanGoForward", goforward as long
    if goforward=1 then
        #1.forward "!enable"
        #1.forward "!disable"
    end if
    prompt "Enter desired font size. Valid numbers are 1 - 5.";fsize$
    if fsize$="" then wait
    if size<1 then size=1:if size>5 then size=5
    calldll #b, "DoFontSize",_ 'set font size, 1-5
        size as long,_ '1-5  1=small, 5=large
        re as void          'no return
    calldll #b, "BrowserPrint",_  'print hard copy of page
        re as void      'no return
    notice "Liberty BASIC Help Search Engine ";chr$(169);" Alyce Watson 2011"


" instruc$=instruc$+"

Type a search term, then hit enter or the Display button. Double click on a topic from the listbox to display it in the browser control." instruc$=instruc$+"

The TOC button causes the help system's main page to be displayed." instruc$=instruc$+"

The Index button causes an alphabetical index of pages to be displayed in the listbox." instruc$=instruc$+"

Annotations are added by typing a note, which will be added to the bottom of the current topic in red text." instruc$=instruc$+"

View Source will cause the source code for the current topic to be displayed in the default HTML editor." instruc$=instruc$+"

Print Topic will offer the option to print a hard copy of the current topic." instruc$=instruc$+"

The topic text size can be changed by hitting the Text Size button. Select sizes 1-5" instruc$=instruc$+"

Liberty BASIC Help Search Engine copyright 2011, Alyce Watson" calldll #b, "BrowserString",_ 'load html page from memory string instruc$ as ptr,_ 'string containing html code ret as void 'no return wait [doAnnotate] if selfile$="" then wait prompt "Type notes here.";notes$ if notes$="" then wait open selfile$ for append as #g print #g, "

";notes$;"" close #g calldll #b, "Navigate", selfile$ as ptr, ret as void wait [viewSource] calldll #b, "ViewSource",_ 'view source in user's default program re as void 'no return wait [doSearch] "!contents? term$" if term$="" then notice "Please type a search term." wait end if #1.g "show" term$=lower$(term$) redim topics$(numFiles) 'redim array to clear it count=0 : bestmatch$="" 'reset page to show after search 'In a loop, open each file and search with instr() 'If search term is found, extract title from HTML page. 'Concatenate title, null character, and path/filename and add to array. 'null chr$(0) keeps filename out of user's view, 'but allows it to be retrieved for display. for i = 1 to numFiles scan open helpDir$ + info$(i,0) for input as #file lenFile=lof(#file) txt$=INPUT$(#file, lenFile) start=instr(lower$(txt$),term$) if start >0 then count=count+1 topics$(count)=GetTitle$(txt$)+ chr$(0)+ helpDir$ + info$(i,0) if lower$(GetTitle$(txt$))=term$ then 'if search term is a topic title, show it bestmatch$=helpDir$ + info$(i,0) end if end if close #file next sort topics$(),1,count #1.topics "reload" #1.g "hide" if count=0 then wait 'if no topic title exactly matches search term, see if one contains it if bestmatch$="" then for i = 1 to count if instr(topics$(i),term$) then bestmatch$=word$(topics$(i),2,chr$(0)) exit for end if next end if 'if there is still no bestmatch$, then display first topic in list if bestmatch$="" then bestmatch$=word$(topics$(1),2,chr$(0)) end if calldll #b, "Navigate", bestmatch$ as ptr, ret as void gosub [enableButtons] wait [resizeMe] width=WindowWidth-178:height=WindowHeight-42 calldll #b, "MoveBrowser",_ 'relocate and resize browser control, 170 as long,_ 'new x location 34 as long,_ 'new y location width as long,_ 'new width height as long,_'new height ret as void 'no return #1.topics "locate 10 60 150 ";WindowHeight-68 #1 "refresh" wait 'extract title from html text function GetTitle$(s$) marker1=instr(upper$(s$), "",marker1)+3 marker2=instr(upper$(s$), "", marker1) lenTitle=marker2-marker1 GetTitle$=mid$(s$,marker1,lenTitle) end function 'borrowed from Stefan Pendl function GetModuleFileName$() nSize = _MAX_PATH + 1 lpFilename$ = space$(nSize); CHR$(0) calldll #kernel32, "GetModuleFileNameA",_ hModule as uLong,_ lpFilename$ as ptr,_ nSize as uLong,_ result as uLong if result > 0 then GetModuleFileName$ = trim$(lpFilename$) end function function GetFolder$(Path$) pos = 1 GetFolder$ = Path$ while pos > 0 pos = instr(Path$, "\", pos) if pos > 0 then GetFolder$ = left$(Path$, pos) pos = pos + 1 end if wend end function


Source Code





Media Demos



API Resources


LB 4 Companion

Mastering LB 3

LB Workshop

Game Workshop