/*
* $Id$
*/
/*
* Harbour Project source code:
* GENHTM 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, or (at your option)
* any later version.
*
* 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 software; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, MA 02111-1307 USA (or visit the web site http://www.gnu.org/).
*
* As a special exception, the Harbour Project gives permission for
* additional uses of the text contained in its release of Harbour.
*
* The exception is that, if you link the Harbour libraries 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 Harbour library code into it.
*
* This exception does not however invalidate any other reasons why
* the executable file might be covered by the GNU General Public License.
*
* This exception applies only to the code released by the Harbour
* Project under the name Harbour. If you copy code from other
* Harbour Project or Free Software Foundation releases into a copy of
* Harbour, as the General Public License permits, the exception does
* not apply to the code that you add in this way. To avoid misleading
* anyone as to the status of such modified files, you must delete
* this exception notice from them.
*
* If you write modifications of your own for Harbour, it is your choice
* whether to permit this exception to apply to your modifications.
* If you do not wish that, delete this exception notice.
*
*/
#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, aDocwwwInfo
MEMVAR aWww,aResult
STATIC aAlso
STATIC aFiTable := {}
STATIC aSiTable := {}
STATIC lIsTable := .F.
STATIC nCommentLen
STATIC lEof
STATIC aFoiTable := {}
STATIC atiTable := {}
STATIC nNumTableItems := 0
STATIC aCurDoc := {} // x
static cLastText := ""
Static clastBuffer := ""
STATIC nCurDoc := 1
STATIC lWasTestExamples := .f.
STATIC aColorTable := { 'aqua', 'black', 'fuchia', 'grey', 'green', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow' }
// Static variables added for the htm2 addition
STATIC cDocType := ""
STATIC nArrayItem := 1 // Index used to loop through the array of the array
STATIC nArrayItemLine := 1 // Index used to loop through the items in the array of the array
STATIC oHtmClass
STATIC oHtmClassContent
STATIC cFileName := "" // Stores filenames of files that will be created
STATIC cInherits := "" // Stores the inheritance of a class (if known and present)
*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
*+
*+ Function ProcessWww()
*+
*+ Called from ( hbdoc.prg ) 2 - function main()
*+
*+ħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħħ
*+
FUNCTION ProcessWww()
// 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 lBlankLine := .F. // Blank line encountered and sent out
LOCAL lAddBlank := .F. // Need to add a blank line if next line is not blank
LOCAL oHtm
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
LOCAL nDocs:=0
//
// 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 ] )
#ifdef GAUGE
if i == 1
aGauge1:= Gauge():New( 5, 5, 7, MaxCol() - 5)
Endif
#endif
#ifdef GAUGE
aGauge1:Update(i/nFiles, "Current file: "+PAD(aDirList[ i, F_NAME ], 47))
#else
@ 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:"
#endif
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
#ifdef GAUGE
if nDocs == 0
aGauge:= Gauge():New( 8, 5, 10, MaxCol() - 5)
Endif
ReadFromTop( nReadHandle )
nDocs:=CountDocs(aCurDoc)
#else
ReadFromTop( nReadHandle )
#endif
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 ++
/* nDocs:=0*/
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 } )
nPos := ascan(aResult,{|a| UPPER(a) == UPPER(cCategory)})
if nPos==0
if cCategory<>"Document"
aadd(aResult,cCategory)
endif
endif
// Now close down this little piece
IF .NOT. EMPTY( cSeeAlso )
oHtm:WriteParBold( "See Also " )
oHtm:WriteText( "" )
ProcWwwalso( oHtm, cSeealso )
oHtm:WriteText( "
" )
IF lDoc
oHtm:WriteText( "" )
oHtm:Close()
ENDIF
Elseif empty(cSeeAlso)
IF lDoc
oHtm:WriteText( "" )
oHtm:Close()
ENDIF
ENDIF
lDoc := .F.
lClassDoc := .F.
lData := .F.
lMethod := .F.
IF lEndReturns .AND. lClassDoc
lEndReturns := .f.
oHtm:WriteText( "" )
ENDIF
IF lEndArgs .AND. lClassDoc
lEndArgs := .f.
oHtm: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 := ALLTRIM( SUBSTR( cBuffer, nCommentLen ) )
#ifdef GAUGE
aGauge:update(nCurdoc/nDocs,"Current Doc:"+cFuncName )
#else
@ MODULELINE, 33 CLEAR TO MODULELINE, MAXCOL()
@ MODULELINE, 33 SAY cFuncName
#endif
nMode := D_NORMAL
// Open a new file
IF AT( "FT_", cFuncName ) > 0
cTemp := UPPER(SUBSTR( cFuncName, 4 ))
ELSE
cTemp := UPPER(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, 36 )
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 ) = 36
cFileName := STUFF( cFileName, 36, 1, STR( nCount, 1, 0 ) )
ELSE
cFileName += STR( nCount, 1, 0 )
ENDIF
nCount ++
ENDIF
ENDDO
// Add on the extension
cFileName := LEFT( cFileName, 36 ) + ".htm"
IF lDoc
oHtm := THTML():New( 'htm\' + cFileName )
ENDIF
IF lFirstPass .AND. lClassDoc
lFirstPass := .F.
oHtm := THTML():New( 'htm\' + cFileName )
ENDIF
IF ohtm: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 := 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.
if lWasTestExamples
oHtm:WriteText( "" )
else
oHtm:WriteText( "" )
lWasTestExamples:=.f.
endif
ENDIF
ohtm:WriteText( '
' )
ohtm:WriteText( '
' )
ohtm:Writetext( '
' )
ohtm:WriteText( '
' )
ohtm:WriteText( '
' )
oHtm:WriteText( "" )
// 2) Category
ELSEIF AT( cCat, cBuffer ) > 0
cBuffer := ReadLN( @lEof )
nLineCnt ++
// get the category
cCategory := 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
oHtm:WriteText( "DATA " + ALLTRIM( cFuncName ) + "
" )
oHtm:WriteText( "" + cOneline + "
" + hb_osnewline() )
ELSEIF lMethod
oHtm:WriteText( ""+ LEFT( cFileName, AT( ".", cFileName ) - 1 )+ ":" + ALLTRIM( cFuncName ) + "
" )
oHtm:WriteText( "" + cOneline + "
" + hb_osnewline() )
ELSE
oHtm:WriteText( "" + ALLTRIM( cFuncName ) + "
" )
AADD( aWWW, { cFuncName, LEFT( cFileName, AT( ".", cFileName ) - 1 ) } )
oHtm:WriteText( "" + cOneline + "
" + hb_osnewline() )
ENDIF
lFirstSintax := .T.
// 4) all other stuff
ELSE
IF AT( cSyn, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
oHtm:WriteParBold( " Syntax", .f., .f. )
ohtm:WriteText( '' )
nMode := D_SYNTAX
lAddBlank := .T.
lEndSyntax := .T.
end
ELSEIF AT( cConstruct, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
oHtm:WriteParBold( " Constructor syntax", .F., .f. )
ohtm:WriteText( '' )
nMode := D_SYNTAX
lAddBlank := .T.
lEndSyntax := .T.
end
ELSEIF AT( cArg, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
oHtm:WriteParBold( " Arguments" )
ohtm:WriteText( '' )
nMode := D_ARG
lAddBlank := .T.
lEndArgs := .t.
end
ELSEIF AT( cRet, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteParBold( " Returns" )
ohtm:WriteText( '' )
nMode := D_ARG
lAddBlank := .T.
lEndReturns := .t.
end
ELSEIF AT( cDesc, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oHtm:WriteText( "
" )
ENDIF
oHtm:WriteParBold( " Description" )
ohtm:WriteText( '' )
nMode := D_DESCRIPTION
lAddBlank := .T.
lEndDesc := .t.
end
ELSEIF AT( cdatalink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lBlankLine
oHtm:writeText("
") //:endpar()
// oHtm:WriteParBold( " Data" )
oHtm:WriteText( "- Data
" )
//oHtm:writeText("
") //:endpar()
endif
nMode := D_DATALINK
// lAddBlank := .T.
lIsDataLink := .T.
END
ELSEIF AT( cDatanolink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lIsDataLink
oHtm:writeText("
") //:endpar()
oHtm:WriteText( "
- Data
" )
// oHtm:writeText("
") //:endpar()
ENDIF
nMode := D_NORMAL
lAddBlank := .T.
END
ELSEIF AT( cMethodslink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
oHtm:writeText("
") //:endpar()
oHtm:WriteParBold( " Method" )
//oHtm:writeText("
") //:endpar()
nMode := D_METHODLINK
lAddBlank := .T.
lIsMethodLink := .T.
END
ELSEIF AT( cMethodsnolink, cBuffer ) > 0
IF GetItem( cBuffer, nCurdoc )
IF !lIsMethodLink
oHtm:writeText("
") //:endpar()
oHtm:WriteParBold( " Methods" )
oHtm:writepar("
") //:endpar()
ENDIF
// oHtm:writeText("
") //:endpar()
nMode := D_NORMAL
lAddBlank := .T.
END
ELSEIF AT( cExam, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteText( "
Examples" )
oHtm:WriteText( "" )
nMode := D_EXAMPLE
lAddBlank := .T.
lAddEndPreTag := .T.
lWasTestExamples:=.t.
end
ELSEIF AT( cTest, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteText( "Tests" )
// oHtm:WriteText( "" )
nMode := D_EXAMPLE
lAddBlank := .T.
lWasTestExamples:= .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
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteParBold( " Compliance" )
oHtm:WriteText( "" )
nMode := D_COMPLIANCE
lAddBlank := .T.
end
ELSEIF AT( cPlat, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteParBold( " Platforms" )
oHtm:WriteText( "" )
nMode := D_NORMAL
lAddBlank := .T.
end
ELSEIF AT( cFiles, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteParBold( " Files" )
oHtm:WriteText( "" )
nMode := D_NORMAL
lAddBlank := .T.
end
ELSEIF AT( cFunction, cBuffer ) > 0
if GetItem( cBuffer, nCurdoc )
IF !lBlankLine
// oHtm:WritePar( "" )
ENDIF
oHtm:WriteParBold( " Functions" )
oHtm: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
prochtmdesc( cbuffer, oHtm, "Syntax" ,cFileName)
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
prochtmdesc( cbuffer, oHtm, "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
oHtm:WriteText( '
' )
lAddBlank := .F.
ENDIF
ProcHtmDesc( cBuffer, oHtm )
ELSEIF nMode = D_EXAMPLE
IF LEN( cBuffer ) > LONGLINE
// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
// LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
prochtmdesc( cBuffer, oHtm, "Example" )
ELSEIF nMode = D_DESCRIPTION
IF LEN( cBuffer ) > LONGLINE
// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
// LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
prochtmdesc( cBuffer, oHtm, "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 ) )
ohtm:WriteText( "" + cBuffer + '' )
ohtm:writetext('
')
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 ) )
if !lBlankline
ohtm:WriteText( "" + cBuffer + '' )
ohtm:writetext('
')
endif
ELSEIF nMode = D_COMPLIANCE
IF LEN( cBuffer ) > LONGLINE
// WRITE_ERROR( "General", cBuffer, nLineCnt, ;
// LONGLINE, aDirList[ i, F_NAME ] )
ENDIF
lBlankLine := EMPTY( cBuffer )
prochtmdesc( cBuffer, oHtm, "Compliance" )
ELSEIF nMode = D_STATUS
IF !EMPTY( cBuffer )
If lWasTestExamples
oHtm:WriteParBold( "Status",.t.,.f. )
Else
oHtm:WriteParBold( "Status" )
oHtm:WriteText( "" )
Endif
lWasTestExamples:=.f.
ENDIF
ProcStatusWww( oHtm, 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( oHtm ) == "O"
oHtm:WriteText( '' )
oHtm:Close()
ENDIF
ENDIF
ENDDO
// Close down the input file
FT_FUSE()
nDocs:=0
IF lClassDoc
oHtm:Close()
ENDIF
nCurDoc := 1
aCurDoc := {}
NEXT
RETURN nil
FUNCTION ProcessWww2()
LOCAL aTempArray := {} // Temporary array used for storing list of methods and properties
LOCAL cTempString // Temporary string used for storing random strings
LOCAL cTempString2 // Temporary string used for storing random strings
LOCAL nClassNamePos // Stores the position in the array where the classname can be found
LOCAL nFunctionNamePos // Stores the position in the array where the functionname can be found
LOCAL nReadHandle // Stores the text file's workarea
LOCAL nSubArrayItem := 1 // Index used to loop through the items of the array of the array
LOCAL nTemp1 := 1 // Used to scroll through the DirList array
LOCAL nTemp2 := 1 // Used to scroll through the aFunctionItems array
LOCAL nPropertyListAnker // Used to add an html-anker in the page
LOCAL nMethodListAnker // Used to add an html-anker in the page
LOCAL aFunctionItems := {{"Category", "Category"}, {"Syntax", "Syntax"}, {"Arguments", "Arguments"}, ;
+ {"Returns", "Returns"}, {"Description", "Description"}, {"Examples", "Examples"}, {"Tests", "Tests"}, ;
+ {"Status", "Status"}, {"Compliance", "Compliance"}, {"Platforms", "Platforms"}, {"Files", "Files"}, ;
+ {"Seealso", "See also"}}
LOCAL cTemp
LOCAL nEnd
LOCAL j
LOCAL nCount
LOCAL cChar
FOR nTemp1 := 1 TO LEN(aDirList)
// Calculate the amount of characters the source files uses each line
nCommentLen := IIF(AT(".ASM", UPPER(aDirList[nTemp1, F_NAME])) > 0, 2, 4)
// Select the file to read from
nReadHandle := FT_FUSE(aDirList[nTemp1, F_NAME])
IF nReadHandle < 0
WRITE_ERROR("Can't open file: (Dos Error " + STR( FERROR() ) + ")",,,, aDirList[ nTemp1, F_NAME ])
@ ERRORLINE, 0 CLEAR TO ERRORLINE, MAXCOL()
@ ERRORLINE, 20 SAY "Can't open file: (Dos Error " + STR( FERROR() ) + ") File=" + aDirList[ nTemp1, F_NAME ]
LOOP
ENDIF
// Read the entire file into the aCurDoc array
ReadFromTop2(nReadHandle)
// Generate a new document, based on the name of the class or function
// Check if the file contains a class or function definition
IF LEN(aCurDoc) > 0 .AND. nArrayItem <= LEN(aCurDoc)
IF ASCAN(aCurDoc[nArrayItem], " $CLASSDOC$") > 0
cDocType := "Class"
nClassNamePos := ASCAN(aCurDoc[nArrayItem], " $CLASS$", ASCAN(aCurDoc[nArrayItem], " $CLASSDOC$") + 1) + 1
cFileName := aCurDoc[nArrayItem][nClassNamePos]
ELSEIF ASCAN(aCurDoc[nArrayItem], " $DOC$") > 0
cDocType := "Function"
nFunctionNamePos := ASCAN(aCurDoc[nArrayItem], " $FUNCNAME$") + 1
cFileName := aCurDoc[nArrayItem][nFunctionNamePos]
ELSE
LOOP
ENDIF
// Check whether the function name has "FT_" in it, if so, ignore the first three characters
IF AT("FT_", cFileName) > 0
cTemp := UPPER(SUBSTR(cFileName, 4))
ELSE
cTemp := UPPER(cFileName)
ENDIF
// Check whether the function name has "(" in it, if so, ignore it + the following chars
IF (nEnd := AT("(", cTemp)) > 0
cTemp := LEFT(cTemp, nEnd - 1)
ENDIF
// Strip off any other non-alphabetical or -numeric characters
cFileName := ""
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
// Check whether the file name already exists, if so, modify the name
cFileName := LEFT(cFileName, 36)
nEnd := 1
nCount := 0
DO WHILE nEnd > 0
nEnd := ASCAN(aDocInfo, { | a | a[ 2 ] == cFileName + ".htm" })
IF nEnd > 0
IF LEN( cFileName ) = 36
cFileName := STUFF( cFileName, 36, 1, STR( nCount, 1, 0 ) )
ELSE
cFileName = cFileName + STR( nCount, 1, 0 )
ENDIF
nCount ++
ENDIF
ENDDO
// Add the file extension
cFileName := LEFT( cFileName, 36 ) + ".htm"
oHtmClass := THTML():New( 'htm\' + cFileName )
// If file creation was successful
IF oHtmClass:nHandle > 0
// Add a title to the HTML
nPropertyListAnker := .F.
nMethodListAnker := .F.
oHtmClass:WriteText("Harbour - Reference Guide")
// Add CSS to the HTML
oHtmClass:WriteText("")
// Loop through the first array (list with arrays)
DO WHILE nArrayItem <= LEN(aCurDoc)
nSubArrayItem := 1
IF cDocType = "Class"
// Loop through the second array (list with methods, properties, ...)
IF ASCAN(aCurDoc[nArrayItem], " $CLASS$") > 0
// Write class name
nArrayItemLine = ASCAN(aCurDoc[nArrayItem], {|a| "CLASS" $ UPPER(a)}, 2) + 1
cTempString := HTMFormat(aCurDoc[nArrayItem][nArrayItemLine])
DO WHILE "$" $ aCurDoc[nArrayItem][nArrayItemLine + 1] = .F.
nArrayItemLine ++
cTempString = cTempString + "
" + HTMFormat(aCurDoc[nArrayItem][nArrayItemLine])
ENDDO
oHtmClass:WriteText("Class " + cTempString + "
")
// Add classname and filename to the docinfo array
AADD( aDocInfo, { cTempString, cFileName, "C1" } )
// Write oneliner
nArrayItemLine = ASCAN(aCurDoc[nArrayItem], {|a| "ONELINER" $ UPPER(a)}) + 1
cTempString := HTMFormat(aCurDoc[nArrayItem][nArrayItemLine])
DO WHILE "$" $ aCurDoc[nArrayItem][nArrayItemLine + 1] = .F.
nArrayItemLine ++
cTempString = cTempString + "
" + HTMFormat(aCurDoc[nArrayItem][nArrayItemLine])
ENDDO
oHtmClass:WriteText("" + cTempString + "
")
// Write inheritance
nArrayItemLine = ASCAN(aCurDoc[nArrayItem], {|a| "INHERITS" $ UPPER(a)}) + 1
IF nArrayItemLine - 1 <> 0 .AND. !EMPTY(aCurDoc[nArrayItem][nArrayItemLine]) //.AND. FILE(aCurDoc[nArrayItem][nArrayItemLine] + ".txt")
cInherits := aCurDoc[nArrayItem][nArrayItemLine]
cTempString := "" + HTMFormat(aCurDoc[nArrayItem][nArrayItemLine]) + ""
ELSE
cTempString := "-"
ENDIF
oHtmClass:WriteText("» " + "Inherits" + "
")
oHtmClass:WriteText("" + cTempString + "
")
WriteClass("Constructor", "Constructor")
WriteClass("Syntax", "Syntax")
WriteClass("Arguments", "Arguments")
WriteClass("Returns", "Returns")
WriteClassDataMethod("Method", "Methods", nArrayItem, nArrayItemLine)
WriteClassDataMethod("Data", "Properties", nArrayItem, nArrayItemLine)
WriteClass("Category", "Category")
WriteClass("Description", "Description")
WriteClass("Seealso", "See also")
oHtmClass:WriteText("