📄 gotchas.prg
字号:
* Program...........: Gotchas.PRG
* Author............: Steven Black
* Project...........: Steve Hack
* Created...........: 11/02/96 10:24:04
* Copyright.........: (c) SBC, 1996
*) Description.......: PROGRAM Gotchas.PRG
*) : Creates a punch list of things to
*) : be careful of when localizing an application.
* Calling Samples...:
* Parameter List....: tcProject: A project table, fully specified
* Major change list.:
* ERs...............:
* Usage.............: DO Gotchas WITH cProjectName
LPARAMETER tcProject
loAction= CREATE( "Gotchas", tcProject)
loAction.Execute()
DEFINE CLASS Gotchas AS Custom
cSourceName= ''
*====================================
*-- Gotchas::Init( x)
*====================================
FUNCTION Init( tuPassed)
*-- For now we just do whole projects
IF EMPTY( tuPassed)
tuPassed= GETFILE("PJX", "Pick a project")
ENDIF
LOCAL lcSource
*-- trim, and pad out .pjx file name
lcSource= ALLTRIM( tuPassed)
lcSource= lcSource + IIF(AT(".",tuPassed)=0, ".pjx","")
*-- No such project, man.
IF !FILE( lcSource)
WAIT WINDOW PROGRAM() + " can't figure out what project you want to audit"
RETURN .F.
ENDIF
this.cSourceName= lcSource
IF ! USED( "Gotchas")
USE Gotchas IN 0 SHARED
REPLACE ALL Hits_Found with ""
ENDIF
*====================================
*-- Gotchas::Execute()
*====================================
FUNCTION Execute
Clear
* SET PROC TO INTLTOOL ADDITIVE
loIterator = CREATE( "cProjectIterator", THIS.cSourceName)
loGitchasVisitor= CREATE( "GotchasVisitor")
loIterator.Accept( loGitchasVisitor)
ENDDEFINE
DEFINE CLASS GotchasVisitor AS cRecursiveMetadataVisitor
*====================================
*-- GitchasVisitor::VisitString( c[c])
*====================================
FUNCTION VisitString( tcElement, tcOrigin)
LOCAL lcElement, llFound
lcElement= UPPER( tcElement)
SELECT Gotchas
LOCATE
SCAN
IF UPPER( ALLTRIM( Cookie)) $ lcElement
llFound= .T.
EXIT
ENDIF
ENDSCAN
IF llFound
llFound= .F.
LOCAL lcOrigin
lcOrigin= tcOrigin
IF EMPTY( lcOrigin) OR TYPE ('lcOrigin')<> "C"
lcOrigin= THIS.GetCurrentSourceID()
ENDIF
IF EMPTY( Hits_Found)
REPLACE Hits_Found with "Hits for " + ALLTRIM( Descript)
ENDIF
REPLACE Hits_Found with Hits_Found+ ;
CHR(13)+ ;
lcOrigin + ;
" ===> " + ;
ALLTRIM( STRTRAN(tcElement,CHR(9)," "))
ENDIF
*====================================
*-- GitchasVisitor::VisitSCXRecord( o)
*====================================
FUNCTION VisitSCXRecord( loIterator)
LOCAL lcAlias, lcProperties, lcMethods, lcProp, lnI
lcAlias= loIterator.GetAlias()
lcProperties=ALLTRIM(&lcAlias..Properties)
lcMethods=ALLTRIM(&lcAlias..Methods)
IF!EMPTY( lcProperties)
THIS.VisitMemo( lcProperties)
ENDIF
IF!EMPTY( lcMethods)
THIS.VisitMemo( lcMethods)
ENDIF
ENDDEFINE
*///////////////////////////////////
* cRecursiveMetadataVisitor
*
* This visitor is designed to recursively audit
* the metadatd visitee for localizeable resources
*///////////////////////////////////
DEFINE CLASS cRecursiveMetadataVisitor AS Line
oVisitee= .NULL.
lVisitComments= .F.
*====================================
*-- cRecursiveMetadataVisitor::GetCurrentSourceID( o)
*====================================
* Return values suitable for the
* STRINGS.cWhere field
*
FUNCTION GetCurrentSourceID( toIterator)
LOCAL lcType, lcAlias
IF TYPE( "toIterator") <> "O"
toIterator= THIS.oVisitee
ENDIF
lcType= toIterator.GetType()
DO CASE
CASE lcType= "Project"
lcAlias= toIterator.GetAlias()
RETURN FULLPATH( STRTRAN( ALLTRIM( &lcAlias..Name), CHR(0)), toIterator.GetHomeDir())
CASE lcType= "Form"
lcAlias= toIterator.GetAlias()
RETURN toIterator.GetStructure() + " -- "+ ALLTRIM( &lcAlias..oBjName)
CASE lcType= "Visual Class Library"
LOCAL lcAlias, lnOldSelect, lcRetVal
lcAlias= toIterator.GetAlias()
*-- Kluge here: "PARENT" is a keyword, and also a field in the VCX :-\
lnOldSelect= SELECT()
SELECT (lcAlias)
lcRetVal= toIterator.GetStructure() + " -- "+ ;
IIF(!EMPTY(Parent), ALLTRIM(Parent)+".","")+ ;
ALLTRIM(ObjName)
SELECT (lnOldSelect)
RETURN lcRetVal
CASE lcType= "Report" OR ;
lcType= "Menu"
RETURN toIterator.GetStructure()
OTHERWISE
RETURN ''
ENDCASE
*====================================
*-- cRecursiveMetadataVisitor::Visit( o)
*====================================
FUNCTION VISIT( toIterator)
IF ISNULL( toIterator)
RETURN .NULL.
ENDIF
*-- Hook here to visit .PRG files
IF TYPE( "toIterator") = "C"
LOCAL lnPos, lcFName
lcFName= toIterator
lnPos=RAT(".", lcFName)
IF lnPos>0
LOCAL lcExt
lcExt= UPPER( SUBSTR( lcFName, LnPos +1))
IF INLIST( lcExt, "PRG", "MPR", "SPR", "H")
RETURN THIS.VisitCodeFile( lcFName)
ENDIF
ENDIF
RETURN .F.
ENDIF
IF TYPE( "toIterator") <> "O"
RETURN .F.
ENDIF
THIS.oVisitee= toIterator
toIterator.First()
LOCAL lcType
lcType= toIterator.GetType()
DO CASE
CASE PROPER( lcType)="Project"
THIS.VisitPJX( toIterator)
CASE PROPER( lcType)="Form"
THIS.VisitMetaTable( toIterator, "VisitSCXRecord")
CASE PROPER( lcType)="Visual Class Library"
THIS.VisitMetaTable( toIterator, "VisitSCXRecord")
CASE PROPER( lcType)="Menu"
THIS.VisitMetaTable( toIterator, "VisitMNXRecord")
CASE PROPER( lcType)="Report"
THIS.VisitMetaTable( toIterator, "VisitFRXRecord")
CASE PROPER( lcType)="Table"
WAIT WINDOW toIterator.GetStructure() NOWAIT
DO CASE
CASE ".dbc" $ LOWER( toIterator.GetStructure())
THIS.VisitMetaTable( toIterator, "VisitDBCRecord")
ENDCASE
ENDCASE
WAIT CLEAR
*====================================
*-- cRecursiveMetadataVisitor::VisitCodeFile( c)
*====================================
FUNCTION VisitCodeFile( tcFileName)
IF ISNULL( tcFileName)
RETURN .NULL.
ENDIF
IF TYPE("tcFileName") <> "C"
RETURN .F.
ENDIF
LOCAL lcFileName
lcFileName= ALLTRIM( UPPER( tcFilename))
*-- Thanks to Mark Giesen at >MHS:MARK@AGIS for
*-- the following fix for long file names with embedded spaces.
IF " " $ lcFileName
lcFileName= '"' + lcFilename+ '"'
ENDIF
IF !FILE( lcFileName)
WAIT WIND NOWAIT 'File ' + ;
lcFileName + ;
' Not Found'
ENDIF
PRIVATE ;
lcOldAlias, ;
lcFirstChars, ;
lcSnipLine, ;
lni, ;
lnNewLineCount, ;
lnOldLineCount
lcOldAlias = ALIAS()
WAIT WINDOW lcFileName NOWAIT
IF ! USED( "IntlTemp")
*-- Create a cursor if it's not open
jnOldBlock = SET("BLOCKSIZE")
SET BLOCKSIZE TO 32
CREATE CURSOR IntlTemp ;
( mOld M, mNew M)
SET BLOCKSIZE TO ( jnOldBlock)
APPEND BLANK
ELSE
SELECT IntlTemp
REPLACE mOld WITH "", ;
mNew WITH ""
ENDIF
APPEND MEMO mOld FROM &lcFileName OVERWRITE
lmPass= mOld
USE IN IntlTemp
IF !EMPTY( lcOldAlias) AND USED ( lcOldAlias)
SELECT ( lcOldAlias)
ENDIF
WAIT CLEAR
THIS.VisitMemo( lmPass, lcFileName)
*====================================
*-- cRecursiveMetadataVisitor::VisitMemo( tmMemo)
*====================================
FUNCTION VisitMemo( tmMemo, tcFileName)
LOCAL lnOldLineCount, lcSnipLine, lcOrigin, lnOldMemoWidth
lnOldMemoWidth= SET( "MEMOWIDTH")
SET MEMOWIDTH TO 1000
*-- Line counter
lnOldLineCount = 0
lcSnipLine= ''
lcOrigin= tcfileName
IF EMPTY( lcOrigin) OR TYPE ('lcOrigin')<> "C"
lcOrigin= THIS.GetCurrentSourceID()
ENDIF
_MLINE = 0
FOR lni = 1 to MEMLINES( tmMemo)
lnOldLineCount = lnOldLineCount + 1
IF lnOldLineCount % 20 = 0
WAIT WINDOW lcOrigin + "-- " + ;
ALLTRIM( STR( lnOldLineCount, 6))+ " lines" NOWAIT
ENDIF
*-- read the next line in the file
lcSnipLine = lcSnipLine+ STRTRAN( MLINE( tmMemo, 1, _MLINE), CHR(9), " ")
*-- trim it
lcSnipLine = TRIM( lcSnipLine)
*-- Take it all in...
IF RIGHT( lcSnipLine, 1)= CHR(59) && Semicolon
lcSnipLine= SUBS( lcSnipLine, LEN( lcSnipLine)- 1)+ " "
LOOP
ENDIF
THIS.VisitCodeLine( lcSnipLine)
lcSnipLine= ''
ENDFOR
SET MEMOWIDTH TO lnOldMemoWidth
*====================================
*-- cRecursiveMetadataVisitor::VisitMemoLine( tmMemo)
*====================================
FUNCTION VisitMemoLine( tcLine)
THIS.VisitCodeLine( tcLine)
*====================================
*-- cRecursiveMetadataVisitor::VisitCodeLine( c)
*====================================
FUNCTION VisitCodeLine( tcCodeLine)
IF EMPTY( tcCodeLine)
RETURN
ENDIF
*-- comment maybe?
lcFirstChars = LEFT( LTRIM( STRTRAN( tcCodeLine,CHR(9))), 2)
IF lcFirstChars = "*" AND ! THIS.lVisitComments
RETURN
ENDIF
THIS.VisitString( tcCodeLine)
*====================================
*-- cRecursiveMetadataVisitor::VisitMetaTable( o)
*====================================
FUNCTION VisitMetaTable( toIterator, tcMethod)
LOCAL lcStructure
lcStructure= toIterator.GetStructure()
DO WHILE .T.
WAIT WINDOW lcStructure NOWAIT
LOCAL loEngine
loEngine= CREATE("cTableIterator", lcStructure)
DO WHILE .T.
LOCAL lcHold
lcHold="THIS."+tcMethod
&lcHold.( loEngine)
IF loEngine.Next()
LOOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -