2008-08-27 29 views
10

El código de Visual Basic no se procesa correctamente con prettify.js de Google.¿Hay una opción lang-vb o lang-basic para prettify.js de Google?

desbordamiento de pila:

Partial Public Class WebForm1 
    Inherits System.Web.UI.Page 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     'set page title 
     Page.Title = "Something" 
    End Sub 

End Class 

en Visual Studio ...

Visual Basic in Visual Studio

He encontrado esto en el documento README:

¿Cómo se especifica en qué idioma mi código está en?

No es necesario especificar el idioma desde prettyprint() va a adivinar. Usted puede especificar un idioma especificando la extensión del lenguaje junto con la clase prettyprint así:

<pre class="prettyprint lang-html"> 
    The lang-* class specifies the language file extensions. 
    Supported file extensions include 
    "c", "cc", "cpp", "cs", "cyc", "java", "bsh", "csh", "sh", 
    "cv", "py", "perl", "pl", "pm", "rb", "js", 
    "html", "html", "xhtml", "xml", "xsl". 
</pre> 

no veo lang-vb opción o lang-básica. ¿Alguien sabe si existe uno como un complemento?


Nota: Esto se relaciona con la sugerencia VB.NET code blocks de desbordamiento de pila.

+0

Nota: si usted necesita tener el resaltado de sintaxis es así, utilice '<- idioma: lang-VB ->' – Laurel

Respuesta

8

/EDIT: He reescrito toda la publicación.

A continuación se muestra una solución bastante completa al problema resaltado VB. Si SO no tiene nada mejor, por favor, úselo. El resaltado de sintaxis VB es definitivamente deseado.

También he añadido un ejemplo de código con algunos literales de códigos complejos que consigue destacado correctamente. Sin embargo, ni siquiera he intentado obtener XLinq correctamente. Sin embargo, aún podría funcionar. El keywords list está tomado de MSDN. Las palabras clave contextuales no están incluidas. ¿Sabía que el operador GetXmlNamespace?

El algoritmo sabe el tipo caracteres literales. También debería ser capaz de manejar caracteres de tipo identificador pero no los he probado. Tenga en cuenta que el código funciona en HTML. Como consecuencia, se requiere que &, <y> se lean como entidades con nombre (!), No caracteres individuales.

siento por el largo de expresiones regulares.

Código
var highlightVB = function(code) { 
    var regex = /("(?:""|[^"])+"c?)|('.*$)|#.+?#|(&amp;[HO])?\d+(\.\d*)?(e[+-]?\d+)?U?([SILDFR%@!#]|&amp;)?|\.\d+[FR!#]?|\s+|\w+|&amp;|&lt;|&gt;|([-+*/\\^[email protected]!#%&<>()\[\]{}.,:=]+)/gi; 

    var lines = code.split("\n"); 
    for (var i = 0; i < lines.length; i++) { 
     var line = lines[i]; 

     var tokens; 
     var result = ""; 

     while (tokens = regex.exec(line)) { 
      var tok = getToken(tokens); 
      switch (tok.charAt(0)) { 
       case '"': 
        if (tok.charAt(tok.length - 1) == "c") 
         result += span("char", tok); 
        else 
         result += span("string", tok); 
        break; 
       case "'": 
        result += span("comment", tok); 
        break; 
       case '#': 
        result += span("date", tok); 
        break; 
       default: 
        var c1 = tok.charAt(0); 

        if (isDigit(c1) || 
         tok.length > 1 && c1 == '.' && isDigit(tok.charAt(1)) || 
         tok.length > 5 && (tok.indexOf("&amp;") == 0 && 
         tok.charAt(5) == 'H' || tok.charAt(5) == 'O') 
        ) 
         result += span("number", tok); 
        else if (isKeyword(tok)) 
         result += span("keyword", tok); 
        else 
         result += tok; 
        break; 
      } 
     } 

     lines[i] = result; 
    } 

    return lines.join("\n"); 
} 

