Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
VFP code syntax coloring in HTML
Message
 
 
À
20/04/2000 14:35:16
Information générale
Forum:
Visual FoxPro
Catégorie:
Autre
Divers
Thread ID:
00355687
Message ID:
00362063
Vues:
31
Mike,

For my deepest regret, I can not simply give up. If I started something, I always feel I should finish it :(((((( So, I spent more time on this program. Now it uses partial words too. Unfortunately, I can not avoid chr(13) -> chr(13)+chr(13) and Tab -> space(5).

I'll try forget about it, because I have a lot of other work to do.

This is my final version: (note, also, in define line I need [], otherwise it doesn't work, don't know why :(()
********************************************************************
*  Description.......: nnHTMLCode
*  Calling Samples...: on key label F9 _cliptext=nnHTMLCode(_cliptext)
*  Parameter List....: lcCode, lcPath, lcBeatify
*  Created by........: Mike Helland
*  Modified by.......: Nadya Nosonovsky 04/18/2000 04:45:16 PM
********************************************************************
lparameters lcCode, lcPath, lcBeatify

if empty(lcCode) or vartype(lcCode)<>'C' && Check if first parameter exists
     return .f.
endif

local lnSec, lcOldExact, llNotUsedWords
lnSec=seconds()
lcOldExact=set('exact')

set exact off && in order to compare part of strings

if vartype(lcBeatify)<>'C'
     rele lcBeatify && test partial words
     lcBeatify='M' && Mixed
endif

if vartype(lcBeatify)='C' and not inlist(left(upper(lcBeatify),1),'U','L')
     lcBeatify='M' && Mixed
endif

#define FONTBLUE   [<font color=blue>]
#define FONTGREEN  [<font color=green>]
#define FONTEND    [</font>]
#define SYMBOLS    ':~!#$%^&*(@)-+=|{}[]:;,./\<>'

local SINGLEQUOTE, DOUBLEQUOTE, LEFTPAR, RIGHTPAR, CRLF

SINGLEQUOTE = chr(39)
DOUBLEQUOTE = chr(34)
LEFTPAR = chr(91)
RIGHTPAR = chr(93)
CRLF  = chr(13)+chr(10)

private CR
CR= chr(13) && should be seen in aparser

*Setup two simple variables for speed
local LF, leTab
LF      = chr(10)
leTab     = chr(9)

*Do some basic HTML intializing
lcCode = strtran(lcCode, leTab, space(5))
lcCode = strtran(lcCode, '&', '&')
lcCode = strtran(lcCode, '<', '<')
lcCode = strtran(lcCode, '>', '>')

lcCode = strtran(lcCode, CR, CR + CR) && to proper handle blank line

*Create an array ouf of our strings.
local laLines[1], lcReturn, lnLines, lnI, lcLine, lnWA

local lcComment, lcBeforeComment, lnWords, lcResult

local lcDoubleAmp, lnStartComment, k, lcLeft, lcRight, lcSymb, llStartString, lcRightPrev

private chr254, space1 && in order to be seen in aparser

chr254=chr(254)
space1=space(1)

lnLines=alines(laLines, lcCode)

lcReturn = '<pre>'

lnWA=select()

if !used('words')
    llNotUsedWords=.t.
     use (iif(empty(lcPath), '', lcPath) + 'words') in 0 order tag revword
endif

*Proccess each line
for lnI = 1 to lnLines

     lcLine = laLines[lnI]

*Don't even bother the blank ones
     if empty(alltrim(lcLine))
          lcReturn = lcReturn +CRLF
          loop
     endif

*Full Line Comments, first
     if left(alltrim(lcLine),1) = '*'
          lcLine = FONTGREEN + lcLine + FONTEND

*Print line here
          lcReturn = lcReturn + CRLF + lcLine
          loop
     endi && to test partial words

     lcComment=''
     lcBeforeComment=lcLine

*Now end of the line comments

     lcDoubleAmp = '&&' && This is to test our function

     lnStartComment = at(lcDoubleAmp, lcLine)

     if lnStartComment > 0
          lcComment = FONTGREEN+substr(lcLine, lnStartComment) + FONTEND && Insert comment tag
          lcBeforeComment=substr(lcLine, 1,lnStartComment-1)
     endif

*!* Devide string into words
     dimension laWords[1]

     lnWords = aparser(@laWords, lcBeforeComment,SYMBOLS)

     lcResult=''

     local lcWord, lnWordLen

     for k=1 to lnWords

* First check if we're in a string
          if !empty(laWords[k])

               laWords[k]=chrtran(laWords[k],chr254,space1)

               lcLeft=left(laWords[k],1)

               llStartString=.f.

               if inlist(lcLeft,DOUBLEQUOTE,SINGLEQUOTE,LEFTPAR) && String starts
                    llStartString=.t.
                    if lcLeft=LEFTPAR
                         lcLeft=RIGHTPAR
                    endif
                    lcSymb=lcLeft
               endif

               do while llStartString && Check if we're still in string

                    if k<lnWords
                         lcLeft=left(laWords[k+1],1)
                         lcRight=right(alltrim(laWords[k+1]),1)
                         lcRightPrev=right(alltrim(laWords[k]),1)

                         laWords[k]=chrtran(laWords[k],chr254,space1)
                         lnWordLen=len(laWords[k]) && Word length

                         if lcSymb==lcLeft or lcSymb==lcRight or ;
                                   (lnWordLen>1 and lcSymb==lcRightPrev)

                              lcSymb=''
                              lcResult=lcResult+laWords[k]
                              k=k+1
                              llStartString=.f. && String ends
                              exit
                         endif

                         lcResult=lcResult+laWords[k]

                         k=k+1 && Increment count

                    else
                         laWords[k]=chrtran(laWords[k],chr254,space1)
                         lcSymb=''
                         llStartString=.f. && String ends
                         exit
                    endif
               enddo

               laWords[k]=chrtran(laWords[k],chr254,space1)
               lnWordLen=len(alltrim(laWords[k]))
               lcWord=upper(alltrim(laWords[k]))

               if lnWordLen<4
                    lcWord=padr(lcWord,4) && short word
               endif

               if not empty(laWords[k]) and seek(lcWord,'words','revword') && Word found
                    do case
                    case left(upper(lcBeatify),1)='U' && Upper case
                         laWords[k]=upper(laWords[k])
                    case left(upper(lcBeatify),1)='L' && Lower case
                         laWords[k]=lower(laWords[k])
                    endcase
                    laWords[k]=FONTBLUE+laWords[k]+FONTEND
               endif
               lcResult=lcResult+laWords[k]
          endif
     next

     if not empty(lcBeforeComment) and not empty(lcResult)
          lcBeforeComment=lcResult
     endif

*Submit the process line
     lcReturn = lcReturn  + CRLF + lcBeforeComment+lcComment && Another In Line Test to use
endfor

lcReturn = lcReturn  + '</pre>'

if llNotUsedWords && was not used before
     use in words
endif     

select (lnWA) && Return to prev. area
set exact &lcOldExact && Restore exact settings

wait window nowait 'Transformed  '+alltrim(str(lnLines))+'# lines in '+alltrim(str(seconds()-lnSec,10,6))+' sec'
return lcReturn

**********************************************************************
function aparser
*  Description.......: Function parses a text string into an array.
*                    : Each element of the array contains one word...
*  Calling Samples...: dimension laWords[1]
*                    : lcWordString = "Some text string"
*                    : lnWords = aparser(@laWords, lcWordString)
*  Parameter List....: paWords, pcWordString, pcDelimiter
********************************************************************
lparameter paWords, pcWordString, pcDelimiter
local lnWords, i, lcSymbol

external array paWords

if vartype(pcDelimiter)<>'C'
     pcDelimiter=space1
endif

pcWordString=strtran(pcWordString, space1, space1+chr254) && Replace space(1) with rare symbol chr(254)

for i=1 to len(pcDelimiter)
     lcSymbol=substr(pcDelimiter,i,1)
     pcWordString=strtran(pcWordString,lcSymbol,space1+lcSymbol+space1)  && Larry Miller suggested
next

*!* Replace the delimiter with CHR(13) using STRTRAN.
pcWordString = strtran(pcWordString, space1, CR)

*!* Now put each element in an array.
lnWords=alines(paWords, pcWordString)

return lnWords


>>Anyway, I'll correct my version regarding partial words and additional lines for a moment while you will improve yours. Ok?
>
>I'm not improving it just to add that; I never thought it was important, which is the 5th time I said it. I didn't intend for this to take anymore than two or three hours of my time, so it won't.
>
>What I will do though, is work on getting reserved words for the rest of VB and VC and put this on a web server where you can type in code and get it formatted without downloading the file and needing to use VFP directly.
If it's not broken, fix it until it is.


My Blog
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform