Friday, April 08, 2005

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=[ lcName = STREXTRACT(lcLine,[value="],[">])
        LOOP
        ENDIF
        IF lcLine=[ lcFile = STREXTRACT(lcLine,[value="],[">])
        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

No comments: