Importing HHC files with West Wind HTML Help Builder

If you’ve never tried it, West-Wind Help Builder can be a life-saver. A great tool for creating both Technical and EndUser help files. On the technical side, it lets you import in class definitions and data dictionaries, making it easier to get a total scope of a project.

But what’s been missing has been a way to move existing help projects (those built using the Microsoft HTML Help Workshop) into Help Builder.

Now , under the hood, WW’s Help Builder uses the Visual FoxPro data file so if you’re intrigued, you can type in USE myHelp.VBP and browse the project to get a good feeling behind all of the data.

So the HTML Workshop builds its table of contents with an HHC file which is a terrible HTML file that looks like this:


    • So I imported it into a VFP memvar and then populated the West-Wind Help Project’s VBP file. Here’s the full code. It’s NOT polished but I noted it on the FoxShow podcast and wanted to ensure it was up here:

      LPARAMETERS tcFile,tcProj

      IF NOT FILE(tcFile)

      RETURN .F.

      ENDIF

      IF NOT EMPTY(tcProj) AND NOT USED(“PROJFILE”)

      USE (tcProj) IN 0 AGAIN SHARED ALIAS projFile

      ENDIF

      lcFile = FILETOSTR(tcFile)

      LOCAL lnlines

      lnLInes = ALINES(la,lcFile)

      LOCAL llStart,lcParent,lcPrevParent

      ** Note: the INDEX is the top level root ID of the HBP file.

      lcPrevParent = “INDEX”

      lcParent = “INDEX”

      llStart = .F.

      lnAdded = 0

      lnID=3

      lcLast = “INDEX”

      lnStart = 900

      FOR lni = 1 TO lnLines

      lcLine = STRTRAN(ALLTRIM(la(lni)),” “)

      IF lcLine = “



        llStart = .T.

        lcPrevParent = lcParent

        lcParent = lcLast

        LOOP

        ENDIF

        IF NOT llStart

        LOOP

        ENDIF

        IF lcLine = “

      • ** New Item

        lcName = “”

        lcContent = “”

        LOOP

        ENDIF

        IF lcLine=[])

        LOOP

        ENDIF

        IF lcLine=[])

        IF FILE(lcFile)

        lcContent = FILETOSTR(lcFile)

        ELSE

        lcContent = “File “+lcFile+” could not be found”

        ENDIF

        LOOP

        ENDIF

        IF lcLine=[]

        ** Add it

        lcID = SYS(2015)

        INSERT INTO projFile (pk,parentpk,topic,type,body,helpid,sortorder) ;

        VALUES (lcID,lcParent,lcName,”HEADER”,lcContent,lnID,IIF(lcParent=”INDEX”,lnStart,0))

        IF lcParent=”INDEX”

        lnstart = MAX(0,lnStart-100)

        ENDIF

        lnID = lnID+1

        lcLast = lcID

        lnAdded = lnAdded+1

        ENDIF

        IF LcLine = [

      ]

      lcParent = lcPrevParent

      ENDIF

      ENDFOR

      ** Now the rest of this code was written to clean up some of the garbage that came in with those old HTML files.

      SELECT projfile

      REPLACE ALL body WITH STRTRAN(body,[])

      REPLACE ALL body WITH STRTRAN(body,[])

      REPLACE ALL body WITH STRTRAN(body,[])

      REPLACE ALL body WITH STRTRAN(body,[])

      REPLACE ALL body WITH STRTRAN(body,[])

      REPLACE ALL body WITH STRTRAN(body,[])

      REPLACE ALL body WITH STRTRAN(body,[])

      replace ALL body WITH STRTRAN(body,”<","<<")
      replace ALL body WITH STRTRAN(body,”>”,”>>”)

      ? lnAdded

      Thinking back, I could likely have just used STREXTRACT for some of these but I needed something quick and dirty and this definitely does the trick. Also note that one of other cool things it does is IMPORT in the actual source.

      You’ll still have a lot of clean-up work to do but not a lot of re-writing.

      West Wind HTML Help Builder