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:
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:
-
- ** 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 = [
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 = "
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,[ - ** New Item