gsHTMCodeColor Versión 2

Utilidad para colorear código y generar el código HTML


Publicado el 26/Jun/2002
Actualizado el 14/Nov/2002



15/Nov/2002: Sigue este link para ver las últimas actualizaciones

Si quieres ver el código publicado anteriormente:
Versión original del 04/Abr/2001
Revisión del 11/Abr/2001


El fichero con las palabras clave:

26/Oct/2002:
Revisión de las palabras claves, (para C#, C/C++, VB clásico y VB .NET):
14/Nov/2002: Revisión de las palabras claves de C#
Pulsa aquí para bajarte el zip  (lenguajes.zip 2.31 KB).


En esta nueva versión he corregido algunos bugs y he añadido nuevo código, así como un control RichTextBox para poder aceptar ficheros más grandes.

Estas son algunos de los cambios:
Revisión del 11/Jun/2001: Corregido los bugs para los comentarios c#/C/C++
Revisión del 08/Oct/2001: Uso RichText para manejar ficheros más grandes
Revisiones del 15/Ene/2002:
    -Mejoras en el tratamiento de cadenas y comentarios
    -Comprueba correctamente los comentarios /* ... */
    -Las cadenas y tokens no se convierten en los comentarios
    -Se usa un fichero INI en vez del registro
    -Permite usar el signo _ en los comentarios de VB
    -Permite usar el signo \ en las cadenas de C
    -Se autoajustan los controles al tamaño del formulario
    -Permite cambiar entre el código normal y el convertido
    -Se asigna el fichero de palabras según la extensión
    -Se muestra una barra de progreso.
    -Compilado como código nativo.
    -Añado menús al formulario

 Revisión del 27/Jun/2002:
    -Si después de un punto o un corchete de apertura
     va una palabra clave, no se colorea,
     ya que puede ser un miembro de objeto.
     Corrección hecha gracias a una sugerencia de Erik.

 

Una captura de la pantalla de la utilidad en ejecución:


La utilidad en tiempo de ejecución


Revisión del 27/Jun/2002
La corrección añadida el 27 de junio de 2002 ha sido gracias a un comentario de Erik (el del curso de C#), para que las palabras clave que formen parte de un objeto no se coloreen, por ejemplo Open es una palabra clave, pero si forma parte de un objeto, no debería colorearse.
Lo mismo ocurre si creamos una propiedad o variable que se llame igual que un objeto (en VB.NET esto es posible), en estos casos se declaran dentro de corchetes, por tanto, si después de un corchete se incluye una palabra clave, no se colorea.

Este es el código modificado del procedimiento ComprobarTokens:

Private Function ComprobarTokens(ByVal s As String) As String
    ' Comprobar si en la cadena pasada hay palabras clave           (15/Ene/02)
    Dim s2 As String, sID As String
    Dim k As Long
    Dim ComprobarPalabras As Boolean
    Static HayComillas As Boolean
    Static HayRem As Boolean
    Static HayMultipleRem As Boolean
    Static MultiLineaVB As Boolean
    Static MultiLineaC As Boolean
    ' Por si el ID hallado es un punto o un corchete                (27/Jun/02)
    Static sIDAnt As String
    ' Cuando una palabra clave siga a uno de estos separadores, no se coloreará
    Const sTokens2 As String = ".["
    '
    ComprobarPalabras = True
    '
    ' Si se está procesando un fichero de C (c#, C/C++)
    ' Para que no se analicen los comentarios de C          (15/Ene/02)
    ' El problema de los comentarios de múltiples líneas
    ' es que pueden estar en una sola línea y por tanto,
    ' habría que analizar esa línea, por si hay palabras clave,
    ' como por ejemplo:
    ' public class /* comentario */ Form1 : System.Windows.Forms.Form
    If rbFP(esCS).Value = True Then
        ' Comprobar si hay comentarios de C# o C/C++
        '
        ' En C# / C / C++ no se tendrá en cuenta este signo
        MultiLineaVB = False
        '
        ' Comprobar si hay un comentario múltiple
        k = InStr(s, "/*")
        If k > 0 Then
            ' Comprobar las palabras que haya antes del comentario
            's = ComprobarTokens(Left$(s, k - 1), HayMultipleRem) & sTagFontGreen & Mid$(s, k)
            s = ComprobarTokens(Left$(s, k - 1)) & sTagFontGreen & Mid$(s, k)
            ' Hay que comprobar antes de asignar HayMultipleRem
            HayMultipleRem = True
            ComprobarPalabras = False
        End If
        ' Comprobar si hay un final de comentario mútiple
        k = InStr(s, "*/")
        If k > 0 Then
            HayMultipleRem = False
            ComprobarPalabras = False
            ' Para los comentarios múltiples                (11/Jun/01)
            ' Comprobar las palabras que haya después del comentario
            's = Left$(s, k + 1) & sEndFontTag & ComprobarTokens(Mid$(s, k + 2), HayMultipleRem)
            s = Left$(s, k + 1) & sEndFontTag & ComprobarTokens(Mid$(s, k + 2))
        End If
        If ComprobarPalabras Then
            ' Comprobar si hay un comentario de línea completa
            k = InStr(s, "//")
            If k > 0 Then
                ' Para que maneje bien los comentarios          (11/Jun/01)
                ComprobarPalabras = False
                ' Comprobar las palabras que haya antes del comentario
                's = ComprobarTokens(Left$(s, k - 1), HayMultipleRem) & sTagFontGreen & Mid$(s, k) & sEndFontTag
                s = ComprobarTokens(Left$(s, k - 1)) & sTagFontGreen & Mid$(s, k) & sEndFontTag
            End If
        End If
        '
        ' En C se permite usar el \ para continuar las cadenas de texto en distintas líneas
        If Right$(RTrim$(s), 2) = " \" Then
            MultiLineaC = True
        Else
            MultiLineaC = False
        End If
        '
    ElseIf rbFP(esVB).Value = True Then
        MultiLineaC = False
        ' si es VB, comprobar si tiene un _ al final
        If Right$(RTrim$(s), 2) = " _" Then
            MultiLineaVB = True
        Else
            MultiLineaVB = False
        End If
    End If
    '
    If ComprobarPalabras Then
        '
        ' Tomar la primera palabra
        s2 = s
        sID = CadaPalabra(s2)
        s = ""
        ' Mientras no sea una cadena vacía
        Do While sID <> ""
            If HayRem = True Or HayMultipleRem = True Then
                ' No interpretar lo que esté comentado          (03/Abr/01)
                ' Ni si es un comentario múltiple               (11/Jun/01)
                s = s & sID
            ElseIf sID = Chr$(34) Then
                ' Convertirlo en el tag de comillas         (31/Mar/01)
                sID = "&" & sTagQuote
                If HayComillas Then
                    If chkTextColor.Value = vbChecked Then
                        s = s & sID & sEndFontTag
                    Else
                        s = s & sID
                    End If
                    HayComillas = False
                Else
                    HayComillas = True
                    If chkTextColor.Value = vbChecked Then
                        s = s & sTagFontText & sID
                    Else
                        s = s & sID
                    End If
                End If
            'ElseIf HayComillas = True Or HayRem = True Or HayMultipleRem = True Then
            ElseIf HayComillas = True Then
                ' No interpretar lo que haya entre comillas     (31/Mar/01)
                ' Ni lo que esté en un comentario               (03/Abr/01)
                ' Ni si es un comentario múltiple               (11/Jun/01)
                s = s & sID
            ElseIf rbFP(esVB).Value = True And (sID = "'" And HayRem = False) Then
                s = s & sTagFontGreen & sID
                HayRem = True
            ElseIf rbFP(esCS).Value = True And (sID = "//" And HayRem = False) Then
                ' Aquí nunca llega, ya que se comprueba más arriba  (15/Ene/02)
                s = s & sTagFontGreen & sID
                HayRem = True
            ElseIf mPalabras.Exists(sID) And HayComillas = False Then
                ' Si está en la colección de palabras clave
                ' Pero si se usaba el punto como separador,         (27/Jun/02)
                ' no colorearla
                If sIDAnt <> "" Then
                    s = s & sID
                    sIDAnt = ""
                Else
                    s = s & sTagFontBlue & sID & sEndFontTag
                End If
            Else
                sIDAnt = ""
                ' Si es un punto o un corchete de apertura          (27/Jun/02)
                ' la palabra que siga, no se coloreará
                If InStr(sTokens2, sID) And HayComillas = False Then
                    sIDAnt = sID
                End If
                s = s & sID
            End If
            sID = CadaPalabra()
        Loop
        '
        If MultiLineaC = False Then
            If HayComillas Then
                If chkTextColor.Value = vbChecked Then
                    s = s & Chr$(34) & sEndFontTag
                Else
                    s = s & Chr$(34)
                End If
                HayComillas = False
            End If
        End If
        '
        ' Sólo cerrar los REMs cuando no sea multilínea             (15/Ene/02)
        If MultiLineaVB = False Then
            If HayRem Then
                s = s & sEndFontTag
                HayRem = False
            End If
        End If
    End If
    '
    ComprobarTokens = s
End Function

Este es el link para el código y el ejecutable compilado con VB6 SP5: gsHTMCodeColor2.zip (95.2 KB)
Incluye revisiones de los ficheros de palabras, así como un fichero para C++

En este ZIP se incluyen las correcciones del 27/Jun/2002

Nos vemos.
Guillermo


Volver al índice de Mis Utilidades

ir al índice