2010-07-12 18:44 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* include/hbextern.ch
* src/rtl/Makefile
+ src/rtl/hbdoc.prg
+ Added __HBDOC_LOADDIR() internal RTL function to read
NFDOC formatted documentation source directories into
memory. The result will be a list of hashes which contain
the raw content of doc files. The function does format
validation (but not content) and add all agreed-on metadata
to the hashes.
It's a start and I hope others can join to create new
layers of function for below functionality:
- doc content validation
- pre-formatting
- output generators
The goal is to avoid local solutions and standardize
the format.
+ tests/hbdoctst.prg
+ Added small test app which will find and parse all
documentation inside the Harbour source tree and
save them in .hbd (serialized doc hash) format.
Such .hdb files can be generated by the build process
in the future, so tools like HBIDE can use the content
to display intellisense or built-in help.
; TODO: HBQT doc/html should be removed as it's
hbdoc tools' job to convert HBDOC source
format to html or whatever else format needed.
* harbour.spec
* debian/rules
- doc/man
+ src/pp/hbpp.1
+ src/main/harbour.1
+ utils/hbmk2/hbmk2.1
+ utils/hbtest/hbtest.1
+ utils/hbrun/hbrun.1
* Moved man doc files to their own component dirs.
* doc/Makefile
* doc/en/Makefile
+ doc/clipper.txt
- doc/en/clipper.txt
* Moved non-NFDOC formatted doc file to doc dir.
* doc/en/Makefile
! Fixed missing 1stread.txt
* doc/en/hb_apigt.txt
* doc/en/hbinet.txt
* doc/en/tbrowse.txt
* doc/en/hb_apifs.txt
! Fixed NFDOC non-standard entries.
* bin/hbxpatch.hbs
! Fixed detecting dirs. (could cause errors only in rare cases)
* contrib/hbdoc2/tmplates.prg
* Formatting.
This commit is contained in:
@@ -16,6 +16,66 @@
|
||||
The license applies to all entries newer than 2009-04-28.
|
||||
*/
|
||||
|
||||
2010-07-12 18:44 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* include/hbextern.ch
|
||||
* src/rtl/Makefile
|
||||
+ src/rtl/hbdoc.prg
|
||||
+ Added __HBDOC_LOADDIR() internal RTL function to read
|
||||
NFDOC formatted documentation source directories into
|
||||
memory. The result will be a list of hashes which contain
|
||||
the raw content of doc files. The function does format
|
||||
validation (but not content) and add all agreed-on metadata
|
||||
to the hashes.
|
||||
It's a start and I hope others can join to create new
|
||||
layers of function for below functionality:
|
||||
- doc content validation
|
||||
- pre-formatting
|
||||
- output generators
|
||||
The goal is to avoid local solutions and standardize
|
||||
the format.
|
||||
|
||||
+ tests/hbdoctst.prg
|
||||
+ Added small test app which will find and parse all
|
||||
documentation inside the Harbour source tree and
|
||||
save them in .hbd (serialized doc hash) format.
|
||||
Such .hdb files can be generated by the build process
|
||||
in the future, so tools like HBIDE can use the content
|
||||
to display intellisense or built-in help.
|
||||
; TODO: HBQT doc/html should be removed as it's
|
||||
hbdoc tools' job to convert HBDOC source
|
||||
format to html or whatever else format needed.
|
||||
|
||||
* harbour.spec
|
||||
* debian/rules
|
||||
- doc/man
|
||||
+ src/pp/hbpp.1
|
||||
+ src/main/harbour.1
|
||||
+ utils/hbmk2/hbmk2.1
|
||||
+ utils/hbtest/hbtest.1
|
||||
+ utils/hbrun/hbrun.1
|
||||
* Moved man doc files to their own component dirs.
|
||||
|
||||
* doc/Makefile
|
||||
* doc/en/Makefile
|
||||
+ doc/clipper.txt
|
||||
- doc/en/clipper.txt
|
||||
* Moved non-NFDOC formatted doc file to doc dir.
|
||||
|
||||
* doc/en/Makefile
|
||||
! Fixed missing 1stread.txt
|
||||
|
||||
* doc/en/hb_apigt.txt
|
||||
* doc/en/hbinet.txt
|
||||
* doc/en/tbrowse.txt
|
||||
* doc/en/hb_apifs.txt
|
||||
! Fixed NFDOC non-standard entries.
|
||||
|
||||
* bin/hbxpatch.hbs
|
||||
! Fixed detecting dirs. (could cause errors only in rare cases)
|
||||
|
||||
* contrib/hbdoc2/tmplates.prg
|
||||
* Formatting.
|
||||
|
||||
2010-07-12 09:06 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
|
||||
* contrib/hbide/idesources.prg
|
||||
! Fixed: "Save As..." had gone disabled with another fix.
|
||||
|
||||
@@ -592,10 +592,10 @@ STATIC FUNCTION WalkAndFind( cTop, cLookFor )
|
||||
cTop += iif( Right( cTop, 1 ) $ "/\", "", hb_ps() )
|
||||
aDir := Directory( cTop + hb_osFileMask(), "D" )
|
||||
|
||||
ASORT( aDir,,, { |aLeft| !( aLeft[ F_ATTR ] $ "D" ) } ) /* Files first */
|
||||
ASORT( aDir,,, { |aLeft| !( "D" $ aLeft[ F_ATTR ] ) } ) /* Files first */
|
||||
|
||||
FOR EACH aDirEntry IN aDir
|
||||
IF !( aDirEntry[ F_ATTR ] == "D" )
|
||||
IF !( "D" $ aDirEntry[ F_ATTR ] )
|
||||
IF aDirEntry[ F_NAME ] == cLookFor
|
||||
cRetVal := cTop
|
||||
EXIT
|
||||
|
||||
@@ -109,16 +109,16 @@ EXPORTED:
|
||||
// this is best viewed with a fixed-width font
|
||||
// the columns of this array correspond to the elements of Fields
|
||||
CLASSDATA Templates AS ARRAY INIT { ;
|
||||
{ "Template" , { S, T, x+U, x, O, x+U, x+U, x+U, x+U, x+U, x+U, x+U, x+U, x+U, x +U, x +U, x+U, x+U, x+U, x+U, x+U, E } }, ;
|
||||
{ "Template" , { S, T, x+U, x, O , x+U, x+U, x+U, x+U, x+U, x+U, x+U, x+U, x+U, x +U, x +U, x+U, x+U, x+U, x+U, x+U, E } }, ;
|
||||
{ "Document" , { S, T, R+U, R, O+U, O+U, x+U, x+U, x+U, R+U, x+U, x+U, x+U, x+U, x +U, x +U, x+U, x+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Function" , { S, T, R+U, R, R, O+U, O+U, O+U, O+U, O+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "C Function" , { S, T, R+U, R, R, O+U, O+U, O+U, O+U, O+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Procedure" , { S, T, R+U, R, R, O+U, O+U, O+U, x, O+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Command" , { S, T, R+U, R, R, O+U, R+U, R+U, x+U, R+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Class" , { S, T, R+U, R, R, O+U, R+U, R+U, R+U, R+U, O+U, O+U, O+U, O+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Class method" , { S, T, R+U, R, R, O+U, R+U, R+U, R+U, R+U, x+U, x+U, x+U, x+U, P+O+U, x +U, x+U, x+U, x+U, x+U, O+U, E } }, ;
|
||||
{ "Class data" , { S, T, R+U, R, R, O+U, R+U, x+U, x+U, R+U, x+U, x+U, x+U, x+U, P+O+U, x +U, x+U, x+U, x+U, x+U, O+U, E } }, ;
|
||||
{ "Run time error", { S, T, R+U, R, x, O+U, x+U, x+U, x+U, R+U, x+U, x+U, x+U, x+U, P+O+U, x +U, x+U, O+U, x+U, x+U, O+U, E } }, ;
|
||||
{ "Function" , { S, T, R+U, R, R , O+U, O+U, O+U, O+U, O+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "C Function" , { S, T, R+U, R, R , O+U, O+U, O+U, O+U, O+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Procedure" , { S, T, R+U, R, R , O+U, O+U, O+U, x, O+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Command" , { S, T, R+U, R, R , O+U, R+U, R+U, x+U, R+U, x+U, x+U, x+U, x+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Class" , { S, T, R+U, R, R , O+U, R+U, R+U, R+U, R+U, O+U, O+U, O+U, O+U, P+O+U, P+O+U, O+U, O+U, O+U, O+U, O+U, E } }, ;
|
||||
{ "Class method" , { S, T, R+U, R, R , O+U, R+U, R+U, R+U, R+U, x+U, x+U, x+U, x+U, P+O+U, x +U, x+U, x+U, x+U, x+U, O+U, E } }, ;
|
||||
{ "Class data" , { S, T, R+U, R, R , O+U, R+U, x+U, x+U, R+U, x+U, x+U, x+U, x+U, P+O+U, x +U, x+U, x+U, x+U, x+U, O+U, E } }, ;
|
||||
{ "Run time error", { S, T, R+U, R, x , O+U, x+U, x+U, x+U, R+U, x+U, x+U, x+U, x+U, P+O+U, x +U, x+U, O+U, x+U, x+U, O+U, E } }, ;
|
||||
}
|
||||
|
||||
#undef S
|
||||
|
||||
@@ -67,7 +67,7 @@ binary-arch: build install
|
||||
dh_installdocs
|
||||
dh_installexamples
|
||||
# dh_install
|
||||
dh_installman doc/man/harbour.1 doc/man/hbmk2.1 doc/man/hbpp.1 doc/man/hbrun.1 doc/man/hbtest.1
|
||||
dh_installman src/main/harbour.1 src/pp/hbpp.1 utils/hbmk2/hbmk2.1 utils/hbrun/hbrun.1 utils/hbtest/hbtest.1
|
||||
dh_link
|
||||
dh_strip
|
||||
dh_compress
|
||||
|
||||
@@ -7,6 +7,7 @@ ROOT := ../
|
||||
DOC_FILES := \
|
||||
c_std.txt \
|
||||
class_tp.txt \
|
||||
clipper.txt \
|
||||
cmdline.txt \
|
||||
cmpopt.txt \
|
||||
codebloc.txt \
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
$Id$
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
This document attempts to describe the features separating Harbour from
|
||||
CA-Cl*pper.
|
||||
@@ -7,10 +7,10 @@ ROOT := ../../
|
||||
DOC_SUBDIR := /en
|
||||
|
||||
DOC_FILES := \
|
||||
1stread.txt \
|
||||
array.txt \
|
||||
binnum.txt \
|
||||
browse.txt \
|
||||
clipper.txt \
|
||||
cmdline.txt \
|
||||
command.txt \
|
||||
compiler.txt \
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
* hb_fsChDir()
|
||||
* $CATEGORY$
|
||||
* C level API
|
||||
* $SUBCATEGORY$
|
||||
* $SUBCATEGORY$
|
||||
* FileSys
|
||||
* $ONELINER$
|
||||
* Change working directory
|
||||
|
||||
@@ -4188,7 +4188,7 @@
|
||||
* hb_mouseSetBounds()
|
||||
* $CATEGORY$
|
||||
* C level API
|
||||
* $SUBCATEGORY$
|
||||
* $SUBCATEGORY$
|
||||
* Terminal
|
||||
* $ONELINER$
|
||||
*
|
||||
|
||||
@@ -283,42 +283,6 @@
|
||||
* $END$
|
||||
*/
|
||||
|
||||
/* $no-DOC$
|
||||
* $TEMPLATE$
|
||||
* Function
|
||||
* $NAME$
|
||||
* HB_INETSTATUSDESC
|
||||
* $CATEGORY$
|
||||
* API
|
||||
* $SUBCATEGORY$
|
||||
* INET
|
||||
* $ONELINER$
|
||||
* ? (note: this function is not active in hbinet.c)
|
||||
* $SYNTAX$
|
||||
* HB_INETSTATUSDESC( )
|
||||
* $ARGUMENTS$
|
||||
* <socket> a socket previously created / opened
|
||||
* $RETURNS$
|
||||
*
|
||||
* $DESCRIPTION$
|
||||
*
|
||||
* $EXAMPLES$
|
||||
*
|
||||
* $TESTS$
|
||||
*
|
||||
* $STATUS$
|
||||
*
|
||||
* $COMPLIANCE$
|
||||
* H
|
||||
* $PLATFORMS$
|
||||
*
|
||||
* $FILES$
|
||||
*
|
||||
* $SEEALSO$
|
||||
*
|
||||
* $END$
|
||||
*/
|
||||
|
||||
/* $DOC$
|
||||
* $TEMPLATE$
|
||||
* Function
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/* $CLASSDOC$
|
||||
/* $DOC$
|
||||
* $TEMPLATE$
|
||||
* Class
|
||||
* $NAME$
|
||||
* TBROWSENew()
|
||||
* $CATEGORY$
|
||||
@@ -186,7 +188,9 @@
|
||||
*/
|
||||
|
||||
|
||||
/* $CLASSDOC$
|
||||
/* $DOC$
|
||||
* $TEMPLATE$
|
||||
* Class
|
||||
* $METHOD$
|
||||
* SetKey()
|
||||
* $CATEGORY$
|
||||
@@ -248,7 +252,9 @@
|
||||
* $END$
|
||||
*/
|
||||
|
||||
/* $CLASSDOC$
|
||||
/* $DOC$
|
||||
* $TEMPLATE$
|
||||
* Class
|
||||
* $METHOD$
|
||||
* Applykey()
|
||||
* $CATEGORY$
|
||||
@@ -282,7 +288,9 @@
|
||||
* $END$
|
||||
*/
|
||||
|
||||
/* $CLASSDOC$
|
||||
/* $DOC$
|
||||
* $TEMPLATE$
|
||||
* Class
|
||||
* $METHOD$
|
||||
* AddColumn()
|
||||
* $CATEGORY$
|
||||
|
||||
@@ -423,7 +423,11 @@ rm -f $HB_INST_PKGPREF$HB_LIB_INSTALL/libpng.a
|
||||
rm -f $HB_INST_PKGPREF$HB_LIB_INSTALL/libsqlite3.a
|
||||
|
||||
mkdir -p $HB_INST_PKGPREF%{_mandir}/man1
|
||||
install -m644 doc/man/*.1* $HB_INST_PKGPREF%{_mandir}/man1/
|
||||
install -m644 src/main/*.1* $HB_INST_PKGPREF%{_mandir}/man1/
|
||||
install -m644 src/pp/*.1* $HB_INST_PKGPREF%{_mandir}/man1/
|
||||
install -m644 utils/hbmk2/*.1* $HB_INST_PKGPREF%{_mandir}/man1/
|
||||
install -m644 utils/hbrun/*.1* $HB_INST_PKGPREF%{_mandir}/man1/
|
||||
install -m644 utils/hbtest/*.1* $HB_INST_PKGPREF%{_mandir}/man1/
|
||||
|
||||
mkdir -p $HB_INST_PKGPREF$HB_ETC_INSTALL
|
||||
install -m644 src/rtl/gtcrs/hb-charmap.def $HB_INST_PKGPREF$HB_ETC_INSTALL/hb-charmap.def
|
||||
|
||||
@@ -550,6 +550,8 @@ EXTERNAL __MVXRELEASE
|
||||
EXTERNAL __EINSTVAR52
|
||||
EXTERNAL __EINSTVAR53
|
||||
|
||||
EXTERNAL __HBDOC_LOADDIR
|
||||
|
||||
/* i18n */
|
||||
EXTERNAL HB_I18N_GETTEXT
|
||||
EXTERNAL HB_I18N_GETTEXT_STRICT
|
||||
|
||||
@@ -222,6 +222,7 @@ PRG_SOURCES := \
|
||||
getsys53.prg \
|
||||
getsyshb.prg \
|
||||
gui.prg \
|
||||
hbdoc.prg \
|
||||
hbi18n2.prg \
|
||||
hbini.prg \
|
||||
input.prg \
|
||||
|
||||
209
harbour/src/rtl/hbdoc.prg
Normal file
209
harbour/src/rtl/hbdoc.prg
Normal file
@@ -0,0 +1,209 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* Harbour Project source code:
|
||||
* NFDOC reader
|
||||
*
|
||||
* Copyright 2010 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* www - http://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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common.ch"
|
||||
#include "directry.ch"
|
||||
|
||||
#define _HBDOC_SRC_SUBDIR "doc"
|
||||
#define _HBDOC_SRC_EXT ".txt"
|
||||
|
||||
#define _HBDOC_ADD_MSG( a, m ) IF ISARRAY( a ); AAdd( a, m ); ENDIF
|
||||
|
||||
FUNCTION __hbdoc_LoadDir( cDir, cName, aErrMsg )
|
||||
LOCAL hMeta
|
||||
LOCAL nCount
|
||||
LOCAL aFile
|
||||
LOCAL aEntry
|
||||
|
||||
IF ISCHARACTER( cDir )
|
||||
|
||||
cDir := DirAddPathSep( cDir )
|
||||
|
||||
IF hb_DirExists( cDir + _HBDOC_SRC_SUBDIR )
|
||||
|
||||
aEntry := {}
|
||||
hMeta := { => }
|
||||
|
||||
IF ISCHARACTER( cName )
|
||||
hMeta[ "_COMPONENT" ] := cName
|
||||
ENDIF
|
||||
|
||||
nCount := 0
|
||||
FOR EACH aFile IN Directory( cDir + _HBDOC_SRC_SUBDIR + hb_ps() + hb_osFileMask(), "D" )
|
||||
IF "D" $ aFile[ F_ATTR ] .AND. ;
|
||||
!( aFile[ F_NAME ] == "." ) .AND. ;
|
||||
!( aFile[ F_NAME ] == ".." )
|
||||
|
||||
__hbdoc__read_langdir( aEntry, cDir + _HBDOC_SRC_SUBDIR + hb_ps() + aFile[ F_NAME ], hMeta, aErrMsg )
|
||||
++nCount
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
IF nCount == 0
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: Component (%1$s) has no language subdirs", cDir ) )
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDIF
|
||||
|
||||
RETURN aEntry
|
||||
|
||||
STATIC PROCEDURE __hbdoc__read_langdir( aEntry, cDir, hMeta, aErrMsg )
|
||||
LOCAL aFile
|
||||
LOCAL nCount
|
||||
|
||||
nCount := 0
|
||||
FOR EACH aFile IN Directory( cDir + hb_ps() + "*" + _HBDOC_SRC_EXT )
|
||||
hMeta[ "_LANG" ] := aFile[ F_NAME ]
|
||||
__hbdoc__read_file( aEntry, cDir + hb_ps() + aFile[ F_NAME ], hMeta, aErrMsg )
|
||||
++nCount
|
||||
NEXT
|
||||
|
||||
IF nCount == 0
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: Component (%1$s) has no documentation files", cDir ) )
|
||||
ENDIF
|
||||
|
||||
RETURN
|
||||
|
||||
STATIC PROCEDURE __hbdoc__read_file( aEntry, cFileName, hMeta, aErrMsg )
|
||||
LOCAL cFile := MemoRead( cFileName )
|
||||
LOCAL hEntry := NIL
|
||||
LOCAL cLine
|
||||
LOCAL cSection
|
||||
LOCAL tmp
|
||||
LOCAL nLine
|
||||
|
||||
LOCAL cDefTemplate
|
||||
|
||||
LOCAL aFilenameTemplateMap := {;
|
||||
"FUNCTION" => "func_" ,;
|
||||
"C FUNCTION" => "cfunc_" ,;
|
||||
"CLASS" => "class_" ,;
|
||||
"COMMAND" => "cmd_" ,;
|
||||
"PP" => "pp_" }
|
||||
|
||||
/* Preselect the default template based on source filename */
|
||||
FOR EACH tmp IN aFilenameTemplateMap
|
||||
IF Lower( Left( cFileName, Len( tmp ) ) ) == tmp
|
||||
cDefTemplate := tmp:__enumKey()
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
cFile := StrTran( cFile, Chr( 13 ) )
|
||||
cFile := StrTran( cFile, Chr( 9 ), " " )
|
||||
|
||||
nLine := 0
|
||||
FOR EACH cLine IN hb_ATokens( cFile, Chr( 10 ) )
|
||||
|
||||
cLine := SubStr( cLine, 4 )
|
||||
++nLine
|
||||
|
||||
SWITCH AllTrim( cLine )
|
||||
CASE "$DOC$"
|
||||
IF hEntry != NIL
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: %1$s: %2$s: $DOC$ without $END$", cFileName, hb_ntos( nLine ) ) )
|
||||
ELSEIF ! Empty( hEntry )
|
||||
AAdd( aEntry, hEntry )
|
||||
ENDIF
|
||||
hEntry := { => }
|
||||
IF hb_isHash( hMeta )
|
||||
hMeta[ "_DOCSOURCE" ] := cFileName
|
||||
IF cDefTemplate != NIL
|
||||
hMeta[ "TEMPLATE" ] := cDefTemplate
|
||||
ENDIF
|
||||
FOR EACH tmp IN hMeta
|
||||
hEntry[ tmp:__enumKey() ] := tmp
|
||||
NEXT
|
||||
ENDIF
|
||||
EXIT
|
||||
CASE "$END$"
|
||||
IF hEntry == NIL
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: %1$s: %2$s: $END$ without $DOC$", cFileName, hb_ntos( nLine ) ) )
|
||||
ELSEIF ! Empty( hEntry )
|
||||
AAdd( aEntry, hEntry )
|
||||
ENDIF
|
||||
hEntry := NIL
|
||||
EXIT
|
||||
OTHERWISE
|
||||
IF hEntry == NIL
|
||||
/* Ignore line outside entry. Don't warn, this is normal. */
|
||||
ELSEIF Left( LTrim( cLine ), 1 ) == "$" .AND. Right( RTrim( cLine ), 1 ) == "$"
|
||||
cLine := AllTrim( cLine )
|
||||
cSection := SubStr( cLine, 2, Len( cLine ) - 2 )
|
||||
IF cSection $ hEntry
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: %1$s: %2$s: Duplicate sections inside the same entry", cFileName, hb_ntos( nLine ) ) )
|
||||
ELSE
|
||||
hEntry[ cSection ] := ""
|
||||
ENDIF
|
||||
ELSEIF ! Empty( cSection )
|
||||
IF ! Empty( hEntry[ cSection ] )
|
||||
hEntry[ cSection ] += hb_eol()
|
||||
ENDIF
|
||||
hEntry[ cSection ] += cLine
|
||||
ELSEIF ! Empty( cLine )
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: %1$s: %2$s: Content outside section", cFileName, hb_ntos( nLine ) ) )
|
||||
ENDIF
|
||||
ENDSWITCH
|
||||
NEXT
|
||||
|
||||
IF hEntry != NIL
|
||||
_HBDOC_ADD_MSG( aErrMsg, hb_StrFormat( "Warning: %1$s: %2$s: $DOC$ without $END$", cFileName, hb_ntos( nLine ) ) )
|
||||
ENDIF
|
||||
|
||||
RETURN
|
||||
|
||||
STATIC FUNCTION DirAddPathSep( cDir )
|
||||
|
||||
IF ! Empty( cDir ) .AND. !( Right( cDir, 1 ) == hb_ps() )
|
||||
cDir += hb_ps()
|
||||
ENDIF
|
||||
|
||||
RETURN cDir
|
||||
118
harbour/tests/hbdoctst.prg
Normal file
118
harbour/tests/hbdoctst.prg
Normal file
@@ -0,0 +1,118 @@
|
||||
/*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* HBDOC reader test
|
||||
*
|
||||
* Copyright 2010 Viktor Szakats (harbour.01 syenar.hu)
|
||||
* www - http://harbour-project.org
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common.ch"
|
||||
|
||||
#define _HBDOC_HBD_EXT ".hbd"
|
||||
|
||||
PROCEDURE Main( cRoot )
|
||||
LOCAL aEntry
|
||||
LOCAL cName
|
||||
|
||||
LOCAL aDir
|
||||
LOCAL cDir
|
||||
|
||||
LOCAL aFile
|
||||
|
||||
LOCAL aErrMsg
|
||||
LOCAL tmp
|
||||
|
||||
IF ! ISCHARACTER( cRoot )
|
||||
/* Detect Harbour root */
|
||||
cRoot := "." + hb_ps()
|
||||
DO WHILE hb_DirExists( cRoot + ".." )
|
||||
IF hb_FileExists( cRoot + "INSTALL" ) .AND. ;
|
||||
hb_FileExists( cRoot + "COPYING" ) .AND. ;
|
||||
hb_DirExists( cRoot + "config" )
|
||||
EXIT
|
||||
ENDIF
|
||||
cRoot += ".." + hb_ps()
|
||||
ENDDO
|
||||
ELSE
|
||||
cDir := DirAddPathSep( cDir )
|
||||
ENDIF
|
||||
|
||||
OutStd( "Root: " + cRoot + hb_eol() )
|
||||
|
||||
aDir := { cRoot }
|
||||
|
||||
FOR EACH aFile IN Directory( cRoot + "contrib" + hb_ps() + hb_osFileMask(), "D" )
|
||||
IF "D" $ aFile[ F_ATTR ] .AND. ;
|
||||
!( aFile[ F_NAME ] == "." ) .AND. ;
|
||||
!( aFile[ F_NAME ] == ".." )
|
||||
AAdd( aDir, cRoot + "contrib" + hb_ps() + aFile[ F_NAME ] )
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
FOR EACH cDir IN aDir
|
||||
|
||||
cName := DirGetName( cDir )
|
||||
IF Empty( cName )
|
||||
cName := "harbour"
|
||||
ENDIF
|
||||
|
||||
aErrMsg := {}
|
||||
|
||||
aEntry := __hbdoc_LoadDir( cDir, cName, aErrMsg )
|
||||
|
||||
/* TODO: apply code formatting, NFDOC section and content validation here.
|
||||
It's also possible to create output generators at this point.
|
||||
These generators should simply parse the list of entry hashes
|
||||
and spit out output in selected end-user format, like .html
|
||||
or .pdf */
|
||||
|
||||
FOR EACH tmp IN aErrMsg
|
||||
OutStd( tmp + hb_eol() )
|
||||
NEXT
|
||||
|
||||
IF ! Empty( aEntry )
|
||||
OutStd( hb_MemoWrit( cName + _HBDOC_HBD_EXT, hb_serialize( aEntry ) ), cName, Len( aEntry ), hb_eol() )
|
||||
ENDIF
|
||||
NEXT
|
||||
|
||||
RETURN
|
||||
|
||||
STATIC FUNCTION DirGetName( cDir )
|
||||
LOCAL cName
|
||||
|
||||
cDir := DirDelPathSep( cDir )
|
||||
|
||||
hb_FNameSplit( cDir,, @cName )
|
||||
|
||||
IF Empty( cName ) .OR. cName == "." .OR. cName == ".."
|
||||
RETURN ""
|
||||
ENDIF
|
||||
|
||||
RETURN cName
|
||||
|
||||
STATIC FUNCTION DirDelPathSep( cDir )
|
||||
|
||||
IF Empty( hb_osDriveSeparator() )
|
||||
DO WHILE Len( cDir ) > 1 .AND. Right( cDir, 1 ) == hb_ps()
|
||||
cDir := hb_StrShrink( cDir, 1 )
|
||||
ENDDO
|
||||
ELSE
|
||||
DO WHILE Len( cDir ) > 1 .AND. Right( cDir, 1 ) == hb_ps() .AND. ;
|
||||
!( Right( cDir, 2 ) == hb_osDriveSeparator() + hb_ps() )
|
||||
cDir := hb_StrShrink( cDir, 1 )
|
||||
ENDDO
|
||||
ENDIF
|
||||
|
||||
RETURN cDir
|
||||
|
||||
STATIC FUNCTION DirAddPathSep( cDir )
|
||||
|
||||
IF ! Empty( cDir ) .AND. !( Right( cDir, 1 ) == hb_ps() )
|
||||
cDir += hb_ps()
|
||||
ENDIF
|
||||
|
||||
RETURN cDir
|
||||
Reference in New Issue
Block a user