diff --git a/harbour/utils/hbdoc/genchm.prg b/harbour/utils/hbdoc/genchm.prg
new file mode 100644
index 0000000000..be625d077f
--- /dev/null
+++ b/harbour/utils/hbdoc/genchm.prg
@@ -0,0 +1,1318 @@
+/*
+ * $Id$
+ */
+
+/*
+ * Harbour Project source code:
+ * GENCHM support module for hbdoc document Extractor
+ *
+ * Copyright 2000 Luiz Rafael Culik
+ * www - http://www.harbour-project.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version, with one exception:
+ *
+ * The exception is that if you link the Harbour Runtime Library (HRL)
+ * and/or the Harbour Virtual Machine (HVM) with other files to produce
+ * an executable, this does not by itself cause the resulting executable
+ * to be covered by the GNU General Public License. Your use of that
+ * executable is in no way restricted on account of linking the HRL
+ * and/or HVM code into it.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA (or visit
+ * their web site at http://www.gnu.org/).
+ *
+ */
+
+#ifdef __HARBOUR__
+#define NANFOR
+#endif
+
+#include "directry.ch"
+#include "fileio.ch"
+#include "inkey.ch"
+#include 'hbdocdef.ch'
+#include 'common.ch'
+// output lines on the screen
+
+#define INFILELINE 10
+#define MODULELINE 12
+#define LINELINE 14
+#define ERRORLINE 20
+#define LONGLINE 600
+#define LONGONELINE 86
+MEMVAR aDirList
+MEMVAR aDocInfo
+MEMVAR aWww
+
+STATIC aAlso
+STATIC aFiTable := {}
+STATIC aSiTable := {}
+STATIC lIsTable := .F.
+STATIC nCommentLen
+STATIC lEof
+STATIC aFoiTable := {}
+STATIC atiTable := {}
+STATIC nNumTableItems := 0
+STATIC aCurDoc := {}
+STATIC nCurDoc := 1
+
+STATIC aColorTable := { 'aqua', 'black', 'fuchia', 'grey', 'green', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow' }
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function ProcessWww()
+*+
+*+ Called from ( hbdoc.prg ) 2 - function main()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION ProcessChm()
+
+ // Copyright (C) 2000 Luiz Rafael Culik
+ //
+ // Purpose: Process each of the files in the directory
+ //
+ // Modification History:
+ // Version Date Who Notes
+ // V1.00 1/12/2000 LRC Initial Version
+ //
+ // Calling parameters: None
+ //
+ // Notes: None
+ // -
+ // LOCAL variables:
+
+ LOCAL i
+ LOCAL j
+ LOCAL nFiles := LEN( aDirList )
+ LOCAL lDoc
+ LOCAL lClassDoc
+ LOCAL cBuffer
+ LOCAL nEnd
+ LOCAL nCount
+
+ LOCAL cBar := REPLICATE( "-", 80 ) + CRLF
+ LOCAL nMode
+ LOCAL cFuncName
+ LOCAL cOneLine
+ LOCAL cCategory
+ LOCAL cFileName
+ LOCAL nLineCnt
+ LOCAL cSeeAlso
+ LOCAL cTemp
+ LOCAL cChar
+ LOCAL nPos
+ LOCAL lFirstSintax := .T.
+ LOCAL lAddEndPreTag := .F.
+ LOCAL lEndDesc := .F.
+ LOCAL lEndArgs := .F.
+ LOCAL lEndSyntax := .F.
+ LOCAL lEndReturns := .F.
+ LOCAL lEndData := .F.
+ LOCAL lDataLink
+
+ LOCAL lBlankLine := .F. // Blank line encountered and sent out
+ LOCAL lAddBlank := .F. // Need to add a blank line if next line is not blank
+ LOCAL oChm
+ LOCAL nReadHandle
+ LOCAL lEndConstru := .F.
+ LOCAL lFirstPass := .T.
+ LOCAL lFirstArg := .T.
+ LOCAL lData := .F.
+ LOCAL lIsDataLink := .F.
+ LOCAL lIsMethodLink := .F.
+ LOCAL lMethod := .F.
+ LOCAL cDoc := DELIM + "DOC" + DELIM // DOC keyword
+ LOCAL cEnd := DELIM + "END" + DELIM // END keyword
+ LOCAL cFunc := DELIM + "FUNCNAME" + DELIM // FUNCNAME keyword
+ LOCAL cCat := DELIM + "CATEGORY" + DELIM // CATEGORY keyword
+ LOCAL cOne := DELIM + "ONELINER" + DELIM // ONELINER keyword
+ LOCAL cSyn := DELIM + "SYNTAX" + DELIM // SYNTAX keyword
+ LOCAL cArg := DELIM + "ARGUMENTS" + DELIM // ARGUMENTS keyword
+ LOCAL cRet := DELIM + "RETURNS" + DELIM // RETURNS keyword
+ LOCAL cDesc := DELIM + "DESCRIPTION" + DELIM // DESCRIPTION keyword
+ LOCAL cExam := DELIM + "EXAMPLES" + DELIM // EXAMPLES keyword
+ LOCAL cSee := DELIM + "SEEALSO" + DELIM // SEEALSO keyword
+ LOCAL cInc := DELIM + "INCLUDE" + DELIM // INCLUDE keyword
+ LOCAL cComm := DELIM + "COMMANDNAME" + DELIM // COMMAND keyword
+ LOCAL cCompl := DELIM + "COMPLIANCE" + DELIM
+ LOCAL cTest := DELIM + 'TESTS' + DELIM
+ LOCAL cStatus := DELIM + 'STATUS' + DELIM
+ LOCAL cPlat := DELIM + 'PLATFORMS' + DELIM
+ LOCAL cFiles := DELIM + 'FILES' + DELIM
+ LOCAL cSubCode := DELIM + 'SUBCODE' + DELIM
+ LOCAL cFunction := DELIM + 'FUNCTION' + DELIM
+ LOCAL cConstruct := DELIM + 'CONSTRUCTOR' + DELIM
+ LOCAL cDatalink := DELIM + 'DATALINK' + DELIM
+ LOCAL cDatanolink := DELIM + 'DATANOLINK' + DELIM
+ LOCAL cMethodslink := DELIM + 'METHODSLINK' + DELIM
+ LOCAL cMethodsNolink := DELIM + 'METHODSNOLINK' + DELIM
+ LOCAL cData := DELIM + "DATA" + DELIM
+ LOCAL cMethod := DELIM + 'METHOD' + DELIM
+ LOCAL cClassDoc := DELIM + "CLASSDOC" + DELIM
+ //
+ // Entry Point
+ //
+ // Put up information labels
+ @ INFILELINE, 20 SAY "Extracting: "
+ @ MODULELINE, 20 SAY "Documenting: "
+ // loop through all of the files
+ lFirstArg := .T.
+ lFirstPass := .T.
+ lFirstSintax := .T.
+ FOR i := 1 TO nFiles
+
+ // Open file for input
+
+ nCommentLen := IIF( AT( ".ASM", UPPER( aDirList[ i, F_NAME ] ) ) > 0, 2, 4 )
+ nReadHandle := FT_FUSE( aDirList[ i, F_NAME ] )
+ @ INFILELINE, 33 CLEAR TO INFILELINE, MAXCOL()
+ @ INFILELINE, 33 SAY PAD( aDirList[ i, F_NAME ], 47 )
+ @ MODULELINE, 33 CLEAR TO LINELINE, MAXCOL()
+ @ LINELINE, 27 SAY "Line:"
+
+ nLineCnt := 0
+
+ IF nReadHandle < 0
+ WRITE_ERROR( "Can't open file: (Dos Error " + STR( FERROR() ) + ")",,,, aDirList[ i, F_NAME ] )
+ @ ERRORLINE, 0 CLEAR TO ERRORLINE, MAXCOL()
+ @ ERRORLINE, 20 SAY "Can't open file: (Dos Error " + STR( FERROR() ) + ") File=" + aDirList[ i, F_NAME ]
+ LOOP
+ ENDIF
+ lEof := .F.
+ lDoc := .F.
+ lClassDoc := .F.
+ // First find the author
+ ReadFromTop( nReadHandle )
+ DO WHILE .NOT. lEof
+
+ // Read a line
+
+ cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
+ cBuffer := STRTRAN( cBuffer, CHR( 10 ), '' )
+ nLineCnt ++
+ IF nLineCnt % 10 = 0
+ @ LINELINE, 33 SAY STR( nLineCnt, 5, 0 )
+ ENDIF
+ // check to see if we are in doc mode or getting out of doc mode
+
+ IF AT( cDoc, cBuffer ) > 0
+ IF lDoc
+// WRITE_ERROR( cDoc + " encountered during extraction of Doc" ;
+// + " at line" + STR( nLinecnt, 5, 0 ),,,, aDirList[ i, F_NAME ] )
+ ENDIF
+ lDoc := .T.
+ cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), ;
+ nCommentLen ) )
+ nLineCnt ++
+ cCategory := cFuncName := cSeeAlso := ""
+ nMode := D_IGNORE
+ ELSEIF AT( cClassDoc, cBuffer ) > 0
+ IF lClassDoc
+// WRITE_ERROR( cDoc + " encountered during extraction of Doc" ;
+ // + " at line" + STR( nLinecnt, 5, 0 ),,,, aDirList[ i, F_NAME ] )
+ ENDIF
+ lClassDoc := .T.
+ cBuffer := TRIM( SUBSTR( ReadLN( @lEof ), ;
+ nCommentLen ) )
+ nLineCnt ++
+ cCategory := cFuncName := cSeeAlso := ""
+ nMode := D_IGNORE
+
+ ELSEIF AT( cEnd, cBuffer ) > 0
+ nCurDoc ++
+ IF .NOT. lDoc .AND. !lClassDoc
+// WRITE_ERROR( cEnd + " encountered outside of Doc area at line" ;
+ // + STR( nLinecnt, 5, 0 ),,,, aDirList[ i, F_NAME ] )
+ ELSE
+ // Add a new entry to our list of files
+
+ IF EMPTY( cCategory )
+// WRITE_ERROR( "Blank Category",,,, aDirList[ i, F_NAME ] )
+ cCategory := "Unknown"
+ ENDIF
+ IF EMPTY( cFuncName )
+ // WRITE_ERROR( "Blank Function Name",,,, aDirList[ i, F_NAME ] )
+ cFuncName := "Unknown"
+ ENDIF
+ AADD( aDocInfo, { cCategory, cFuncName, cOneLine, cFileName } )
+ // Now close down this little piece
+ IF .NOT. EMPTY( cSeeAlso )
+
+ oChm:WriteParBold( "See Also " )
+ oChm:WriteText( "" )
+ ProcChmalso( oChm, cSeealso )
+ oChm:WriteText( "
" )
+ IF lDoc
+ oChm:WriteText( "" )
+ oChm:Close()
+ ENDIF
+ Elseif empty(cSeeAlso)
+ IF lDoc
+ oChm:WriteText( "" )
+ oChm:Close()
+ ENDIF
+
+ ENDIF
+ lDoc := .F.
+ lClassDoc := .F.
+
+ IF lEndReturns .AND. lClassDoc
+ lEndReturns := .f.
+ oChm:WriteText( "
" )
+ ENDIF
+ IF lEndArgs .AND. lClassDoc
+ lEndArgs := .f.
+ oChm:WriteText( "" )
+ ENDIF
+
+ nMode := D_IGNORE
+ ENDIF
+
+ @ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
+ ENDIF
+
+ IF lDoc .OR. lClassDoc
+ // 1) function name
+ IF AT( cFunc, cBuffer ) > 0 .OR. AT( cComm, cBuffer ) > 0 .OR. AT( cSubCode, cBuffer ) > 0
+
+ cBuffer := ReadLN( @lEof )
+ nLineCnt ++
+ // Save the function name
+ cFuncName := UPPER( ALLTRIM( SUBSTR( cBuffer, nCommentLen ) ) )
+ @ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
+ @ MODULELINE, 33 SAY cFuncName
+
+ nMode := D_NORMAL
+
+ // Open a new file
+ IF AT( "FT_", cFuncName ) > 0
+ cTemp := SUBSTR( cFuncName, 4 )
+ ELSE
+ cTemp := cFuncName
+ ENDIF
+
+ IF ( nEnd := AT( "(", cTemp ) ) > 0
+ cTemp := LEFT( cTemp, nEnd - 1 )
+ ENDIF
+ cFileName := ""
+
+ // Strip off any other non-alphabetic/numeric characters
+ FOR j := 1 TO LEN( cTemp )
+ cChar := SUBSTR( cTemp, j, 1 )
+ IF ( cChar >= "0" .AND. cChar <= "9" ) .OR. ;
+ ( cChar >= "A" .AND. cChar <= "Z" ) .OR. cChar = "_"
+ cFileName += cChar
+ ENDIF
+ NEXT
+
+ // See if file name is present already. If so then modify
+
+ cFileName := LEFT( cFileName, 21 )
+ nEnd := 1
+ nCount := 0
+ DO WHILE nEnd > 0
+ nEnd := ASCAN( aDocInfo, { | a | a[ 4 ] == cFileName + ".htm" } )
+ IF nEnd > 0
+
+ // This will break if there are more than 10 files with the same first
+ // seven characters. We take our chances.
+
+ IF LEN( cFileName ) = 21
+ cFileName := STUFF( cFileName, 21, 1, STR( nCount, 1, 0 ) )
+ ELSE
+ cFileName += STR( nCount, 1, 0 )
+ ENDIF
+ nCount ++
+ ENDIF
+ ENDDO
+ // Add on the extension
+
+ cFileName := LEFT( cFileName, 21 ) + ".htm"
+ IF lDoc
+ oChm := THTML():NewChm( 'chm\' + cFileName ,,cFuncName)
+ ENDIF
+ IF lFirstPass .AND. lClassDoc
+ lFirstPass := .F.
+ oChm := THTML():NewChm( 'chm\' + cFileName ,,cFuncName)
+ ENDIF
+ IF oChm:nHandle < 1
+ ? "Error creating", cFileName, ".htm"
+// WRITE_ERROR( "Error creating",,,, cFileName + ".htm" )
+ ENDIF
+
+ ELSEIF (AT( cdata, cBuffer ) > 0 .and. GetItem( cBuffer, nCurdoc ) ).OR. (AT( cmethod, cBuffer ) > 0 .and. GetItem( cBuffer, nCurdoc ) )
+ IF AT( cdata, cBuffer ) > 0
+ lData := .T.
+ lMethod := .F.
+ ELSEIF AT( cmethod, cBuffer ) > 0
+ lMethod := .T.
+ lData := .F.
+ ENDIF
+
+ cBuffer := ReadLN( @lEof )
+ nLineCnt ++
+ // Save the function name
+ cFuncName := UPPER( ALLTRIM( SUBSTR( cBuffer, nCommentLen ) ) )
+ @ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
+ @ MODULELINE, 33 SAY cFuncName
+
+ nMode := D_NORMAL
+ IF AT( "(", cfuncname ) > 0
+ cFuncname := SUBSTR( cFuncName, 1, AT( "(", cFuncName ) - 1 )
+ ENDIF
+ IF lEndDesc .AND. lClassDoc
+ lEndDesc := .f.
+ oChm:WriteText( "" )
+ ENDIF
+ oChm:WriteText( '
' )
+ oChm:WriteText( '
' )
+ oChm:Writetext( '
' )
+ oChm:WriteText( '
' )
+ oChm:WriteText( '
' )
+
+ oChm:WriteText( "" )
+
+ // 2) Category
+ ELSEIF AT( cCat, cBuffer ) > 0
+ cBuffer := ReadLN( @lEof )
+ nLineCnt ++
+ // get the category
+ cCategory := UPPER( ALLTRIM( SUBSTR( cBuffer, nCommentLen ) ) )
+
+ // 3) One line description
+
+ ELSEIF AT( cOne, cBuffer ) > 0
+ cBuffer := ReadLN( @lEof )
+ nLineCnt ++
+ cOneLine := ALLTRIM( SUBSTR( cBuffer, nCommentLen ) )
+ IF LEN( cOneLine ) > LONGONELINE
+// WRITE_ERROR( "OneLine", cOneLine, nLineCnt, LONGONELINE, ;
+// aDirList[ i, F_NAME ] )
+ ENDIF
+
+ nMode := D_ONELINE
+ // Now start writing out what we know
+
+ IF lData
+ oChm:WriteText( "DATA " + ALLTRIM( PAD( cFuncName, 21 ) ) + "
" )
+ oChm:WriteText( "" + cOneline + "
" + hb_osnewline() )
+ ELSEIF lMethod
+ oChm:WriteText( " METHOD " + ALLTRIM( PAD( cFuncName, 21 ) ) + "
" )
+ oChm:WriteText( "" + cOneline + "
" + hb_osnewline() )
+ ELSE
+ oChm:WriteText( "" + ALLTRIM( PAD( cFuncName, 21 ) ) + "
" )
+ AADD( aWWW, { cFuncName, LEFT( cFileName, AT( ".", cFileName ) - 1 ) } )
+ oChm:WriteText( "" + cOneline + "
" + hb_osnewline() )
+ ENDIF
+ lFirstSintax := .T.
+ // 4) all other stuff
+
+ ELSE
+
+ IF AT( cSyn, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ oChm:WriteParBold( " Syntax", .f., .f. )
+ oChm:WriteText( '' )
+ nMode := D_SYNTAX
+ lAddBlank := .T.
+ lEndSyntax := .T.
+end
+ ELSEIF AT( cConstruct, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ oChm:WriteParBold( " Constructor syntax", .F., .f. )
+ oChm:WriteText( '
' )
+ nMode := D_SYNTAX
+ lAddBlank := .T.
+ lEndSyntax := .T.
+ end
+ ELSEIF AT( cArg, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ oChm:WriteParBold( " Arguments" )
+ oChm:WriteText( '
' )
+
+ nMode := D_ARG
+ lAddBlank := .T.
+ lEndArgs := .t.
+ end
+ ELSEIF AT( cRet, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+
+ oChm:WriteParBold( " Returns" )
+ oChm:WriteText( '
' )
+ nMode := D_ARG
+ lAddBlank := .T.
+ lEndReturns := .t.
+ end
+ ELSEIF AT( cDesc, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ oChm:WriteText( "
" )
+ ENDIF
+
+ oChm:WriteParBold( " Description" )
+ oChm:WriteText( '
' )
+
+ nMode := D_DESCRIPTION
+ lAddBlank := .T.
+ lEndDesc := .t.
+ end
+ ELSEIF AT( cExam, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+ oChm:WriteParBold( " Examples" )
+ oChm:WriteText( "
" )
+ nMode := D_EXAMPLE
+ lAddBlank := .T.
+ lAddEndPreTag := .T.
+ end
+ ELSEIF AT( cTest, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+ oChm:WriteParBold( " Tests", .t., .f. )
+ oChm:WriteText( "
" )
+ nMode := D_EXAMPLE
+ lAddBlank := .T.
+ end
+ ELSEIF AT( cStatus, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ nMode := D_STATUS
+ end
+ ELSEIF AT( cCompl, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+ oChm:WriteParBold( " Compliance" )
+ oChm:WriteText( "
" )
+ nMode := D_COMPLIANCE
+ lAddBlank := .T.
+ end
+ ELSEIF AT( cPlat, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+ oChm:WriteParBold( " Platforms" )
+ oChm:WriteText( "
" )
+ nMode := D_NORMAL
+ lAddBlank := .T.
+ end
+ ELSEIF AT( cFiles, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+ oChm:WriteParBold( " Files" )
+ oChm:WriteText( "
" )
+ nMode := D_NORMAL
+ lAddBlank := .T.
+ end
+ ELSEIF AT( cFunction, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ IF !lBlankLine
+ // oChm:WritePar( "" )
+ ENDIF
+ oChm:WriteParBold( " Functions" )
+ oChm:WriteText( "
" )
+ nMode := D_NORMAL
+ lAddBlank := .T.
+ end
+ ELSEIF AT( cSee, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ nMode := D_SEEALSO
+ end
+ ELSEIF AT( cInc, cBuffer ) > 0
+ if GetItem( cBuffer, nCurdoc )
+ nMode := D_INCLUDE
+ end
+ // All other input is trimmed of comments and sent out
+ ELSE
+
+ // translate any \$ into $
+ cBuffer := STRTRAN( cBuffer, "\" + DELIM, DELIM )
+ IF nMode = D_SYNTAX
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "Syntax", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ IF lAddBlank
+ lAddBlank := .F.
+ ENDIF
+ procChmdesc( cbuffer, oChm, "Syntax" )
+
+ ELSEIF nMode = D_ARG
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "Arguments", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ IF lAddBlank
+ lAddBlank := .F.
+ ENDIF
+
+ procChmdesc( cbuffer, oChm, "Arguments" )
+ ELSEIF nMode = D_NORMAL
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+
+ IF lBlankLine
+ oChm:WriteText( '
' )
+ lAddBlank := .F.
+ ENDIF
+
+ ProcChmDesc( cBuffer, oChm )
+ ELSEIF nMode = D_EXAMPLE
+ IF LEN( cBuffer ) > LONGLINE
+ // WRITE_ERROR( "General", cBuffer, nLineCnt, ;
+// LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ procChmdesc( cBuffer, oChm, "Example" )
+ ELSEIF nMode = D_DESCRIPTION
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ procChmdesc( cBuffer, oChm, "Description" )
+
+ ELSEIF nMode = D_SEEALSO
+ IF .NOT. EMPTY( cBuffer )
+ cSeeAlso := StripFiles( ALLTRIM( cBuffer ) )
+ ENDIF
+ ELSEIF nMode = D_INCLUDE
+ // read next line
+ IF .NOT. EMPTY( cBuffer )
+ IF !lBlankLine
+ ENDIF
+ ENDIF
+ ELSEIF nMode = D_DATALINK
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ IF lAddBlank
+ lAddBlank := .F.
+ ENDIF
+ cTemp := ALLTRIM( SUBSTR( cBuffer, 1, AT( ":", cBuffer ) - 1 ) )
+ oChm:WriteText( "" + cBuffer + '' )
+
+ ELSEIF nMode = D_METHODLINK
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ IF lAddBlank
+ lAddBlank := .F.
+ ENDIF
+ cTemp := ALLTRIM( SUBSTR( cBuffer, 1, AT( "(", cBuffer ) - 1 ) )
+ oChm:WriteText( "" + cBuffer + '' )
+
+ ELSEIF nMode = D_COMPLIANCE
+ IF LEN( cBuffer ) > LONGLINE
+// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
+ // LONGLINE, aDirList[ i, F_NAME ] )
+ ENDIF
+ lBlankLine := EMPTY( cBuffer )
+ procChmdesc( cBuffer, oChm, "Compliance" )
+
+ ELSEIF nMode = D_STATUS
+ IF !EMPTY( cBuffer )
+ oChm:WriteParBold( "Status" )
+ oChm:WriteText( "
" )
+ ENDIF
+ ProcStatusChm( oChm, cBuffer )
+
+ ELSE
+
+ // unknown data from somewhere
+
+// WRITE_ERROR( "Unknown Data Type " + cBuffer,, ;
+// nLineCnt, ;
+// LONGONELINE, aDirList[ i, F_NAME ] )
+
+ ENDIF
+ ENDIF
+
+ ////////////////////
+
+ ENDIF
+ ENDIF
+
+ IF !lClassDoc .AND. lEof
+ IF VALTYPE( oChm ) == "O"
+ oChm:WriteText( '
' )
+ oChm:Close()
+ ENDIF
+
+ ENDIF
+
+ ENDDO
+ // Close down the input file
+
+ FT_FUSE()
+ IF lClassDoc
+ oChm:Close()
+ ENDIF
+ nCurDoc := 1
+ aCurDoc := {}
+
+ NEXT
+RETURN nil
+/***********************************
+* Function ProcChmBuf(cBuffer) -> cTemp
+* Parameter cBuffer -> Strip the "<" and ">" symbols from the imput String
+* Return cTemp Formated String to WWW output
+*/
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function ProcChmBuf()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION ProcChmBuf( cPar )
+
+ cPar := STRTRAN( cPar, "<", "<" )
+ cPar := STRTRAN( cPar, ">", ">" )
+
+RETURN cPar
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function ProcChmAlso()
+*+
+*+ Called from ( genhtm.prg ) 1 - function processChm()
+*+ ( genhtm1.prg ) 1 - function processChm()
+*+ ( genhtm2.prg ) 1 - function processChm()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION ProcChmAlso( nWriteHandle, cSeeAlso )
+
+ LOCAL nPos
+ LOCAL cTemp := ''
+ LOCAL xTemp
+ LOCAL nLen
+ LOCAL xPos
+ LOCAL tPos
+ nLen := LEN( cSeeAlso )
+ WHILE .t.
+ nPos := AT( ",", cSeeAlso )
+ IF nPos > 0
+ xTemp := SUBSTR( ALLTRIM( cSeeAlso ), 1, nPos - 1 )
+ tPos := AT( "()", xTemp )
+ IF tPos > 0
+ nLen -= LEN( xTemp ) + 1
+
+ cTemp := xTemp
+ ELSE
+ xPos := AT( " ", xTemp )
+ IF xPos > 0
+ nLen -= LEN( xTemp ) + 3
+ cTemp := xTemp
+ xTemp := SUBSTR( xTemp, 1, xPos - 1 ) + SUBSTR( xTemp, xPos + 1 )
+
+ ELSE
+ nLen -= LEN( xTemp ) + 2
+
+ cTemp := xTemp
+ END
+
+ END
+ ELSE
+ xTemp := SUBSTR( cSeeAlso, 1 )
+ tPos := AT( "()", xTemp )
+
+ IF tPos > 0
+ nLen -= LEN( xTemp ) + 1
+
+ cTemp := xTemp
+ ELSE
+
+ xPos := AT( " ", xTemp )
+ IF xPos > 0
+ nLen -= LEN( xTemp ) + 3
+ cTemp := xTemp
+ xTemp := SUBSTR( xTemp, 1, xPos - 1 ) + SUBSTR( xTemp, xPos + 1 )
+
+ ELSE
+ nLen -= LEN( xTemp ) + 2
+
+ cTemp := xTemp
+ END
+ END
+
+ ENDIF
+
+ nWriteHandle:WriteLink( ALLTRIM( xTemp ), cTemp )
+ cSeeAlso := SUBSTR( cSeeAlso, nPos + 1 )
+
+ IF nLen == 0 .OR. nLen < 0
+ EXIT
+ END
+ ENDDO
+RETURN nil
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function ProcStatusChm()
+*+
+*+ Called from ( genhtm.prg ) 1 - function processChm()
+*+ ( genhtm1.prg ) 1 - function processChm()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION ProcStatusChm( nWriteHandle, cBuffer )
+
+ IF LEN( ALLTRIM( cBuffer ) ) > 1
+ nWriteHandle:WriteText( cBuffer )
+ ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "R"
+ nWriteHandle:WriteText( " Ready" )
+ ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "S"
+ nWriteHandle:WriteText( " Started" )
+ ELSEIF SUBSTR( ALLTRIM( cBuffer ), 1 ) == "C"
+ nWriteHandle:WriteText( " Clipper" )
+ ELSE
+ nWriteHandle:WriteText( " Not Started" )
+ ENDIF
+
+RETURN nil
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function FormatChmBuff()
+*+
+*+ Called from ( genhtm.prg ) 1 - function prochtmdesc()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION FormatChmBuff( cBuffer, cStyle, oChm )
+
+ LOCAL creturn := ''
+ LOCAL cline := ''
+ LOCAL cOldLine := ''
+ LOCAL cBuffend := ''
+ LOCAL lEndBuffer := .f.
+ LOCAL lArgBold := .f.
+ LOCAL npos
+ LOCAL nposend
+ creturn := cBuffer + ' '
+ IF AT( '', creturn ) > 0 .OR. EMPTY( cBuffer )
+ IF EMPTY( cbuffer )
+ creturn := ''
+ ENDIF
+ RETURN creturn
+ ENDIF
+ IF cStyle != "Syntax" .AND. cStyle != "Arguments"
+ DO WHILE !lEndBuffer
+ cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
+ IF AT( '', cLine ) > 0
+ lEndBuffer := .t.
+ ENDIF
+
+ IF EMPTY( cLine )
+ lEndBuffer := .t.
+ // TheBlank := .t.
+ FT_FSKIP( - 1 )
+ ENDIF
+ IF AT( DELIM, cLine ) > 0
+
+ FT_FSKIP( - 1 )
+ lEndBuffer := .t.
+ ENDIF
+ IF AT( DELIM, cLine ) = 0
+ cReturn += ' ' + ALLTRIM( cLine ) + ' '
+ ENDIF
+ ENDDO
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := STRTRAN( cReturn, "", "" )
+
+ cReturn := '' + cReturn + ' '
+
+ ELSEIF cStyle == 'Syntax'
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := STRTRAN( cReturn, "<", "<" )
+ cReturn := STRTRAN( cReturn, ">", ">" )
+
+ creturn := '' + creturn + ' '
+ ELSEIF cStyle == 'Arguments'
+
+ nPos := 0
+ IF AT( "", cReturn ) > 0 .and. at('',cReturn)=0
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := ALLTRIM( cReturn )
+ nPos := AT( " ", cReturn )
+ cOldLine := LEFT( cReturn, nPos - 1 )
+ cReturn := STRTRAN( cReturn, cOldLine, "" )
+ IF AT( "@", cOldLine ) > 0 .OR. AT( "()", cOldLine ) > 0 .OR. AT( "<", cOldLine ) > 0 .OR. AT( "_", cOldLine ) > 0
+ cOldLine := STRTRAN( cOldLine, "<", "<" )
+ cOldLine := STRTRAN( cOldLine, ">", ">" )
+ lArgBold := .T.
+ ENDIF
+ elseif AT( "", cReturn ) > 0 .and. at('',cReturn)>0
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := ALLTRIM( cReturn )
+ nPos := AT( '', cReturn )
+ cOldLine := LEFT( cReturn, nPos + 3 )
+ cReturn := STRTRAN( cReturn, cOldLine, "" )
+ IF AT( "@", cOldLine ) > 0 .OR. AT( "()", cOldLine ) > 0 .OR. AT( "<", cOldLine ) > 0 .OR. AT( "_", cOldLine ) > 0
+ cOldLine := STRTRAN( cOldLine, "", "" )
+ cOldLine := STRTRAN( cOldLine, "", "" )
+ cOldLine := STRTRAN( cOldLine, "<", "<" )
+ cOldLine := STRTRAN( cOldLine, ">", ">" )
+ lArgBold := .T.
+ ENDIF
+
+ ENDIF
+
+
+ DO WHILE !lEndBuffer
+
+ cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
+ IF AT( "", cLine ) > 0
+ lEndBuffer := .t.
+ ENDIF
+ IF EMPTY( cLine )
+ lEndBuffer := .t.
+ // TheBlank := .t.
+ FT_FSKIP( - 1 )
+
+ ENDIF
+ IF AT( DELIM, cLine ) > 0
+ FT_FSKIP( - 1 )
+ lEndBuffer := .t.
+ ENDIF
+ IF AT( DELIM, cLine ) = 0
+ cReturn += ' ' + ALLTRIM( cLine ) + ' '
+ ENDIF
+ ENDDO
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := STRTRAN( cReturn, "", "" )
+
+ cReturn := STRTRAN( cReturn, "<", "<" )
+ cReturn := STRTRAN( cReturn, ">", ">" )
+ cOldLine := STRTRAN( cOldLine, "<", "<" )
+ cOldLine := STRTRAN( cOldLine, ">", ">" )
+
+ IF lArgBold
+ cReturn := ' ' + cOldLine + ' ' + cReturn + ' '
+ ELSE
+ cReturn := ' ' + cOldLine + ' ' + cReturn + ' '
+ ENDIF
+ // ENDIF
+ lArgBold := .F.
+
+ ENDIF
+
+ // endif
+RETURN creturn
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function checkChmcolor()
+*+
+*+ Called from ( genChm.prg ) 1 - function procChmdesc()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNC checkChmcolor( cbuffer, ncolorpos )
+
+ LOCAL ncolorend
+ LOCAL nreturn
+ LOCAL cOldColorString
+ LOCAL cReturn
+ LOCAL ccolor
+
+ DO WHILE AT( " 0
+ nColorPos := AT( "", ccolor )
+ ccolor := SUBSTR( ccolor, 1, nColorend - 1 )
+ cOldColorString := SUBSTR( cbuffer, ncolorpos )
+ nColorend := AT( ">", cOldColorString )
+ cOldColorString := SUBSTR( cOldColorString, 1, nColorEnd )
+ nreturn := ASCAN( acolortable, { | x, y | UPPER( x ) == UPPER( ccolor ) } )
+ IF nreturn > 0
+ creturn := ''
+ ENDIF
+ cBuffer := STRTRAN( cBuffer, cOldColorString, cReturn )
+ ENDDO
+RETURN cbuffer
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function ProcChmDesc()
+*+
+*+ Called from ( genChm.prg ) 6 - function processChm()
+*+ ( genChm1.prg ) 6 - function processChm()
+*+ ( genChm2.prg ) 6 - function processChm()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION ProcChmDesc( cBuffer, oChm, cStyle )
+
+ LOCAL cOldLine := ''
+ LOCAL npos
+ LOCAL CurPos := 0
+ LOCAL nColorPos
+ LOCAL ccolor := ''
+ LOCAL creturn := ''
+ LOCAL ncolorend
+ LOCAL nIdentLevel
+ LOCAL lEndPar := .F.
+ LOCAL cLine := ''
+ LOCAL lEndFixed := .F.
+ LOCAL lArgBold := .f.
+ LOCAL LFstTableItem := .T.
+ LOCAL lEndTable := .F.
+ LOCAL lEndBuffer := .f.
+ DEFAULT cStyle TO "Default"
+
+ IF AT( '', cBuffer ) == 0 .AND. !EMPTY( cBuffer ) .AND. cstyle <> "Example"
+ cBuffer := '' + cBuffer
+ ENDIF
+
+ IF EMPTY( cBuffer )
+ oChm:WriteText( "
" )
+ ENDIF
+
+ IF cStyle <> "Example" .AND. AT( "", cBuffer ) == 0 .AND. AT( "", cBuffer ) = 0
+ IF AT( "", cBuffer ) >= 0 .OR. AT( "", cBuffer ) = 0 .AND. !EMPTY( cbuffer )
+ IF AT( "", cBuffer ) > 0 .AND. AT( "", cBuffer ) > 0
+ IF cStyle == "Arguments"
+
+ creturn := cBuffer
+
+ cReturn := STRTRAN( cReturn, "", "" )
+ cReturn := STRTRAN( cReturn, "", "" )
+
+ cReturn := ALLTRIM( cReturn )
+ nPos := AT( " ", cReturn )
+ cOldLine := LEFT( cReturn, nPos - 1 )
+ cReturn := STRTRAN( cReturn, cOldLine, "" )
+ IF AT( "@", cOldLine ) > 0 .OR. AT( "()", cOldLine ) > 0 .OR. AT( "<", cOldLine ) > 0 .OR. AT( "_", cOldLine ) > 0
+ lArgBold := .T.
+ cOldLine := STRTRAN( cOldLine, "<", "<" )
+ cOldLine := STRTRAN( cOldLine, ">", ">" )
+
+ ENDIF
+ IF lArgBold
+ cReturn := ' ' + cOldLine + ' ' + cReturn + ' '
+ ELSE
+ cReturn := ' ' + cOldLine + ' ' + cReturn + ' '
+ ENDIF
+
+ cbuffer := cReturn
+ ENDIF
+ ELSE
+ cBuffer := FormatChmBuff( cBuffer, cStyle, oChm )
+ ENDIF
+ ENDIF
+ ENDIF
+
+ IF AT( '', cBuffer ) > 0 .AND. AT( '', cBuffer ) > 0
+ cBuffer := STRTRAN( cBuffer, '', '' )
+ cBuffer := STRTRAN( cBuffer, '', ' ' )
+ nColorPos := AT( ' 0
+ checkChmcolor( @cbuffer, ncolorpos )
+ ENDIF
+ // Alltrim(cBuffer)
+ IF cStyle == "Description" .OR. cStyle == "Compliance"
+ nIdentLevel := 6
+ nPos := 0
+ IF AT( '', cBuffer ) > 0
+ cBuffer := STRTRAN( cBuffer, "", "" )
+ ENDIF
+ IF !EMPTY( cBuffer )
+ // cBuffer:=SUBSTR(cBuffer,2)
+ cBuffeR := ALLTRIM( cBuffer )
+ oChm:WritePar( cBuffer )
+ ENDIF
+
+ ELSEIF cStyle == "Arguments"
+
+ IF AT( '', cBuffer ) > 0
+ cBuffer := STRTRAN( cBuffer, "", "" )
+ ENDIF
+ IF !EMPTY( cBuffer )
+ cBuffeR := ALLTRIM( cBuffer )
+ oChm:WritePar( cBuffer )
+ ENDIF
+
+ ELSEIF cStyle == "Syntax"
+ IF AT( '', cBuffer ) > 0
+ cBuffer := STRTRAN( cBuffer, "", "" )
+ cBuffer := STRTRAN( cBuffer, "", "" )
+ ENDIF
+ IF !EMPTY( cBuffer )
+ // cBuffer:=SUBSTR(cBuffer,2)
+ cBuffeR := ALLTRIM( cBuffer )
+ oChm:WritePar( cBuffer )
+ ENDIF
+
+ ELSEIF cStyle == "Default"
+ IF AT( '', cBuffer ) > 0
+ cBuffer := STRTRAN( cBuffer, "", "" )
+ ENDIF
+ IF !EMPTY( cBuffer )
+ // cBuffer:=SUBSTR(cBuffer,2)
+ cBuffeR := ALLTRIM( cBuffer )
+ oChm:WritePar( cBuffer )
+ ENDIF
+
+ ENDIF
+ ENDIF
+ IF AT( '', cBuffer ) > 0 .OR. cStyle = "Example"
+ IF AT( '', cBuffer ) = 0 .OR. !EMPTY( cBuffer )
+ cBuffer := STRTRAN( cBuffer, "", "" )
+ cBuffer := STRTRAN( cBuffer, "", "" )
+
+ oChm:WriteText( "
" )
+ oChm:WritePar( cBuffer )
+ ENDIF
+ DO WHILE !lendFixed
+ cOldLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
+ IF AT( "
", cOldLine ) > 0
+ lendfixed := .t.
+ cOldLine := STRTRAN( cOldLine, "", "" )
+ ENDIF
+ IF AT( DELIM, cOldLine ) = 0
+ cReturn += ALLTRIM( cOldLine ) + ' '
+ ENDIF
+ IF AT( DELIM, cOldLine ) > 0
+ FT_FSKIP( - 1 )
+ lEndfixed := .t.
+
+ ENDIF
+ IF AT( DELIM, cOldLine ) == 0
+ oChm:WritePar( cOldLine )
+ ENDIF
+ ENDDO
+ oChm:WriteText( "
" )
+ END
+ IF AT( '', cBuffer ) > 0
+ DO WHILE !lendTable
+ cLine := TRIM( SUBSTR( ReadLN( @lEof ), nCommentLen ) )
+ IF AT( "
", cLine ) > 0
+ lendTable := .t.
+ ELSE
+ IF LFstTableItem
+ nNumTableItems := GetNumberofTableItems( cLine )
+ procChmtable( cline, nNumTableItems )
+ LFstTableItem := .f.
+ ELSE
+ procChmtable( cline, nNumTableItems )
+ ENDIF
+
+ ENDIF
+ ENDDO
+
+ IF lEndTable
+ GenChmTable( oChm )
+ LFstTableItem := .T.
+ ENDIF
+ ENDIF
+RETURN nil
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function ProcChmTable()
+*+
+*+ Called from ( genChm.prg ) 2 - function procChmdesc()
+*+ ( genChm1.prg ) 1 - function procChmdesc()
+*+ ( genChm2.prg ) 1 - function procChmdesc()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION ProcChmTable( cBuffer, nNum )
+
+ LOCAL nPos
+ LOCAL cItem
+ LOCAL cItem2
+ LOCAL cItem3
+ LOCAL nColorpos
+ LOCAL cColor
+ LOCAL cItem4
+
+ cBuffer := ALLTRIM( cBuffer )
+ IF AT( " 0
+ nColorPos := AT( ":", cBuffer )
+ cColor := SUBSTR( cBuffer, nColorpos + 1 )
+ nPos := AT( ">", ccolor )
+ cColor := SUBSTR( ccolor, 1, nPos - 1 )
+
+ cBuffer := STRTRAN( cbuffer, "", "" )
+ cBuffer := STRTRAN( cbuffer, "", "" )
+ cBuffer := STRTRAN( cBuffer, ccolor, '' )
+ nColorpos := ASCAN( aColorTable, { | x, y | UPPER( x ) == UPPER( ccolor ) } )
+ cColor := aColortable[ nColorPos ]
+ ENDIF
+ IF EMPTY( cBuffer )
+ citem := ''
+ citem2 := ''
+ citem3 := ''
+ citem4 := ''
+ ELSE
+ cBuffer := STRTRAN( cBuffer, "<", "<" )
+ cBuffer := STRTRAN( cBuffer, ">", ">" )
+
+ cItem := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
+ cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem, "" ) )
+ IF nNum == 2
+ cItem2 := SUBSTR( cBuffer, 1 )
+ ELSE
+ cItem2 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
+ cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem2, "" ) )
+ ENDIF
+
+ IF nNum == 3
+ cItem3 := SUBSTR( cBuffer, 1 )
+ ELSEIF nNum > 3
+ cItem3 := SUBSTR( cBuffer, 1, AT( SPACE( 3 ), cBuffer ) - 1 )
+ cBuffer := ALLTRIM( STRTRAN( cBuffer, cItem3, "" ) )
+ cItem4 := SUBSTR( cBuffer, 1 )
+ ENDIF
+ ENDIF
+ IF cColor <> NIL
+ AADD( afiTable, "" + RTRIM( LTRIM( cItem ) ) + '' )
+ AADD( asiTable, "" + cItem2 + '' )
+ ELSE
+ AADD( afiTable, RTRIM( LTRIM( cItem ) ) )
+ AADD( asiTable, cItem2 )
+ ENDIF
+
+ IF cColor <> NIL
+ AADD( atiTable, "" + cItem3 + '' )
+ ELSE
+ AADD( atiTable, cItem3 )
+ ENDIF
+ IF cColor <> NIL
+ AADD( afoiTable, "" + cItem4 + '' )
+ ELSE
+ AADD( afoiTable, cItem4 )
+ ENDIF
+
+RETURN Nil
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Function GenChmTable()
+*+
+*+ Called from ( genChm.prg ) 1 - function procChmdesc()
+*+ ( genChm1.prg ) 1 - function procChmdesc()
+*+ ( genChm2.prg ) 1 - function procChmdesc()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+FUNCTION GenChmTable( oChm )
+
+ LOCAL x
+/* oChm:WriteText( "
" )
+ oChm:WriteText( "
" )*/
+ oChm:WriteText( '' ) //-4
+
+ FOR x := 1 TO LEN( asitable )
+ IF !EMPTY( asitable[ x ] )
+ IF nNumTableItems == 2
+ oChm:WriteText( '| ' + afitable[ x ] + ' | ' + asitable[ x ] + ' |
' )
+ ELSEIF nNumTableItems == 3
+ oChm:WriteText( '| ' + afitable[ x ] + ' | ' + asitable[ x ] + ' | ' + atitable[ x ] + ' |
' )
+ ELSEIF nNumTableItems == 4
+ oChm:WriteText( '| ' + afitable[ x ] + ' | ' + asitable[ x ] + ' | ' + atitable[ x ] + ' | ' + afoitable[ x ] + ' |
' )
+ ENDIF
+ ELSE
+ oChm:WriteText( ' |
' )
+ ENDIF
+ NEXT
+
+ oChm:Writetext( "
" )
+
+ oChm:WriteText( "
" )
+ afiTable := {}
+ asitable := {}
+ atitable := {}
+ afoitable := {}
+
+RETURN Nil
+
+*+ EOF: GENChm.PRG
+STATIC FUNCTION ReadFromTop( nh )
+
+ LOCAL cDoc := DELIM + "DOC" + DELIM // DOC keyword
+ LOCAL cEnd := DELIM + "END" + DELIM // END keyword
+ LOCAL cClassDoc := DELIM + "CLASSDOC" + DELIM
+ LOCAL cBuffer := ''
+ LOCAL NPOS := 0
+ LOCAL nlenpos
+ LOCAL aLocDoc := {}
+ DO WHILE FREADline( nH, @cBuffer, 4096 )
+ cBuffer := TRIM( SUBSTR( cBuffer, nCommentLen ) )
+ AADD( Alocdoc, CbUFFER )
+ IF AT( cEnd, cBuffer ) > 0
+ AADD( aCurdoc, aLocdoc )
+ aLocDoc := {}
+ ENDIF
+
+ ENDDO
+ lEof := .F.
+ FT_FGOTOP()
+RETURN nil
+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+*+ Static Function GetItem()
+*+
+*+ Called from ( genng.prg ) 20 - function processing()
+*+
+*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
+*+
+STATIC FUNCTION GetItem( cItem, nCurdoc )
+
+ LOCAL nPos
+ LOCAL cCuritem
+ LOCAL lReturn
+ LOCAL x
+ LOCAL xPos
+ xPos := aCurdoc[ nCurdoc ]
+ nPos := ASCAN( xPos, { | x, y | UPPER( ALLTRIM( x ) ) == UPPER( ALLTRIM( cItem ) ) } )
+ IF nPos > 0
+ cCuritem := xPos[ nPos ]
+ IF AT( "$", xPos[ nPos + 1 ] ) > 0
+ lReturn := .f.
+ ELSE
+ lReturn := .t.
+ ENDIF
+
+ ENDIF
+RETURN lReturn
+
+*+ EOF: GENNG.PRG
diff --git a/harbour/utils/hbdoc/hbdoc.prg b/harbour/utils/hbdoc/hbdoc.prg
index ab02561a8f..39433bcf00 100644
--- a/harbour/utils/hbdoc/hbdoc.prg
+++ b/harbour/utils/hbdoc/hbdoc.prg
@@ -120,6 +120,7 @@ MEMVAR lRtf
MEMVAR lNgi
MEMVAR lOs2
MEMVAR lWww
+MEMVAR lChm
MEMVAR lNorton
MEMVAR aWWW
MEMVAR lTroff
@@ -148,6 +149,7 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
LOCAL cCompiler // Compiler type
LOCAL oHtm
LOCAL oHtm1
+ LOCAL nPos
LOCAL ppp
LOCAL aMetaContents:={}
PUBLIC theHandle
@@ -162,6 +164,7 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
PUBLIC lNgi := .F.
PUBLIC lOs2 := .F.
PUBLIC lWww := .F.
+ PUBLIC lChm := .F.
PUBLIC lNorton := .F.
PUBLIC aWWW := {}
PUBLIC lTroff := .f.
@@ -196,6 +199,8 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
lRtf := .T.
ELSEIF cFlags = "HTM"
lWww := .T.
+ ELSEIF cFlags = "CHM"
+ lChm := .T.
ELSEIF cFlags = "TRF"
lTroff := .t.
ELSEIF cFlags = "DOC"
@@ -225,6 +230,7 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
? " /rtf Winhelp source code for Windows"
? " /os2 OS/2 help source code For OS/2"
? " /htm Generate HTML output"
+ ? " /chm Generate HTML source files for Windows .CHM Help files"
? " /trf Gerenate Linux TROFF code"
? " /doc Create continuous ASCII file w/o author information"
? " "
@@ -249,8 +255,9 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
CLEAR SCREEN
SET CURSOR OFF
ReadLinkFile( cLinkName )
+ if lNgi
cCompiler := fill_Link_info( cLinkName )
-
+ endif
// See if ngi subdirectory is present
IF lNorton
IF EMPTY( DIRECTORY( "hdf.*", "D" ) )
@@ -264,6 +271,11 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
IF EMPTY( DIRECTORY( "htm.*", "D" ) )
FT_MKDIR( "htm" )
ENDIF
+ ELSEIF lChm
+ IF EMPTY( DIRECTORY( "chm.*", "D" ) )
+ FT_MKDIR( "chm" )
+ ENDIF
+
ELSEIF lNgi
IF EMPTY( DIRECTORY( "ngi.*", "D" ) )
FT_MKDIR( "ngi" )
@@ -300,6 +312,8 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
ProcessRtf()
ELSEIF lWww
ProcessWww()
+ ELSEIF lChm
+ ProcessChm()
ELSEIF lNgi
ProcessiNg()
ELSEIF lTroff
@@ -326,6 +340,8 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
ProcessRtf()
ELSEIF lWww
ProcessWww()
+ ELSEIF lChm
+ ProcessChm()
ELSEIF lNgi
ProcessiNg()
ELSEIF lTroff
@@ -356,7 +372,7 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
ELSEIF lRTF
@ INFILELINE, 30 SAY "Assembling " + IIF( lAscii, "documentation", "WINHELP" ) ;
+ " input files"
- ELSEIF lWww
+ ELSEIF lWww .or. lChm
@ INFILELINE, 30 SAY "Assembling " + IIF( lAscii, "documentation", "Html" ) ;
+ " input files"
ELSEIF lNgi
@@ -421,12 +437,12 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
FWRITE( nHpj, 'TITLE='+cTitle + CRLF )
FWRITE( nHpj, 'COPYRIGHT=Harbour (C) http://www.harbour-project.org' + CRLF )
FWRITE( nHpj, 'HLP=.\'+ lower(substr(cLinkName,1,AT(".",cLinkName)-1)) +".hlp"+ CRLF )
- FWRITE( nHpj, 'ROOT=' + CURDIR() + "\RTF" + CRLF )
+ FWRITE( nHpj, 'ROOT=\' + CURDIR() + "\RTF" + CRLF )
FWRITE( nHpj, 'CNT=.\Harbour.cnt' + CRLF )
FWRITE( nHpj, '[FILES]' + CRLF )
FWRITE( nHpj, "harbour.rtf" + CRLF )
FWRITE( nHpj, '[CONFIG]' + CRLF + 'contents()' + CRLF + 'prev()' + CRLF + 'next()' + CRLF + 'BrowseButtons()' + CRLF )
- FWRITE( nHpj, '[WINDOWS]' + CRLF + 'Commands="Harbour Commands",(653,102,360,600),20736,(r14876671),(r12632256),f3' + CRLF + 'Error="Harbour Run Time Errors",(653,102,360,600),20736,(r14876671),(r12632256),f3' + CRLF + 'Tools="Harbour Tools",(653,102,360,600),20736,(r14876671),(r12632256),f3' + CRLF + 'Class="Harbour OOP Commands",(653,102,360,600),20736,(r14876671),(r12632256),f3' + CRLF + 'Funca="Harbour Run Time Functions A-M",(653,102,360,600),20736,(r14876671),(r12632256),f3' + CRLF + 'Funcn="Harbour Run Time Functions N-_",(653,102,360,600),20736,(r14876671),(r12632256),f3' + CRLF + 'Main="HARBOUR",(117,100,894,873),60672,(r14876671),(r12632256),f3' + CRLF )
+ FWRITE( nHpj, '[WINDOWS]' + CRLF + 'Commands="Harbour Commands",(653,102,360,600),20736,(r14876671),(r12632256),f2' + CRLF + 'Error="Harbour Run Time Errors",(653,102,360,600),20736,(r14876671),(r12632256),f2' + CRLF + 'Tools="Harbour Tools",(653,102,360,600),20736,(r14876671),(r12632256),f2' + CRLF + 'Class="Harbour OOP Commands",(653,102,360,600),20736,(r14876671),(r12632256),f2' + CRLF + 'Funca="Harbour Run Time Functions A-M",(653,102,360,600),20736,(r14876671),(r12632256),f2' + CRLF + 'Funcn="Harbour Run Time Functions N-_",(653,102,360,600),20736,(r14876671),(r12632256),f2' + CRLF + 'Main="HARBOUR",(117,100,894,873),60672,(r14876671),(r12632256),f2' + CRLF )
FCLOSE( nHpj )
ELSEIF lWWW
@@ -543,6 +559,26 @@ FUNCTION MAIN( cFlags, cLinkName, cAtFile )
oHtm:WriteText( "" )
*/
oHtm:Close()
+ ELSEIF lChm
+ nHpj := FCREATE( 'chm\'+lower(substr(cLinkName,1,AT(".",cLinkName)-1)) +".hhp" )
+
+ FWRITE( nHpj, '[OPTIONS]' + CRLF )
+ FWRITE( nHpj, 'Compatibility=1.1 or later'+CRLF)
+ FWRITE( nHpj, 'Language=0x416 Português (brasileiro)' + CRLF )
+ FWRITE( nHpj, 'compiled file=.\'+ lower(substr(cLinkName,1,AT(".",cLinkName)-1)) +".chm"+ CRLF )
+ FWRITE( nHpj, 'Display compile progress=No'+CRLF)
+ nPos:=aScan(awww,{|x| Upper(x[1])="OVERVIEW"})
+ if nPos > 0
+ FWRITE( nHpj,'Default topic='+awww[npos,2]+CRLF)
+ Else
+ FWRITE( nHpj,'Default topic='+awww[1,2]+CRLF)
+ Endif
+ FWRITE( nHpj, '[FILES]' + CRLF )
+ For nPos:=1 to len(aWww)
+ FWRITE( nHpj, lower(awww[npos,2])+".htm" + CRLF )
+ Next
+ FCLOSE( nHpj )
+
ELSEIF lNgi
SET ALTERNATE TO "assembl.bat" ADDITIVE
SET ALTERNATE ON
diff --git a/harbour/utils/hbdoc/html.prg b/harbour/utils/hbdoc/html.prg
index 6e5a23fd2e..11dd66d1cd 100644
--- a/harbour/utils/hbdoc/html.prg
+++ b/harbour/utils/hbdoc/html.prg
@@ -4,7 +4,8 @@
/*
* Harbour Project source code:
- * HTML Support Code For FT_HELPC
+ * HTML Support Code For HBDOC
+ * HTML .CMH support code for HBDOC
*
* Copyright 2000 Luiz Rafael Culik
* www - http://www.harbour-project.org
@@ -56,7 +57,12 @@ CLASS THTML
METHOD WriteText( cText )
METHOD WriteMetaTag(cTag,cDescription)
METHOD CLOSE()
-
+ // The Follow methods is for html source files for .CHM help
+ METHOD NewChm( cFile ,aMetaContents,cFuncName)
+ METHOD ADDoBJECT(cType,cClassid)
+ METHOD ADDPARAM(cName,cValue)
+ METHOD EndOBJect()
+ METHOD NewContent(cFile)
ENDCLASS
METHOD New( cFile,aMetaContents ) CLASS THTML
@@ -84,7 +90,7 @@ RETURN Self
METHOD WriteTitle( cTitle ) CLASS THTML
- FWRITE( Self:nHandle, "" + CRLF + cTitle + CRLF + "" + CRLF + '' + CRLF + '' + CRLF )
+ FWRITE( Self:nHandle, "" + CRLF + cTitle + CRLF + "" + CRLF + '' + CRLF )
RETURN Self
@@ -156,4 +162,60 @@ METHOD WriteMetaTag(cTag,cDescription) Class THtml
fWrite(Self:nHandle,''+CRLF)
return Self
+/////////////////////Method for .CHM html source files support////////////////
+METHOD NewChm( cFile ,aMetaContents,cFuncName) CLASS THTML
+
+ Local nCount
+ ? Valtype(aMetaContents)
+ IF Nx > 0
+ FCLOSE( NX )
+ ENDIF
+
+ IF VALTYPE( cFile ) <> NIL .AND. VALTYPE( cFile ) == "C"
+ Self:cFile := LOWER( cFile )
+ Self:nHandle := FCREATE( Self:cFile )
+ ENDIF
+ nX := Self:nHandle
+ FWRITE( Self:nHandle, "" + CRLF +"" +CRLF)
+ if Valtype(aMetaContents) <> NIL .and. Valtype(aMetaContents)=="A"
+ For nCount:=1 to len(aMetaContents)
+ Self:WriteMetaTag(aMetaContents[nCount,1],aMetaContents[nCount,2])
+ NEXT
+ Endif
+ ::WriteTitle(cFuncName)
+
+ FWRITE( Self:nHandle, '' + CRLF )
+ ::AddObject("application/x-oleobject","clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e")
+ ::ADDPARAM("Keyword",cFuncName)
+ ::ENDOBJECT()
+RETURN Self
+
+method ADDOBJECT(cType,cClassId) Class THTML
+ IF VALTYPE(cClassId)<>NIL
+ FWRITE( Self:nHandle,'