var keywords = [ 
    "addhandler", "addressof", "alias", "and", "andalso", "as", "boolean", "byref", 
    "byte", "byval", "call", "case", "catch", "cbool", "cbyte", "cchar", "cdate", 
    "cdec", "cdbl", "char", "cint", "class", "clng", "cobj", "const", "continue", 
    "csbyte", "cshort", "csng", "cstr", "ctype", "cuint", "culng", "cushort", "date", 
    "decimal", "declare", "default", "delegate", "dim", "directcast", "do", "double", 
    "each", "else", "elseif", "end", "endif", "enum", "erase", "error", "event", 
    "exit", "false", "finally", "for", "friend", "function", "get", "gettype", 
    "getxmlnamespace", "global", "gosub", "goto", "handles", "if", "if", 
    "implements", "imports", "in", "inherits", "integer", "interface", "is", "isnot", 
    "let", "lib", "like", "long", "loop", "me", "mod", "module", "mustinherit", 
    "mustoverride", "mybase", "myclass", "namespace", "narrowing", "new", "next", 
    "not", "nothing", "notinheritable", "notoverridable", "object", "of", "on", 
    "operator", "option", "optional", "or", "orelse", "overloads", "overridable", 
    "overrides", "paramarray", "partial", "private", "property", "protected", 
    "public", "raiseevent", "readonly", "redim", "rem", "removehandler", "resume", 
    "return", "sbyte", "select", "set", "shadows", "shared", "short", "single", 
    "static", "step", "stop", "string", "structure", "sub", "synclock", "then", 
    "throw", "to", "true", "try", "trycast", "typeof", "variant", "wend", "uinteger", 
    "ulong", "ushort", "using", "when", "while", "widening", "with", "withevents", 
    "writeonly", "xor", "#const", "#else", "#elseif", "#end", "#if" 
] 

var isKeyword = function(token) { 
    return keywords.indexOf(token.toLowerCase()) != -1; 
} 

var isDigit = function(c) { 
    return c >= '0' && c <= '9'; 
} 

var getToken = function(tokens) { 
    for (var i = 0; i < tokens.length; i++) 
     if (tokens[i] != undefined) 
      return tokens[i]; 
    return null; 
} 

var span = function(class, text) { 
    return "<span class=\"" + class + "\">" + text + "</span>"; 
} 

para la prueba:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load 
    'set page title 
    Page.Title = "Something" 
    Dim r As String = "Say ""Hello""" 
    Dim i As Integer = 1234 
    Dim d As Double = 1.23 
    Dim s As Single = .123F 
    Dim l As Long = 123L 
    Dim ul As ULong = 123UL 
    Dim c As Char = "x"c 
    Dim h As Integer = &amp;H0 
    Dim t As Date = #5/31/1993 1:15:30 PM# 
    Dim f As Single = 1.32e-5F 
End Sub 
+0

Konrad, este problema ha sido arreglado en Prettify, aunque no implementado en SO. –

+0

@Mark: Sí, estoy al tanto de esto ... vea la discusión de Uservoice. Pero como dijo, TAN lamentablemente todavía no lo implementa y el informe de Uservoice ha sido rechazado. –

0

Mientras tanto, se puede poner un carácter de comentario adicional al final de sus comentarios a que se vea bien.Por ejemplo:

Sub TestMethod() 
    'Method body goes here' 
End Sub 

También es necesario escapar caracteres de comentario internos en la posición normal vb-moda:

Sub TestMethod2() 
    'Here''s another comment' 
End Sub 

Prettify todavía lo trata como una cadena literal en lugar de un comentario, pero al menos se ve bueno.

Otro método que he visto es comenzar los comentarios con un extra '//, así:

Sub TestMethod3() 
    ''// one final comment 
End Sub 

A continuación, se maneja como un comentario, pero usted tiene que lidiar con los marcadores de comentario estilo C

+0

Sí, pero en ese caso, simplemente podría usar "//". La razón por la que la gente usa "'' //" es que parece un comentario Y se compila en VB como un comentario. – EndangeredMassa

+0

Como estamos hablando de fragmentos de vb, probablemente sea una buena idea asegurarse de que compilarán al menos cuando copien/peguen en el IDE. –

2

Prettify no admite comentarios de VB a partir del 8 de enero de 2009.

Para que el resaltado de sintaxis vb funcione correctamente, necesita tres cosas;

<script type="text/javascript" src="/External/css/prettify/prettify.js"></script> 
<script type="text/javascript" src="/External/css/prettify/lang-vb.js"></script> 

y un bloque PRE alrededor de su código, por ejemplo:

<PRE class="prettyprint lang-vb"> 
Function SomeVB() as string 
    ' do stuff 
    i = i + 1 
End Function 
</PRE> 

Stackoverflow falta la inclusión lang-vb.js, y la capacidad de especificar qué idioma a través de rebajas, es decir: class="prettyprint lang-vb" razón por la cual no funciona aqui

para más detalles sobre el tema: ver the Prettify issues log

Cuestiones relacionadas