From 5bbb1a224cb9e83db1ffde554dba3fef4c4ccdd3 Mon Sep 17 00:00:00 2001 From: Luiz Rafael Culik Date: Sun, 4 Jun 2000 12:24:05 +0000 Subject: [PATCH] See changelog 20000604-09:20 GMT -3 --- harbour/utils/hbdoc/genchm.prg | 1318 ++++++++++++++++++++++++++++++++ harbour/utils/hbdoc/hbdoc.prg | 44 +- harbour/utils/hbdoc/html.prg | 68 +- 3 files changed, 1423 insertions(+), 7 deletions(-) create mode 100644 harbour/utils/hbdoc/genchm.prg 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( "" ) + 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( ' ' ) + ELSEIF nNumTableItems == 3 + oChm:WriteText( ' ' ) + ELSEIF nNumTableItems == 4 + oChm:WriteText( ' ' ) + ENDIF + ELSE + oChm:WriteText( ' ' ) + ENDIF + NEXT + + oChm:Writetext( "
' + afitable[ x ] + '' + asitable[ x ] + '
' + afitable[ x ] + '' + asitable[ x ] + '' + atitable[ x ] + '
' + afitable[ x ] + '' + asitable[ x ] + '' + atitable[ x ] + '' + afoitable[ x ] + '
" ) + + 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,''+CRLF) + ELSE + FWRITE( Self:nHandle,''+CRLF) + ENDIF +RETURN Self +METHOD ENDOBJECT() Class THTML + FWRITE( Self:nHandle,""+CRLF) +RETURN Self +METHOD ADDPARAM(cType,cValue) Class THTML + FWRITE( Self:nHandle,'' +CRLF) +RETURN Self + +METHOD NewContent( cFile ) CLASS THTML + + Local nCount + 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 ) +RETURN Self *+ EOF: HTML.PRG