2008-08-27 18 views
10

Le code Visual Basic ne s'affiche pas correctement avec prettify.js de Google.Existe-t-il une option lang-vb ou lang-basic pour prettify.js de Google?

sur Stack Overflow:

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 

dans Visual Studio ...

Visual Basic in Visual Studio

J'ai trouvé dans le document README:

Comment puis-je spécifier quelle langue mon code est en?

Vous n'avez pas besoin de spécifier la langue puisque prettyprint() devinera. Vous pouvez spécifier une langue en spécifiant l'extension de la langue ainsi que la classe de prettyprint comme ceci:

<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> 

Je ne vois pas lang-vb ou l'option lang-base. Est-ce que quelqu'un sait si un existe en tant que complément?


Note: Ceci est lié à la suggestion VB.NET code blocks pour débordement de la pile.

+0

Note: si vous avez besoin d'avoir la coloration syntaxique, utilisez '<- langue: lang-vb ->' – Laurel

Répondre

8

/EDIT: J'ai réécrit toute la publication. Voici une solution assez complète au problème de mise en surbrillance VB ci-dessous:

Si SO n'a rien de mieux, s'il vous plaît l'utiliser. La coloration de la syntaxe VB est définitivement souhaitée.

J'ai également ajouté un exemple de code avec des littéraux de code complexes qui sont mis en évidence correctement. Cependant, je n'ai même pas essayé d'obtenir XLinq correctement. Pourrait encore travailler, cependant. Le keywords list provient du MSDN. Les mots-clés contextuels ne sont pas inclus. Connaissiez-vous l'opérateur GetXmlNamespace?

L'algorithme connaît des caractères de type littéral. Il devrait également être capable de gérer les caractères de type identifiant mais je n'ai pas testé ceux-ci. Notez que le code fonctionne sur HTML. Par conséquent, &, <et> doivent être lus en tant qu'entités nommées (!), Pas en caractères uniques.

Désolé pour l'expression rationnelle longue.

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>"; 
} 

Code pour les essais:

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, cette question est maintenant fixe dans Prettify lui-même, mais pas mis en œuvre sur SO. –

+0

@Mark: Oui, je suis au courant de cela ... voir la discussion Uservoice. Mais comme vous l'avez dit, SO ne l'applique malheureusement toujours pas, et le rapport Uservoice a été refusé. –

0

En attendant, vous pouvez mettre un caractère supplémentaire de commentaires à la fin de vos commentaires pour l'obtenir à regarder bien.Par exemple:

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

Vous devez également échapper les caractères internes de commentaire dans la normale vb-mode:

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

Prettify traite toujours comme une chaîne littérale plutôt que d'un commentaire, mais au moins il semble d'accord.

Une autre méthode que j'ai vu est de commencer des commentaires avec un '// supplémentaire, comme ceci:

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

Ensuite, il est traité comme un commentaire, mais vous devez traiter avec des marqueurs de commentaire de style C

+0

Oui, mais dans ce cas, vous pouvez simplement utiliser "//". La raison pour laquelle les gens utilisent "'' //" est qu'elle ressemble à un commentaire ET qu'elle est compilée dans VB en tant que commentaire. – EndangeredMassa

+0

Puisque nous parlons de snippets vb, c'est probablement une bonne idée de s'assurer qu'ils seront au moins compilés lors de la copie/collage dans l'EDI. –

2

Prettify prend en charge les commentaires VB à partir du 8 janvier 2009.

Pour que la coloration de la syntaxe vb fonctionne correctement, vous avez besoin de trois choses;

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

et un bloc PRE autour de votre exemple de code:

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

Stackoverflow manque l'inclusion lang-vb.js, et la possibilité de spécifier quelle langue par Markdown, à savoir: class="prettyprint lang-vb" qui est pourquoi ça ne marche pas ici.

pour plus de détails sur la question: voir the Prettify issues log