2008-08-27 8 views
10

Kod Visual Basic nie renderuje się prawidłowo z prettify.js z Google.Czy istnieje opcja lang-vb lub lang-basic dla pliku prettify.js z Google?

na przepełnienie stosu:

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 

w Visual Studio ...

Visual Basic in Visual Studio

Znalazłem to w dokumencie README:

Jak mogę określić język mój kod jest?

Nie trzeba określać języka , ponieważ prettyprint() będzie odgadnąć. Ci można określić język, podając na rozszerzeniu język wraz z klasą prettyprint tak:

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

nie widzę lang-VB lub lang-podstawową opcję. Czy ktoś wie, czy istnieje jako dodatek?


Uwaga: Jest to związane z sugestią dotyczącą przepełnienia stosu w postaci VB.NET code blocks.

+0

Uwaga: jeśli chcesz mieć podświetlanie składni na SO, użyj '<- język: język-VB ->' – Laurel

Odpowiedz

8

/EDYCJA: Przepisałem całą wiadomość.

Poniżej znajduje się całkiem kompletne rozwiązanie problemu z podświetlaniem VB. Jeśli SO nie ma nic lepszego, użyj go. Podkreślanie składni VB jest zdecydowanie pożądane.

Dodałem również przykład kodu z pewnymi skomplikowanymi literałami, które zostaną podświetlone poprawnie. Jednak nie próbowałem nawet uzyskać poprawnego XLinqa. Może jednak nadal działa. Numer keywords list pochodzi z usługi MSDN. Słowa kluczowe kontekstowe nie są uwzględniane. Czy znasz operatora GetXmlNamespace?

Algorytm rozpoznaje znaki literowe. Powinien także być w stanie obsłużyć znaki typu identyfikatora, ale ich nie przetestowałem. Zauważ, że kod działa na HTML. W związku z tym wymagane są odczyty &, <i> jako nazwy (!), A nie pojedyncze znaki.

Przepraszamy za długie wyliczenie.

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

kod do testowania:

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, ten problem jest już ustalona w Prettify się, choć nie zaimplementowane na SO. –

+0

@ Mark: Tak, jestem tego świadomy ... zobacz dyskusję Uservoice. Ale jak powiedziałeś, SO niestety nadal nie implementuje go, a raport Uservoice został odrzucony. –

0

W międzyczasie można umieścić dodatkowy komentarz znak na końcu swoich uwag, aby dostać to wyglądać dobrze.Na przykład:

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

Należy również uciec wewnętrznych znaków komentarz w normalnym VB-mody:

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

prettify nadal traktuje ją jako ciąg dosłownym, a nie komentarz, ale przynajmniej to wygląda w porządku.

Inną metodą widziałem jest rozpoczęcie komentarzy z dodatkowym '//, tak:

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

to jest to traktowane jak komentarz, ale masz do czynienia ze znacznikami komentarza w stylu C

+0

Tak, ale w takim przypadku możesz po prostu użyć "//". Powodem, dla którego ludzie używają "" "//, jest to, że wygląda jak komentarz I kompiluje się w VB jako komentarz. – EndangeredMassa

+0

Ponieważ mówimy o fragmentach vb, prawdopodobnie dobrym pomysłem jest upewnienie się, że będą one co najmniej kompilowane podczas kopiowania/wklejania do IDE. –

2

Prettify obsługuje komentarze VB od 8 stycznia 2009.

Aby podświetlanie składni VB działało poprawnie, potrzebujesz trzech rzeczy;

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

i PRE blok wokół kodu np

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

Stackoverflow brakuje lang-vb.js integracji oraz zdolność do określić język poprzez promocji cenowych, a mianowicie: class="prettyprint lang-vb" dlatego to nie działa tutaj.

Szczegółowe informacje na ten temat patrz: the Prettify issues log

Powiązane problemy